UNPKG

@coolwallet/sol

Version:
239 lines (230 loc) 31.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.TransactionInstruction = exports.Transaction = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _error = require("@coolwallet/core/lib/error"); var stringUtil = _interopRequireWildcard(require("./stringUtil")); var _message = require("../message"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /** * List of TransactionInstruction object fields that may be initialized at construction */ /** * Transaction Instruction class */ var TransactionInstruction = exports.TransactionInstruction = /*#__PURE__*/function () { function TransactionInstruction(opts) { (0, _classCallCheck2["default"])(this, TransactionInstruction); /** * Public keys to include in this transaction * Boolean represents whether this pubkey needs to sign the transaction */ /** * Program Id to execute */ /** * Program input */ (0, _defineProperty2["default"])(this, "data", Buffer.alloc(0)); this.programId = opts.programId; this.keys = opts.keys; if (opts.data) { this.data = opts.data; } } /** * @internal */ return (0, _createClass2["default"])(TransactionInstruction, [{ key: "toJSON", value: function toJSON() { return { keys: this.keys.map(function (_ref) { var pubkey = _ref.pubkey, isSigner = _ref.isSigner, isWritable = _ref.isWritable; return { pubkey: stringUtil.toBase58(pubkey), isSigner: isSigner, isWritable: isWritable }; }), programId: this.programId.toJSON(), data: (0, _toConsumableArray2["default"])(this.data) }; } }]); }(); var Transaction = exports.Transaction = /*#__PURE__*/function () { function Transaction(tx) { (0, _classCallCheck2["default"])(this, Transaction); this.feePayer = stringUtil.formHex(tx.feePayer); this.recentBlockhash = stringUtil.formHex(tx.recentBlockhash); this.instructions = tx.instructions.map(function (instruction) { return _objectSpread(_objectSpread({}, instruction), {}, { programId: stringUtil.formHex(instruction.programId), accounts: instruction.accounts.map(function (account) { return _objectSpread(_objectSpread({}, account), {}, { pubkey: stringUtil.formHex(account.pubkey) }); }) }); }); } return (0, _createClass2["default"])(Transaction, [{ key: "add", value: function add(instruction) { this.instructions.push(instruction); } /** * Compile transaction data */ }, { key: "compileMessage", value: function compileMessage() { var recentBlockhash = this.recentBlockhash; if (!recentBlockhash) { throw new _error.SDKError(this.compileMessage.name, 'Transaction recentBlockhash required'); } if (this.instructions.length < 1) { console.warn('No instructions provided'); } var feePayer; if (this.feePayer) { feePayer = this.feePayer; } else { throw new Error('Transaction fee payer required'); } for (var i = 0; i < this.instructions.length; i++) { if (this.instructions[i].programId === undefined) { throw new Error("Transaction instruction index ".concat(i, " has undefined program id")); } } var programIds = []; var accountMetas = []; this.instructions.forEach(function (instruction) { instruction.accounts.forEach(function (accountMeta) { accountMetas.push(_objectSpread({}, accountMeta)); }); var programId = instruction.programId.toString(); if (!programIds.includes(programId)) { programIds.push(programId); } }); // Append programID account metas programIds.forEach(function (programId) { accountMetas.push({ pubkey: programId, isSigner: false, isWritable: false }); }); // Sort. Prioritizing first by signer, then by writable accountMetas.sort(function (x, y) { var pubkeySorting = stringUtil.toBase58(x.pubkey).localeCompare(stringUtil.toBase58(y.pubkey)); var checkSigner = x.isSigner === y.isSigner ? 0 : x.isSigner ? -1 : 1; var checkWritable = x.isWritable === y.isWritable ? pubkeySorting : x.isWritable ? -1 : 1; return checkSigner || checkWritable; }); // Cull duplicate account metas var uniqueMetas = []; accountMetas.forEach(function (accountMeta) { var uniqueIndex = uniqueMetas.findIndex(function (x) { return x.pubkey === accountMeta.pubkey; }); if (uniqueIndex > -1) { uniqueMetas[uniqueIndex].isWritable = uniqueMetas[uniqueIndex].isWritable || accountMeta.isWritable; } else { uniqueMetas.push(accountMeta); } }); // Move fee payer to the front var feePayerIndex = uniqueMetas.findIndex(function (x) { return stringUtil.toPublicKey(x.pubkey) === feePayer; }); if (feePayerIndex > -1) { var _uniqueMetas$splice = uniqueMetas.splice(feePayerIndex, 1), _uniqueMetas$splice2 = (0, _slicedToArray2["default"])(_uniqueMetas$splice, 1), payerMeta = _uniqueMetas$splice2[0]; payerMeta.isSigner = true; payerMeta.isWritable = true; uniqueMetas.unshift(payerMeta); } else { uniqueMetas.unshift({ pubkey: feePayer, isSigner: true, isWritable: true }); } var numRequiredSignatures = 0; var numReadonlySignedAccounts = 0; var numReadonlyUnsignedAccounts = 0; // Split out signing from non-signing keys and count header values var signedKeys = []; var unsignedKeys = []; uniqueMetas.forEach(function (_ref2) { var pubkey = _ref2.pubkey, isSigner = _ref2.isSigner, isWritable = _ref2.isWritable; if (isSigner) { signedKeys.push(pubkey.toString()); numRequiredSignatures += 1; if (!isWritable) { numReadonlySignedAccounts += 1; } } else { unsignedKeys.push(pubkey.toString()); if (!isWritable) { numReadonlyUnsignedAccounts += 1; } } }); var accountKeys = signedKeys.concat(unsignedKeys); var instructions = this.instructions.map(function (instruction) { var data = instruction.data, programId = instruction.programId; return { programIdIndex: accountKeys.indexOf(programId.toString()), accounts: instruction.accounts.map(function (meta) { return accountKeys.indexOf(meta.pubkey.toString()); }), data: stringUtil.formHex(data) }; }); return new _message.Message({ header: { numRequiredSignatures: numRequiredSignatures, numReadonlySignedAccounts: numReadonlySignedAccounts, numReadonlyUnsignedAccounts: numReadonlyUnsignedAccounts }, accountKeys: accountKeys, recentBlockhash: recentBlockhash, instructions: instructions }); } /** * Return sendable tx string with given signature. * * @param signature signature generated by CoolWallet Pro * @returns */ }, { key: "toTxString", value: function toTxString(signature) { this.signature = signature; return '01' + this.signature + Buffer.from(this.compileMessage().serialize()).toString('hex'); } }]); }(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXJyb3IiLCJyZXF1aXJlIiwic3RyaW5nVXRpbCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX21lc3NhZ2UiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJUcmFuc2FjdGlvbkluc3RydWN0aW9uIiwiZXhwb3J0cyIsIm9wdHMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiQnVmZmVyIiwiYWxsb2MiLCJwcm9ncmFtSWQiLCJkYXRhIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwidG9KU09OIiwibWFwIiwiX3JlZiIsInB1YmtleSIsImlzU2lnbmVyIiwiaXNXcml0YWJsZSIsInRvQmFzZTU4IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsIlRyYW5zYWN0aW9uIiwidHgiLCJmZWVQYXllciIsImZvcm1IZXgiLCJyZWNlbnRCbG9ja2hhc2giLCJpbnN0cnVjdGlvbnMiLCJpbnN0cnVjdGlvbiIsImFjY291bnRzIiwiYWNjb3VudCIsImFkZCIsImNvbXBpbGVNZXNzYWdlIiwiU0RLRXJyb3IiLCJuYW1lIiwiY29uc29sZSIsIndhcm4iLCJFcnJvciIsInVuZGVmaW5lZCIsImNvbmNhdCIsInByb2dyYW1JZHMiLCJhY2NvdW50TWV0YXMiLCJhY2NvdW50TWV0YSIsInRvU3RyaW5nIiwiaW5jbHVkZXMiLCJzb3J0IiwieCIsInkiLCJwdWJrZXlTb3J0aW5nIiwibG9jYWxlQ29tcGFyZSIsImNoZWNrU2lnbmVyIiwiY2hlY2tXcml0YWJsZSIsInVuaXF1ZU1ldGFzIiwidW5pcXVlSW5kZXgiLCJmaW5kSW5kZXgiLCJmZWVQYXllckluZGV4IiwidG9QdWJsaWNLZXkiLCJfdW5pcXVlTWV0YXMkc3BsaWNlIiwic3BsaWNlIiwiX3VuaXF1ZU1ldGFzJHNwbGljZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJwYXllck1ldGEiLCJ1bnNoaWZ0IiwibnVtUmVxdWlyZWRTaWduYXR1cmVzIiwibnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyIsIm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyIsInNpZ25lZEtleXMiLCJ1bnNpZ25lZEtleXMiLCJfcmVmMiIsImFjY291bnRLZXlzIiwicHJvZ3JhbUlkSW5kZXgiLCJpbmRleE9mIiwibWV0YSIsIk1lc3NhZ2UiLCJoZWFkZXIiLCJ0b1R4U3RyaW5nIiwic2lnbmF0dXJlIiwiZnJvbSIsInNlcmlhbGl6ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9UcmFuc2FjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTREtFcnJvciB9IGZyb20gJ0Bjb29sd2FsbGV0L2NvcmUvbGliL2Vycm9yJztcbmltcG9ydCAqIGFzIHN0cmluZ1V0aWwgZnJvbSAnLi9zdHJpbmdVdGlsJztcbmltcG9ydCAqIGFzIHR5cGVzIGZyb20gJy4uL2NvbmZpZy90eXBlcyc7XG5pbXBvcnQgeyBQdWJsaWNLZXkgfSBmcm9tICcuL3B1YmxpY2tleSc7XG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnLi4vbWVzc2FnZSc7XG5cbi8qKlxuICogTGlzdCBvZiBUcmFuc2FjdGlvbkluc3RydWN0aW9uIG9iamVjdCBmaWVsZHMgdGhhdCBtYXkgYmUgaW5pdGlhbGl6ZWQgYXQgY29uc3RydWN0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25DdG9yRmllbGRzID0ge1xuICBrZXlzOiBBcnJheTx0eXBlcy5BY2NvdW50TWV0YT47XG4gIHByb2dyYW1JZDogUHVibGljS2V5O1xuICBkYXRhPzogQnVmZmVyO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkluc3RydWN0aW9uSlNPTiB7XG4gIGtleXM6IHtcbiAgICBwdWJrZXk6IHN0cmluZztcbiAgICBpc1NpZ25lcjogYm9vbGVhbjtcbiAgICBpc1dyaXRhYmxlOiBib29sZWFuO1xuICB9W107XG4gIHByb2dyYW1JZDogc3RyaW5nO1xuICBkYXRhOiBudW1iZXJbXTtcbn1cblxuLyoqXG4gKiBUcmFuc2FjdGlvbiBJbnN0cnVjdGlvbiBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbiB7XG4gIC8qKlxuICAgKiBQdWJsaWMga2V5cyB0byBpbmNsdWRlIGluIHRoaXMgdHJhbnNhY3Rpb25cbiAgICogQm9vbGVhbiByZXByZXNlbnRzIHdoZXRoZXIgdGhpcyBwdWJrZXkgbmVlZHMgdG8gc2lnbiB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIGtleXM6IEFycmF5PHR5cGVzLkFjY291bnRNZXRhPjtcblxuICAvKipcbiAgICogUHJvZ3JhbSBJZCB0byBleGVjdXRlXG4gICAqL1xuICBwcm9ncmFtSWQ6IFB1YmxpY0tleTtcblxuICAvKipcbiAgICogUHJvZ3JhbSBpbnB1dFxuICAgKi9cbiAgZGF0YTogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuXG4gIGNvbnN0cnVjdG9yKG9wdHM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25DdG9yRmllbGRzKSB7XG4gICAgdGhpcy5wcm9ncmFtSWQgPSBvcHRzLnByb2dyYW1JZDtcbiAgICB0aGlzLmtleXMgPSBvcHRzLmtleXM7XG4gICAgaWYgKG9wdHMuZGF0YSkge1xuICAgICAgdGhpcy5kYXRhID0gb3B0cy5kYXRhO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHRvSlNPTigpOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleXM6IHRoaXMua2V5cy5tYXAoKHsgcHVia2V5LCBpc1NpZ25lciwgaXNXcml0YWJsZSB9KSA9PiAoe1xuICAgICAgICBwdWJrZXk6IHN0cmluZ1V0aWwudG9CYXNlNTgocHVia2V5KSxcbiAgICAgICAgaXNTaWduZXIsXG4gICAgICAgIGlzV3JpdGFibGUsXG4gICAgICB9KSksXG4gICAgICBwcm9ncmFtSWQ6IHRoaXMucHJvZ3JhbUlkLnRvSlNPTigpLFxuICAgICAgZGF0YTogWy4uLnRoaXMuZGF0YV0sXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24ge1xuICBmZWVQYXllcjogc3RyaW5nO1xuICByZWNlbnRCbG9ja2hhc2g6IHN0cmluZztcbiAgaW5zdHJ1Y3Rpb25zOiB0eXBlcy5UcmFuc2FjdGlvbkluc3RydWN0aW9uW107XG4gIHNpZ25hdHVyZT86IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih0eDogdHlwZXMuVHJhbnNhY3Rpb25BcmdzKSB7XG4gICAgdGhpcy5mZWVQYXllciA9IHN0cmluZ1V0aWwuZm9ybUhleCh0eC5mZWVQYXllcik7XG4gICAgdGhpcy5yZWNlbnRCbG9ja2hhc2ggPSBzdHJpbmdVdGlsLmZvcm1IZXgodHgucmVjZW50QmxvY2toYXNoKTtcbiAgICB0aGlzLmluc3RydWN0aW9ucyA9IHR4Lmluc3RydWN0aW9ucy5tYXAoKGluc3RydWN0aW9uKSA9PiAoe1xuICAgICAgLi4uaW5zdHJ1Y3Rpb24sXG4gICAgICBwcm9ncmFtSWQ6IHN0cmluZ1V0aWwuZm9ybUhleChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpLFxuICAgICAgYWNjb3VudHM6IGluc3RydWN0aW9uLmFjY291bnRzLm1hcCgoYWNjb3VudCkgPT4gKHtcbiAgICAgICAgLi4uYWNjb3VudCxcbiAgICAgICAgcHVia2V5OiBzdHJpbmdVdGlsLmZvcm1IZXgoYWNjb3VudC5wdWJrZXkpLFxuICAgICAgfSkpLFxuICAgIH0pKTtcbiAgfVxuXG4gIGFkZChpbnN0cnVjdGlvbjogdHlwZXMuVHJhbnNhY3Rpb25JbnN0cnVjdGlvbikge1xuICAgIHRoaXMuaW5zdHJ1Y3Rpb25zLnB1c2goaW5zdHJ1Y3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBpbGUgdHJhbnNhY3Rpb24gZGF0YVxuICAgKi9cbiAgY29tcGlsZU1lc3NhZ2UoKTogTWVzc2FnZSB7XG4gICAgY29uc3QgeyByZWNlbnRCbG9ja2hhc2ggfSA9IHRoaXM7XG4gICAgaWYgKCFyZWNlbnRCbG9ja2hhc2gpIHtcbiAgICAgIHRocm93IG5ldyBTREtFcnJvcih0aGlzLmNvbXBpbGVNZXNzYWdlLm5hbWUsICdUcmFuc2FjdGlvbiByZWNlbnRCbG9ja2hhc2ggcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoIDwgMSkge1xuICAgICAgY29uc29sZS53YXJuKCdObyBpbnN0cnVjdGlvbnMgcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBsZXQgZmVlUGF5ZXI6IHN0cmluZztcbiAgICBpZiAodGhpcy5mZWVQYXllcikge1xuICAgICAgZmVlUGF5ZXIgPSB0aGlzLmZlZVBheWVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIGZlZSBwYXllciByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmluc3RydWN0aW9uc1tpXS5wcm9ncmFtSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyYW5zYWN0aW9uIGluc3RydWN0aW9uIGluZGV4ICR7aX0gaGFzIHVuZGVmaW5lZCBwcm9ncmFtIGlkYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZ3JhbUlkczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBhY2NvdW50TWV0YXM6IHR5cGVzLkFjY291bnRNZXRhW10gPSBbXTtcbiAgICB0aGlzLmluc3RydWN0aW9ucy5mb3JFYWNoKChpbnN0cnVjdGlvbikgPT4ge1xuICAgICAgaW5zdHJ1Y3Rpb24uYWNjb3VudHMuZm9yRWFjaCgoYWNjb3VudE1ldGEpID0+IHtcbiAgICAgICAgYWNjb3VudE1ldGFzLnB1c2goeyAuLi5hY2NvdW50TWV0YSB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcm9ncmFtSWQgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICAgIGlmICghcHJvZ3JhbUlkcy5pbmNsdWRlcyhwcm9ncmFtSWQpKSB7XG4gICAgICAgIHByb2dyYW1JZHMucHVzaChwcm9ncmFtSWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQXBwZW5kIHByb2dyYW1JRCBhY2NvdW50IG1ldGFzXG4gICAgcHJvZ3JhbUlkcy5mb3JFYWNoKChwcm9ncmFtSWQpID0+IHtcbiAgICAgIGFjY291bnRNZXRhcy5wdXNoKHtcbiAgICAgICAgcHVia2V5OiBwcm9ncmFtSWQsXG4gICAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgICAgaXNXcml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFNvcnQuIFByaW9yaXRpemluZyBmaXJzdCBieSBzaWduZXIsIHRoZW4gYnkgd3JpdGFibGVcbiAgICBhY2NvdW50TWV0YXMuc29ydChmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgY29uc3QgcHVia2V5U29ydGluZyA9IHN0cmluZ1V0aWwudG9CYXNlNTgoeC5wdWJrZXkpLmxvY2FsZUNvbXBhcmUoc3RyaW5nVXRpbC50b0Jhc2U1OCh5LnB1YmtleSkpO1xuICAgICAgY29uc3QgY2hlY2tTaWduZXIgPSB4LmlzU2lnbmVyID09PSB5LmlzU2lnbmVyID8gMCA6IHguaXNTaWduZXIgPyAtMSA6IDE7XG4gICAgICBjb25zdCBjaGVja1dyaXRhYmxlID0geC5pc1dyaXRhYmxlID09PSB5LmlzV3JpdGFibGUgPyBwdWJrZXlTb3J0aW5nIDogeC5pc1dyaXRhYmxlID8gLTEgOiAxO1xuICAgICAgcmV0dXJuIGNoZWNrU2lnbmVyIHx8IGNoZWNrV3JpdGFibGU7XG4gICAgfSk7XG5cbiAgICAvLyBDdWxsIGR1cGxpY2F0ZSBhY2NvdW50IG1ldGFzXG4gICAgY29uc3QgdW5pcXVlTWV0YXM6IHR5cGVzLkFjY291bnRNZXRhW10gPSBbXTtcbiAgICBhY2NvdW50TWV0YXMuZm9yRWFjaCgoYWNjb3VudE1ldGEpID0+IHtcbiAgICAgIGNvbnN0IHVuaXF1ZUluZGV4ID0gdW5pcXVlTWV0YXMuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4LnB1YmtleSA9PT0gYWNjb3VudE1ldGEucHVia2V5O1xuICAgICAgfSk7XG4gICAgICBpZiAodW5pcXVlSW5kZXggPiAtMSkge1xuICAgICAgICB1bmlxdWVNZXRhc1t1bmlxdWVJbmRleF0uaXNXcml0YWJsZSA9IHVuaXF1ZU1ldGFzW3VuaXF1ZUluZGV4XS5pc1dyaXRhYmxlIHx8IGFjY291bnRNZXRhLmlzV3JpdGFibGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bmlxdWVNZXRhcy5wdXNoKGFjY291bnRNZXRhKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE1vdmUgZmVlIHBheWVyIHRvIHRoZSBmcm9udFxuICAgIGNvbnN0IGZlZVBheWVySW5kZXggPSB1bmlxdWVNZXRhcy5maW5kSW5kZXgoKHgpID0+IHtcbiAgICAgIHJldHVybiBzdHJpbmdVdGlsLnRvUHVibGljS2V5KHgucHVia2V5KSA9PT0gZmVlUGF5ZXI7XG4gICAgfSk7XG4gICAgaWYgKGZlZVBheWVySW5kZXggPiAtMSkge1xuICAgICAgY29uc3QgW3BheWVyTWV0YV0gPSB1bmlxdWVNZXRhcy5zcGxpY2UoZmVlUGF5ZXJJbmRleCwgMSk7XG4gICAgICBwYXllck1ldGEuaXNTaWduZXIgPSB0cnVlO1xuICAgICAgcGF5ZXJNZXRhLmlzV3JpdGFibGUgPSB0cnVlO1xuICAgICAgdW5pcXVlTWV0YXMudW5zaGlmdChwYXllck1ldGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bmlxdWVNZXRhcy51bnNoaWZ0KHtcbiAgICAgICAgcHVia2V5OiBmZWVQYXllcixcbiAgICAgICAgaXNTaWduZXI6IHRydWUsXG4gICAgICAgIGlzV3JpdGFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgbnVtUmVxdWlyZWRTaWduYXR1cmVzID0gMDtcbiAgICBsZXQgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyA9IDA7XG4gICAgbGV0IG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyA9IDA7XG5cbiAgICAvLyBTcGxpdCBvdXQgc2lnbmluZyBmcm9tIG5vbi1zaWduaW5nIGtleXMgYW5kIGNvdW50IGhlYWRlciB2YWx1ZXNcbiAgICBjb25zdCBzaWduZWRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHVuc2lnbmVkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICB1bmlxdWVNZXRhcy5mb3JFYWNoKCh7IHB1YmtleSwgaXNTaWduZXIsIGlzV3JpdGFibGUgfSkgPT4ge1xuICAgICAgaWYgKGlzU2lnbmVyKSB7XG4gICAgICAgIHNpZ25lZEtleXMucHVzaChwdWJrZXkudG9TdHJpbmcoKSk7XG4gICAgICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlcyArPSAxO1xuICAgICAgICBpZiAoIWlzV3JpdGFibGUpIHtcbiAgICAgICAgICBudW1SZWFkb25seVNpZ25lZEFjY291bnRzICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVuc2lnbmVkS2V5cy5wdXNoKHB1YmtleS50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKCFpc1dyaXRhYmxlKSB7XG4gICAgICAgICAgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGFjY291bnRLZXlzID0gc2lnbmVkS2V5cy5jb25jYXQodW5zaWduZWRLZXlzKTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnM6IHR5cGVzLkNvbXBsaWVkSW5zdHJ1Y3Rpb25bXSA9IHRoaXMuaW5zdHJ1Y3Rpb25zLm1hcCgoaW5zdHJ1Y3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IHsgZGF0YSwgcHJvZ3JhbUlkIH0gPSBpbnN0cnVjdGlvbjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiBhY2NvdW50S2V5cy5pbmRleE9mKHByb2dyYW1JZC50b1N0cmluZygpKSxcbiAgICAgICAgYWNjb3VudHM6IGluc3RydWN0aW9uLmFjY291bnRzLm1hcCgobWV0YSkgPT4gYWNjb3VudEtleXMuaW5kZXhPZihtZXRhLnB1YmtleS50b1N0cmluZygpKSksXG4gICAgICAgIGRhdGE6IHN0cmluZ1V0aWwuZm9ybUhleChkYXRhKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IE1lc3NhZ2Uoe1xuICAgICAgaGVhZGVyOiB7XG4gICAgICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlcyxcbiAgICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyxcbiAgICAgICAgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzLFxuICAgICAgfSxcbiAgICAgIGFjY291bnRLZXlzLFxuICAgICAgcmVjZW50QmxvY2toYXNoLFxuICAgICAgaW5zdHJ1Y3Rpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBzZW5kYWJsZSB0eCBzdHJpbmcgd2l0aCBnaXZlbiBzaWduYXR1cmUuXG4gICAqXG4gICAqIEBwYXJhbSBzaWduYXR1cmUgc2lnbmF0dXJlIGdlbmVyYXRlZCBieSBDb29sV2FsbGV0IFByb1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgdG9UeFN0cmluZyhzaWduYXR1cmU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdGhpcy5zaWduYXR1cmUgPSBzaWduYXR1cmU7XG4gICAgcmV0dXJuICcwMScgKyB0aGlzLnNpZ25hdHVyZSArIEJ1ZmZlci5mcm9tKHRoaXMuY29tcGlsZU1lc3NhZ2UoKS5zZXJpYWxpemUoKSkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFDLHVCQUFBLENBQUFGLE9BQUE7QUFHQSxJQUFBRyxRQUFBLEdBQUFILE9BQUE7QUFBcUMsU0FBQUkseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFILHdCQUFBRyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFHLEdBQUEsQ0FBQU4sQ0FBQSxVQUFBRyxDQUFBLENBQUFJLEdBQUEsQ0FBQVAsQ0FBQSxPQUFBUSxDQUFBLEtBQUFDLFNBQUEsVUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxDQUFBLElBQUFkLENBQUEsb0JBQUFjLENBQUEsT0FBQUMsY0FBQSxDQUFBQyxJQUFBLENBQUFoQixDQUFBLEVBQUFjLENBQUEsU0FBQUcsQ0FBQSxHQUFBUCxDQUFBLEdB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