UNPKG

@coolwallet/sol

Version:
234 lines (233 loc) 51.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.MessageV0 = void 0; 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 _bs = _interopRequireDefault(require("bs58")); var BufferLayout = _interopRequireWildcard(require("@solana/buffer-layout")); var _publickey = require("../utils/publickey"); var shortvec = _interopRequireWildcard(require("../utils/shortvec-encoding")); var _assert = _interopRequireDefault(require("../utils/assert")); var _params = require("../config/params"); var _commonLayout = require("../utils/commonLayout"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } /** * Message constructor arguments */ var MessageV0 = /*#__PURE__*/function () { function MessageV0(args) { (0, _classCallCheck2["default"])(this, MessageV0); this.header = args.header; this.staticAccountKeys = args.staticAccountKeys; this.recentBlockhash = args.recentBlockhash; this.compiledInstructions = args.compiledInstructions; this.addressTableLookups = args.addressTableLookups; } (0, _createClass2["default"])(MessageV0, [{ key: "version", get: function get() { return 0; } }, { key: "numAccountKeysFromLookups", get: function get() { var count = 0; var _iterator = _createForOfIteratorHelper(this.addressTableLookups), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var lookup = _step.value; count += lookup.readonlyIndexes.length + lookup.writableIndexes.length; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return count; } }, { key: "isAccountSigner", value: function isAccountSigner(index) { return index < this.header.numRequiredSignatures; } }, { key: "isAccountWritable", value: function isAccountWritable(index) { var numSignedAccounts = this.header.numRequiredSignatures; var numStaticAccountKeys = this.staticAccountKeys.length; if (index >= numStaticAccountKeys) { var lookupAccountKeysIndex = index - numStaticAccountKeys; var numWritableLookupAccountKeys = this.addressTableLookups.reduce(function (count, lookup) { return count + lookup.writableIndexes.length; }, 0); return lookupAccountKeysIndex < numWritableLookupAccountKeys; } else if (index >= this.header.numRequiredSignatures) { var unsignedAccountIndex = index - numSignedAccounts; var numUnsignedAccounts = numStaticAccountKeys - numSignedAccounts; var numWritableUnsignedAccounts = numUnsignedAccounts - this.header.numReadonlyUnsignedAccounts; return unsignedAccountIndex < numWritableUnsignedAccounts; } else { var numWritableSignedAccounts = numSignedAccounts - this.header.numReadonlySignedAccounts; return index < numWritableSignedAccounts; } } }, { key: "serialize", value: function serialize() { var encodedStaticAccountKeysLength = Array(); shortvec.encodeLength(encodedStaticAccountKeysLength, this.staticAccountKeys.length); var serializedInstructions = this.serializeInstructions(); var encodedInstructionsLength = Array(); shortvec.encodeLength(encodedInstructionsLength, this.compiledInstructions.length); var serializedAddressTableLookups = this.serializeAddressTableLookups(); var encodedAddressTableLookupsLength = Array(); shortvec.encodeLength(encodedAddressTableLookupsLength, this.addressTableLookups.length); var messageLayout = BufferLayout.struct([BufferLayout.u8('prefix'), BufferLayout.struct([BufferLayout.u8('numRequiredSignatures'), BufferLayout.u8('numReadonlySignedAccounts'), BufferLayout.u8('numReadonlyUnsignedAccounts')], 'header'), BufferLayout.blob(encodedStaticAccountKeysLength.length, 'staticAccountKeysLength'), BufferLayout.seq((0, _commonLayout.publicKey)(), this.staticAccountKeys.length, 'staticAccountKeys'), (0, _commonLayout.publicKey)('recentBlockhash'), BufferLayout.blob(encodedInstructionsLength.length, 'instructionsLength'), BufferLayout.blob(serializedInstructions.length, 'serializedInstructions'), BufferLayout.blob(encodedAddressTableLookupsLength.length, 'addressTableLookupsLength'), BufferLayout.blob(serializedAddressTableLookups.length, 'serializedAddressTableLookups')]); var serializedMessage = new Uint8Array(_params.PACKET_DATA_SIZE); var MESSAGE_VERSION_0_PREFIX = 1 << 7; var serializedMessageLength = messageLayout.encode({ prefix: MESSAGE_VERSION_0_PREFIX, header: this.header, staticAccountKeysLength: new Uint8Array(encodedStaticAccountKeysLength), staticAccountKeys: this.staticAccountKeys.map(function (key) { return key.toBytes(); }), recentBlockhash: _bs["default"].decode(this.recentBlockhash), instructionsLength: new Uint8Array(encodedInstructionsLength), serializedInstructions: serializedInstructions, addressTableLookupsLength: new Uint8Array(encodedAddressTableLookupsLength), serializedAddressTableLookups: serializedAddressTableLookups }, serializedMessage); return serializedMessage.slice(0, serializedMessageLength); } }, { key: "serializeInstructions", value: function serializeInstructions() { var serializedLength = 0; var serializedInstructions = new Uint8Array(_params.PACKET_DATA_SIZE); var _iterator2 = _createForOfIteratorHelper(this.compiledInstructions), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var instruction = _step2.value; var encodedAccountKeyIndexesLength = Array(); shortvec.encodeLength(encodedAccountKeyIndexesLength, instruction.accountKeyIndexes.length); var encodedDataLength = Array(); shortvec.encodeLength(encodedDataLength, instruction.data.length); var instructionLayout = BufferLayout.struct([BufferLayout.u8('programIdIndex'), BufferLayout.blob(encodedAccountKeyIndexesLength.length, 'encodedAccountKeyIndexesLength'), BufferLayout.seq(BufferLayout.u8(), instruction.accountKeyIndexes.length, 'accountKeyIndexes'), BufferLayout.blob(encodedDataLength.length, 'encodedDataLength'), BufferLayout.blob(instruction.data.length, 'data')]); serializedLength += instructionLayout.encode({ programIdIndex: instruction.programIdIndex, encodedAccountKeyIndexesLength: new Uint8Array(encodedAccountKeyIndexesLength), accountKeyIndexes: instruction.accountKeyIndexes, encodedDataLength: new Uint8Array(encodedDataLength), data: instruction.data }, serializedInstructions, serializedLength); } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } return serializedInstructions.slice(0, serializedLength); } }, { key: "serializeAddressTableLookups", value: function serializeAddressTableLookups() { var serializedLength = 0; var serializedAddressTableLookups = new Uint8Array(_params.PACKET_DATA_SIZE); var _iterator3 = _createForOfIteratorHelper(this.addressTableLookups), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var lookup = _step3.value; var encodedWritableIndexesLength = Array(); shortvec.encodeLength(encodedWritableIndexesLength, lookup.writableIndexes.length); var encodedReadonlyIndexesLength = Array(); shortvec.encodeLength(encodedReadonlyIndexesLength, lookup.readonlyIndexes.length); var addressTableLookupLayout = BufferLayout.struct([(0, _commonLayout.publicKey)('accountKey'), BufferLayout.blob(encodedWritableIndexesLength.length, 'encodedWritableIndexesLength'), BufferLayout.seq(BufferLayout.u8(), lookup.writableIndexes.length, 'writableIndexes'), BufferLayout.blob(encodedReadonlyIndexesLength.length, 'encodedReadonlyIndexesLength'), BufferLayout.seq(BufferLayout.u8(), lookup.readonlyIndexes.length, 'readonlyIndexes')]); serializedLength += addressTableLookupLayout.encode({ accountKey: lookup.accountKey.toBytes(), encodedWritableIndexesLength: new Uint8Array(encodedWritableIndexesLength), writableIndexes: lookup.writableIndexes, encodedReadonlyIndexesLength: new Uint8Array(encodedReadonlyIndexesLength), readonlyIndexes: lookup.readonlyIndexes }, serializedAddressTableLookups, serializedLength); } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } return serializedAddressTableLookups.slice(0, serializedLength); } }], [{ key: "deserialize", value: function deserialize(serializedMessage) { var byteArray = (0, _toConsumableArray2["default"])(serializedMessage); var prefix = byteArray.shift(); var maskedPrefix = prefix & _params.VERSION_PREFIX_MASK; (0, _assert["default"])(prefix !== maskedPrefix, "Expected versioned message but received legacy message"); var version = maskedPrefix; (0, _assert["default"])(version === 0, "Expected versioned message with version 0 but found version ".concat(version)); var header = { numRequiredSignatures: byteArray.shift(), numReadonlySignedAccounts: byteArray.shift(), numReadonlyUnsignedAccounts: byteArray.shift() }; var staticAccountKeys = []; var staticAccountKeysLength = shortvec.decodeLength(byteArray); for (var i = 0; i < staticAccountKeysLength; i++) { staticAccountKeys.push(new _publickey.PublicKey(byteArray.splice(0, _publickey.PUBLIC_KEY_LENGTH))); } var recentBlockhash = _bs["default"].encode(byteArray.splice(0, _publickey.PUBLIC_KEY_LENGTH)); var instructionCount = shortvec.decodeLength(byteArray); var compiledInstructions = []; for (var _i = 0; _i < instructionCount; _i++) { var programIdIndex = byteArray.shift(); var accountKeyIndexesLength = shortvec.decodeLength(byteArray); var accountKeyIndexes = byteArray.splice(0, accountKeyIndexesLength); var dataLength = shortvec.decodeLength(byteArray); var data = new Uint8Array(byteArray.splice(0, dataLength)); compiledInstructions.push({ programIdIndex: programIdIndex, accountKeyIndexes: accountKeyIndexes, data: data }); } var addressTableLookupsCount = shortvec.decodeLength(byteArray); var addressTableLookups = []; for (var _i2 = 0; _i2 < addressTableLookupsCount; _i2++) { var accountKey = new _publickey.PublicKey(byteArray.splice(0, _publickey.PUBLIC_KEY_LENGTH)); var writableIndexesLength = shortvec.decodeLength(byteArray); var writableIndexes = byteArray.splice(0, writableIndexesLength); var readonlyIndexesLength = shortvec.decodeLength(byteArray); var readonlyIndexes = byteArray.splice(0, readonlyIndexesLength); addressTableLookups.push({ accountKey: accountKey, writableIndexes: writableIndexes, readonlyIndexes: readonlyIndexes }); } return new MessageV0({ header: header, staticAccountKeys: staticAccountKeys, recentBlockhash: recentBlockhash, compiledInstructions: compiledInstructions, addressTableLookups: addressTableLookups }); } }]); return MessageV0; }(); exports.MessageV0 = MessageV0; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYnMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIkJ1ZmZlckxheW91dCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX3B1YmxpY2tleSIsInNob3J0dmVjIiwiX2Fzc2VydCIsIl9wYXJhbXMiLCJfY29tbW9uTGF5b3V0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwibyIsImFsbG93QXJyYXlMaWtlIiwiaXQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsImkiLCJGIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJlIiwiX2UiLCJmIiwiVHlwZUVycm9yIiwibm9ybWFsQ29tcGxldGlvbiIsImRpZEVyciIsImVyciIsInN0ZXAiLCJuZXh0IiwiX2UyIiwibWluTGVuIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJhcnIiLCJsZW4iLCJhcnIyIiwiTWVzc2FnZVYwIiwiYXJncyIsIl9jbGFzc0NhbGxDaGVjazIiLCJoZWFkZXIiLCJzdGF0aWNBY2NvdW50S2V5cyIsInJlY2VudEJsb2NraGFzaCIsImNvbXBpbGVkSW5zdHJ1Y3Rpb25zIiwiYWRkcmVzc1RhYmxlTG9va3VwcyIsIl9jcmVhdGVDbGFzczIiLCJjb3VudCIsIl9pdGVyYXRvciIsIl9zdGVwIiwibG9va3VwIiwicmVhZG9ubHlJbmRleGVzIiwid3JpdGFibGVJbmRleGVzIiwiaXNBY2NvdW50U2lnbmVyIiwiaW5kZXgiLCJudW1SZXF1aXJlZFNpZ25hdHVyZXMiLCJpc0FjY291bnRXcml0YWJsZSIsIm51bVNpZ25lZEFjY291bnRzIiwibnVtU3RhdGljQWNjb3VudEtleXMiLCJsb29rdXBBY2NvdW50S2V5c0luZGV4IiwibnVtV3JpdGFibGVMb29rdXBBY2NvdW50S2V5cyIsInJlZHVjZSIsInVuc2lnbmVkQWNjb3VudEluZGV4IiwibnVtVW5zaWduZWRBY2NvdW50cyIsIm51bVdyaXRhYmxlVW5zaWduZWRBY2NvdW50cyIsIm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyIsIm51bVdyaXRhYmxlU2lnbmVkQWNjb3VudHMiLCJudW1SZWFkb25seVNpZ25lZEFjY291bnRzIiwic2VyaWFsaXplIiwiZW5jb2RlZFN0YXRpY0FjY291bnRLZXlzTGVuZ3RoIiwiZW5jb2RlTGVuZ3RoIiwic2VyaWFsaXplZEluc3RydWN0aW9ucyIsInNlcmlhbGl6ZUluc3RydWN0aW9ucyIsImVuY29kZWRJbnN0cnVjdGlvbnNMZW5ndGgiLCJzZXJpYWxpemVkQWRkcmVzc1RhYmxlTG9va3VwcyIsInNlcmlhbGl6ZUFkZHJlc3NUYWJsZUxvb2t1cHMiLCJlbmNvZGVkQWRkcmVzc1RhYmxlTG9va3Vwc0xlbmd0aCIsIm1lc3NhZ2VMYXlvdXQiLCJzdHJ1Y3QiLCJ1OCIsImJsb2IiLCJzZXEiLCJwdWJsaWNLZXkiLCJzZXJpYWxpemVkTWVzc2FnZSIsIlVpbnQ4QXJyYXkiLCJQQUNLRVRfREFUQV9TSVpFIiwiTUVTU0FHRV9WRVJTSU9OXzBfUFJFRklYIiwic2VyaWFsaXplZE1lc3NhZ2VMZW5ndGgiLCJlbmNvZGUiLCJwcmVmaXgiLCJzdGF0aWNBY2NvdW50S2V5c0xlbmd0aCIsIm1hcCIsInRvQnl0ZXMiLCJiczU4IiwiZGVjb2RlIiwiaW5zdHJ1Y3Rpb25zTGVuZ3RoIiwiYWRkcmVzc1RhYmxlTG9va3Vwc0xlbmd0aCIsInNlcmlhbGl6ZWRMZW5ndGgiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwiaW5zdHJ1Y3Rpb24iLCJlbmNvZGVkQWNjb3VudEtleUluZGV4ZXNMZW5ndGgiLCJhY2NvdW50S2V5SW5kZXhlcyIsImVuY29kZWREYXRhTGVuZ3RoIiwiZGF0YSIsImluc3RydWN0aW9uTGF5b3V0IiwicHJvZ3JhbUlkSW5kZXgiLCJfaXRlcmF0b3IzIiwiX3N0ZXAzIiwiZW5jb2RlZFdyaXRhYmxlSW5kZXhlc0xlbmd0aCIsImVuY29kZWRSZWFkb25seUluZGV4ZXNMZW5ndGgiLCJhZGRyZXNzVGFibGVMb29rdXBMYXlvdXQiLCJhY2NvdW50S2V5IiwiZGVzZXJpYWxpemUiLCJieXRlQXJyYXkiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwic2hpZnQiLCJtYXNrZWRQcmVmaXgiLCJWRVJTSU9OX1BSRUZJWF9NQVNLIiwiYXNzZXJ0IiwidmVyc2lvbiIsImNvbmNhdCIsImRlY29kZUxlbmd0aCIsInB1c2giLCJQdWJsaWNLZXkiLCJzcGxpY2UiLCJQVUJMSUNfS0VZX0xFTkdUSCIsImluc3RydWN0aW9uQ291bnQiLCJhY2NvdW50S2V5SW5kZXhlc0xlbmd0aCIsImRhdGFMZW5ndGgiLCJhZGRyZXNzVGFibGVMb29rdXBzQ291bnQiLCJ3cml0YWJsZUluZGV4ZXNMZW5ndGgiLCJyZWFkb25seUluZGV4ZXNMZW5ndGgiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lc3NhZ2UvdjAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGJzNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQgKiBhcyBCdWZmZXJMYXlvdXQgZnJvbSAnQHNvbGFuYS9idWZmZXItbGF5b3V0JztcblxuaW1wb3J0IHsgQWNjb3VudEtleXNGcm9tTG9va3VwcywgQWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudCwgQmxvY2toYXNoLCBUcmFuc2FjdGlvbkluc3RydWN0aW9uIH0gZnJvbSAnLi4vY29uZmlnL3R5cGVzJztcbmltcG9ydCB7XG4gIE1lc3NhZ2VIZWFkZXIsXG4gIE1lc3NhZ2VBZGRyZXNzVGFibGVMb29rdXAsXG4gIE1lc3NhZ2VDb21waWxlZEluc3RydWN0aW9uLFxufSBmcm9tICcuL2luZGV4JztcbmltcG9ydCB7IFB1YmxpY0tleSwgUFVCTElDX0tFWV9MRU5HVEggfSBmcm9tICcuLi91dGlscy9wdWJsaWNrZXknO1xuaW1wb3J0ICogYXMgc2hvcnR2ZWMgZnJvbSAnLi4vdXRpbHMvc2hvcnR2ZWMtZW5jb2RpbmcnO1xuaW1wb3J0IGFzc2VydCBmcm9tICcuLi91dGlscy9hc3NlcnQnO1xuaW1wb3J0IHsgUEFDS0VUX0RBVEFfU0laRSwgVkVSU0lPTl9QUkVGSVhfTUFTSyB9IGZyb20gJy4uL2NvbmZpZy9wYXJhbXMnO1xuaW1wb3J0IHsgcHVibGljS2V5IH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uTGF5b3V0JztcblxuLyoqXG4gKiBNZXNzYWdlIGNvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICovXG5leHBvcnQgdHlwZSBNZXNzYWdlVjBBcmdzID0ge1xuICAvKiogVGhlIG1lc3NhZ2UgaGVhZGVyLCBpZGVudGlmeWluZyBzaWduZWQgYW5kIHJlYWQtb25seSBgYWNjb3VudEtleXNgICovXG4gIGhlYWRlcjogTWVzc2FnZUhlYWRlcjtcbiAgLyoqIFRoZSBzdGF0aWMgYWNjb3VudCBrZXlzIHVzZWQgYnkgdGhpcyB0cmFuc2FjdGlvbiAqL1xuICBzdGF0aWNBY2NvdW50S2V5czogUHVibGljS2V5W107XG4gIC8qKiBUaGUgaGFzaCBvZiBhIHJlY2VudCBsZWRnZXIgYmxvY2sgKi9cbiAgcmVjZW50QmxvY2toYXNoOiBCbG9ja2hhc2g7XG4gIC8qKiBJbnN0cnVjdGlvbnMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGluIHNlcXVlbmNlIGFuZCBjb21taXR0ZWQgaW4gb25lIGF0b21pYyB0cmFuc2FjdGlvbiBpZiBhbGwgc3VjY2VlZC4gKi9cbiAgY29tcGlsZWRJbnN0cnVjdGlvbnM6IE1lc3NhZ2VDb21waWxlZEluc3RydWN0aW9uW107XG4gIC8qKiBJbnN0cnVjdGlvbnMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGluIHNlcXVlbmNlIGFuZCBjb21taXR0ZWQgaW4gb25lIGF0b21pYyB0cmFuc2FjdGlvbiBpZiBhbGwgc3VjY2VlZC4gKi9cbiAgYWRkcmVzc1RhYmxlTG9va3VwczogTWVzc2FnZUFkZHJlc3NUYWJsZUxvb2t1cFtdO1xufTtcblxuZXhwb3J0IHR5cGUgQ29tcGlsZVYwQXJncyA9IHtcbiAgcGF5ZXJLZXk6IFB1YmxpY0tleTtcbiAgaW5zdHJ1Y3Rpb25zOiBBcnJheTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPjtcbiAgcmVjZW50QmxvY2toYXNoOiBCbG9ja2hhc2g7XG4gIGFkZHJlc3NMb29rdXBUYWJsZUFjY291bnRzPzogQXJyYXk8QWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudD47XG59O1xuXG5leHBvcnQgdHlwZSBHZXRBY2NvdW50S2V5c0FyZ3MgPVxuICB8IHtcbiAgICBhY2NvdW50S2V5c0Zyb21Mb29rdXBzPzogQWNjb3VudEtleXNGcm9tTG9va3VwcyB8IG51bGw7XG4gIH1cbiAgfCB7XG4gICAgYWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudHM/OiBBZGRyZXNzTG9va3VwVGFibGVBY2NvdW50W10gfCBudWxsO1xuICB9O1xuXG5leHBvcnQgY2xhc3MgTWVzc2FnZVYwIHtcbiAgaGVhZGVyOiBNZXNzYWdlSGVhZGVyO1xuICBzdGF0aWNBY2NvdW50S2V5czogQXJyYXk8UHVibGljS2V5PjtcbiAgcmVjZW50QmxvY2toYXNoOiBCbG9ja2hhc2g7XG4gIGNvbXBpbGVkSW5zdHJ1Y3Rpb25zOiBBcnJheTxNZXNzYWdlQ29tcGlsZWRJbnN0cnVjdGlvbj47XG4gIGFkZHJlc3NUYWJsZUxvb2t1cHM6IEFycmF5PE1lc3NhZ2VBZGRyZXNzVGFibGVMb29rdXA+O1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IE1lc3NhZ2VWMEFyZ3MpIHtcbiAgICB0aGlzLmhlYWRlciA9IGFyZ3MuaGVhZGVyO1xuICAgIHRoaXMuc3RhdGljQWNjb3VudEtleXMgPSBhcmdzLnN0YXRpY0FjY291bnRLZXlzO1xuICAgIHRoaXMucmVjZW50QmxvY2toYXNoID0gYXJncy5yZWNlbnRCbG9ja2hhc2g7XG4gICAgdGhpcy5jb21waWxlZEluc3RydWN0aW9ucyA9IGFyZ3MuY29tcGlsZWRJbnN0cnVjdGlvbnM7XG4gICAgdGhpcy5hZGRyZXNzVGFibGVMb29rdXBzID0gYXJncy5hZGRyZXNzVGFibGVMb29rdXBzO1xuICB9XG5cbiAgZ2V0IHZlcnNpb24oKTogMCB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBnZXQgbnVtQWNjb3VudEtleXNGcm9tTG9va3VwcygpOiBudW1iZXIge1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBsb29rdXAgb2YgdGhpcy5hZGRyZXNzVGFibGVMb29rdXBzKSB7XG4gICAgICBjb3VudCArPSBsb29rdXAucmVhZG9ubHlJbmRleGVzLmxlbmd0aCArIGxvb2t1cC53cml0YWJsZUluZGV4ZXMubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICBpc0FjY291bnRTaWduZXIoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpbmRleCA8IHRoaXMuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcztcbiAgfVxuXG4gIGlzQWNjb3VudFdyaXRhYmxlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBudW1TaWduZWRBY2NvdW50cyA9IHRoaXMuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcztcbiAgICBjb25zdCBudW1TdGF0aWNBY2NvdW50S2V5cyA9IHRoaXMuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoO1xuICAgIGlmIChpbmRleCA+PSBudW1TdGF0aWNBY2NvdW50S2V5cykge1xuICAgICAgY29uc3QgbG9va3VwQWNjb3VudEtleXNJbmRleCA9IGluZGV4IC0gbnVtU3RhdGljQWNjb3VudEtleXM7XG4gICAgICBjb25zdCBudW1Xcml0YWJsZUxvb2t1cEFjY291bnRLZXlzID0gdGhpcy5hZGRyZXNzVGFibGVMb29rdXBzLnJlZHVjZShcbiAgICAgICAgKGNvdW50LCBsb29rdXApID0+IGNvdW50ICsgbG9va3VwLndyaXRhYmxlSW5kZXhlcy5sZW5ndGgsXG4gICAgICAgIDAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGxvb2t1cEFjY291bnRLZXlzSW5kZXggPCBudW1Xcml0YWJsZUxvb2t1cEFjY291bnRLZXlzO1xuICAgIH0gZWxzZSBpZiAoaW5kZXggPj0gdGhpcy5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzKSB7XG4gICAgICBjb25zdCB1bnNpZ25lZEFjY291bnRJbmRleCA9IGluZGV4IC0gbnVtU2lnbmVkQWNjb3VudHM7XG4gICAgICBjb25zdCBudW1VbnNpZ25lZEFjY291bnRzID0gbnVtU3RhdGljQWNjb3VudEtleXMgLSBudW1TaWduZWRBY2NvdW50cztcbiAgICAgIGNvbnN0IG51bVdyaXRhYmxlVW5zaWduZWRBY2NvdW50cyA9XG4gICAgICAgIG51bVVuc2lnbmVkQWNjb3VudHMgLSB0aGlzLmhlYWRlci5udW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM7XG4gICAgICByZXR1cm4gdW5zaWduZWRBY2NvdW50SW5kZXggPCBudW1Xcml0YWJsZVVuc2lnbmVkQWNjb3VudHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG51bVdyaXRhYmxlU2lnbmVkQWNjb3VudHMgPVxuICAgICAgICBudW1TaWduZWRBY2NvdW50cyAtIHRoaXMuaGVhZGVyLm51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHM7XG4gICAgICByZXR1cm4gaW5kZXggPCBudW1Xcml0YWJsZVNpZ25lZEFjY291bnRzO1xuICAgIH1cbiAgfVxuXG4gIHNlcmlhbGl6ZSgpOiBVaW50OEFycmF5IHtcbiAgICBjb25zdCBlbmNvZGVkU3RhdGljQWNjb3VudEtleXNMZW5ndGggPSBBcnJheTxudW1iZXI+KCk7XG4gICAgc2hvcnR2ZWMuZW5jb2RlTGVuZ3RoKFxuICAgICAgZW5jb2RlZFN0YXRpY0FjY291bnRLZXlzTGVuZ3RoLFxuICAgICAgdGhpcy5zdGF0aWNBY2NvdW50S2V5cy5sZW5ndGgsXG4gICAgKTtcblxuICAgIGNvbnN0IHNlcmlhbGl6ZWRJbnN0cnVjdGlvbnMgPSB0aGlzLnNlcmlhbGl6ZUluc3RydWN0aW9ucygpO1xuICAgIGNvbnN0IGVuY29kZWRJbnN0cnVjdGlvbnNMZW5ndGggPSBBcnJheTxudW1iZXI+KCk7XG4gICAgc2hvcnR2ZWMuZW5jb2RlTGVuZ3RoKFxuICAgICAgZW5jb2RlZEluc3RydWN0aW9uc0xlbmd0aCxcbiAgICAgIHRoaXMuY29tcGlsZWRJbnN0cnVjdGlvbnMubGVuZ3RoLFxuICAgICk7XG5cbiAgICBjb25zdCBzZXJpYWxpemVkQWRkcmVzc1RhYmxlTG9va3VwcyA9IHRoaXMuc2VyaWFsaXplQWRkcmVzc1RhYmxlTG9va3VwcygpO1xuICAgIGNvbnN0IGVuY29kZWRBZGRyZXNzVGFibGVMb29rdXBzTGVuZ3RoID0gQXJyYXk8bnVtYmVyPigpO1xuICAgIHNob3J0dmVjLmVuY29kZUxlbmd0aChcbiAgICAgIGVuY29kZWRBZGRyZXNzVGFibGVMb29rdXBzTGVuZ3RoLFxuICAgICAgdGhpcy5hZGRyZXNzVGFibGVMb29rdXBzLmxlbmd0aCxcbiAgICApO1xuXG4gICAgY29uc3QgbWVzc2FnZUxheW91dCA9IEJ1ZmZlckxheW91dC5zdHJ1Y3Q8e1xuICAgICAgcHJlZml4OiBudW1iZXI7XG4gICAgICBoZWFkZXI6IE1lc3NhZ2VIZWFkZXI7XG4gICAgICBzdGF0aWNBY2NvdW50S2V5c0xlbmd0aDogVWludDhBcnJheTtcbiAgICAgIHN0YXRpY0FjY291bnRLZXlzOiBBcnJheTxVaW50OEFycmF5PjtcbiAgICAgIHJlY2VudEJsb2NraGFzaDogVWludDhBcnJheTtcbiAgICAgIGluc3RydWN0aW9uc0xlbmd0aDogVWludDhBcnJheTtcbiAgICAgIHNlcmlhbGl6ZWRJbnN0cnVjdGlvbnM6IFVpbnQ4QXJyYXk7XG4gICAgICBhZGRyZXNzVGFibGVMb29rdXBzTGVuZ3RoOiBVaW50OEFycmF5O1xuICAgICAgc2VyaWFsaXplZEFkZHJlc3NUYWJsZUxvb2t1cHM6IFVpbnQ4QXJyYXk7XG4gICAgfT4oW1xuICAgICAgQnVmZmVyTGF5b3V0LnU4KCdwcmVmaXgnKSxcbiAgICAgIEJ1ZmZlckxheW91dC5zdHJ1Y3Q8TWVzc2FnZUhlYWRlcj4oXG4gICAgICAgIFtcbiAgICAgICAgICBCdWZmZXJMYXlvdXQudTgoJ251bVJlcXVpcmVkU2lnbmF0dXJlcycpLFxuICAgICAgICAgIEJ1ZmZlckxheW91dC51OCgnbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cycpLFxuICAgICAgICAgIEJ1ZmZlckxheW91dC51OCgnbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzJyksXG4gICAgICAgIF0sXG4gICAgICAgICdoZWFkZXInLFxuICAgICAgKSxcbiAgICAgIEJ1ZmZlckxheW91dC5ibG9iKFxuICAgICAgICBlbmNvZGVkU3RhdGljQWNjb3VudEtleXNMZW5ndGgubGVuZ3RoLFxuICAgICAgICAnc3RhdGljQWNjb3VudEtleXNMZW5ndGgnLFxuICAgICAgKSxcbiAgICAgIEJ1ZmZlckxheW91dC5zZXEoXG4gICAgICAgIHB1YmxpY0tleSgpLFxuICAgICAgICB0aGlzLnN0YXRpY0FjY291bnRLZXlzLmxlbmd0aCxcbiAgICAgICAgJ3N0YXRpY0FjY291bnRLZXlzJyxcbiAgICAgICksXG4gICAgICBwdWJsaWNLZXkoJ3JlY2VudEJsb2NraGFzaCcpLFxuICAgICAgQnVmZmVyTGF5b3V0LmJsb2IoZW5jb2RlZEluc3RydWN0aW9uc0xlbmd0aC5sZW5ndGgsICdpbnN0cnVjdGlvbnNMZW5ndGgnKSxcbiAgICAgIEJ1ZmZlckxheW91dC5ibG9iKFxuICAgICAgICBzZXJpYWxpemVkSW5zdHJ1Y3Rpb25zLmxlbmd0aCxcbiAgICAgICAgJ3NlcmlhbGl6ZWRJbnN0cnVjdGlvbnMnLFxuICAgICAgKSxcbiAgICAgIEJ1ZmZlckxheW91dC5ibG9iKFxuICAgICAgICBlbmNvZGVkQWRkcmVzc1RhYmxlTG9va3Vwc0xlbmd0aC5sZW5ndGgsXG4gICAgICAgICdhZGRyZXNzVGFibGVMb29rdXBzTGVuZ3RoJyxcbiAgICAgICksXG4gICAgICBCdWZmZXJMYXlvdXQuYmxvYihcbiAgICAgICAgc2VyaWFsaXplZEFkZHJlc3NUYWJsZUxvb2t1cHMubGVuZ3RoLFxuICAgICAgICAnc2VyaWFsaXplZEFkZHJlc3NUYWJsZUxvb2t1cHMnLFxuICAgICAgKSxcbiAgICBdKTtcblxuICAgIGNvbnN0IHNlcmlhbGl6ZWRNZXNzYWdlID0gbmV3IFVpbnQ4QXJyYXkoUEFDS0VUX0RBVEFfU0laRSk7XG4gICAgY29uc3QgTUVTU0FHRV9WRVJTSU9OXzBfUFJFRklYID0gMSA8PCA3O1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRNZXNzYWdlTGVuZ3RoID0gbWVzc2FnZUxheW91dC5lbmNvZGUoXG4gICAgICB7XG4gICAgICAgIHByZWZpeDogTUVTU0FHRV9WRVJTSU9OXzBfUFJFRklYLFxuICAgICAgICBoZWFkZXI6IHRoaXMuaGVhZGVyLFxuICAgICAgICBzdGF0aWNBY2NvdW50S2V5c0xlbmd0aDogbmV3IFVpbnQ4QXJyYXkoZW5jb2RlZFN0YXRpY0FjY291bnRLZXlzTGVuZ3RoKSxcbiAgICAgICAgc3RhdGljQWNjb3VudEtleXM6IHRoaXMuc3RhdGljQWNjb3VudEtleXMubWFwKGtleSA9PiBrZXkudG9CeXRlcygpKSxcbiAgICAgICAgcmVjZW50QmxvY2toYXNoOiBiczU4LmRlY29kZSh0aGlzLnJlY2VudEJsb2NraGFzaCksXG4gICAgICAgIGluc3RydWN0aW9uc0xlbmd0aDogbmV3IFVpbnQ4QXJyYXkoZW5jb2RlZEluc3RydWN0aW9uc0xlbmd0aCksXG4gICAgICAgIHNlcmlhbGl6ZWRJbnN0cnVjdGlvbnMsXG4gICAgICAgIGFkZHJlc3NUYWJsZUxvb2t1cHNMZW5ndGg6IG5ldyBVaW50OEFycmF5KFxuICAgICAgICAgIGVuY29kZWRBZGRyZXNzVGFibGVMb29rdXBzTGVuZ3RoLFxuICAgICAgICApLFxuICAgICAgICBzZXJpYWxpemVkQWRkcmVzc1RhYmxlTG9va3VwcyxcbiAgICAgIH0sXG4gICAgICBzZXJpYWxpemVkTWVzc2FnZSxcbiAgICApO1xuICAgIHJldHVybiBzZXJpYWxpemVkTWVzc2FnZS5zbGljZSgwLCBzZXJpYWxpemVkTWVzc2FnZUxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIHNlcmlhbGl6ZUluc3RydWN0aW9ucygpOiBVaW50OEFycmF5IHtcbiAgICBsZXQgc2VyaWFsaXplZExlbmd0aCA9IDA7XG4gICAgY29uc3Qgc2VyaWFsaXplZEluc3RydWN0aW9ucyA9IG5ldyBVaW50OEFycmF5KFBBQ0tFVF9EQVRBX1NJWkUpO1xuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgdGhpcy5jb21waWxlZEluc3RydWN0aW9ucykge1xuICAgICAgY29uc3QgZW5jb2RlZEFjY291bnRLZXlJbmRleGVzTGVuZ3RoID0gQXJyYXk8bnVtYmVyPigpO1xuICAgICAgc2hvcnR2ZWMuZW5jb2RlTGVuZ3RoKFxuICAgICAgICBlbmNvZGVkQWNjb3VudEtleUluZGV4ZXNMZW5ndGgsXG4gICAgICAgIGluc3RydWN0aW9uLmFjY291bnRLZXlJbmRleGVzLmxlbmd0aCxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGVuY29kZWREYXRhTGVuZ3RoID0gQXJyYXk8bnVtYmVyPigpO1xuICAgICAgc2hvcnR2ZWMuZW5jb2RlTGVuZ3RoKGVuY29kZWREYXRhTGVuZ3RoLCBpbnN0cnVjdGlvbi5kYXRhLmxlbmd0aCk7XG5cbiAgICAgIGNvbnN0IGluc3RydWN0aW9uTGF5b3V0ID0gQnVmZmVyTGF5b3V0LnN0cnVjdDx7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiBudW1iZXI7XG4gICAgICAgIGVuY29kZWRBY2NvdW50S2V5SW5kZXhlc0xlbmd0aDogVWludDhBcnJheTtcbiAgICAgICAgYWNjb3VudEtleUluZGV4ZXM6IG51bWJlcltdO1xuICAgICAgICBlbmNvZGVkRGF0YUxlbmd0aDogVWludDhBcnJheTtcbiAgICAgICAgZGF0YTogVWludDhBcnJheTtcbiAgICAgIH0+KFtcbiAgICAgICAgQnVmZmVyTGF5b3V0LnU4KCdwcm9ncmFtSWRJbmRleCcpLFxuICAgICAgICBCdWZmZXJMYXlvdXQuYmxvYihcbiAgICAgICAgICBlbmNvZGVkQWNjb3VudEtleUluZGV4ZXNMZW5ndGgubGVuZ3RoLFxuICAgICAgICAgICdlbmNvZGVkQWNjb3VudEtleUluZGV4ZXNMZW5ndGgnLFxuICAgICAgICApLFxuICAgICAgICBCdWZmZXJMYXlvdXQuc2VxKFxuICAgICAgICAgIEJ1ZmZlckxheW91dC51OCgpLFxuICAgICAgICAgIGluc3RydWN0aW9uLmFjY291bnRLZXlJbmRleGVzLmxlbmd0aCxcbiAgICAgICAgICAnYWNjb3VudEtleUluZGV4ZXMnLFxuICAgICAgICApLFxuICAgICAgICBCdWZmZXJMYXlvdXQuYmxvYihlbmNvZGVkRGF0YUxlbmd0aC5sZW5ndGgsICdlbmNvZGVkRGF0YUxlbmd0aCcpLFxuICAgICAgICBCdWZmZXJMYXlvdXQuYmxvYihpbnN0cnVjdGlvbi5kYXRhLmxlbmd0aCwgJ2RhdGEnKSxcbiAgICAgIF0pO1xuXG4gICAgICBzZXJpYWxpemVkTGVuZ3RoICs9IGluc3RydWN0aW9uTGF5b3V0LmVuY29kZShcbiAgICAgICAge1xuICAgICAgICAgIHByb2dyYW1JZEluZGV4OiBpbnN0cnVjdGlvbi5wcm9ncmFtSWRJbmRleCxcbiAgICAgICAgICBlbmNvZGVkQWNjb3VudEtleUluZGV4ZXNMZW5ndGg6IG5ldyBVaW50OEFycmF5KFxuICAgICAgICAgICAgZW5jb2RlZEFjY291bnRLZXlJbmRleGVzTGVuZ3RoLFxuICAgICAgICAgICksXG4gICAgICAgICAgYWNjb3VudEtleUluZGV4ZXM6IGluc3RydWN0aW9uLmFjY291bnRLZXlJbmRleGVzLFxuICAgICAgICAgIGVuY29kZWREYXRhTGVuZ3RoOiBuZXcgVWludDhBcnJheShlbmNvZGVkRGF0YUxlbmd0aCksXG4gICAgICAgICAgZGF0YTogaW5zdHJ1Y3Rpb24uZGF0YSxcbiAgICAgICAgfSxcbiAgICAgICAgc2VyaWFsaXplZEluc3RydWN0aW9ucyxcbiAgICAgICAgc2VyaWFsaXplZExlbmd0aCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWRJbnN0cnVjdGlvbnMuc2xpY2UoMCwgc2VyaWFsaXplZExlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIHNlcmlhbGl6ZUFkZHJlc3NUYWJsZUxvb2t1cHMoKTogVWludDhBcnJheSB7XG4gICAgbGV0IHNlcmlhbGl6ZWRMZW5ndGggPSAwO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRBZGRyZXNzVGFibGVMb29rdXBzID0gbmV3IFVpbnQ4QXJyYXkoUEFDS0VUX0RBVEFfU0laRSk7XG4gICAgZm9yIChjb25zdCBsb29rdXAgb2YgdGhpcy5hZGRyZXNzVGFibGVMb29rdXBzKSB7XG4gICAgICBjb25zdCBlbmNvZGVkV3JpdGFibGVJbmRleGVzTGVuZ3RoID0gQXJyYXk8bnVtYmVyPigpO1xuICAgICAgc2hvcnR2ZWMuZW5jb2RlTGVuZ3RoKFxuICAgICAgICBlbmNvZGVkV3JpdGFibGVJbmRleGVzTGVuZ3RoLFxuICAgICAgICBsb29rdXAud3JpdGFibGVJbmRleGVzLmxlbmd0aCxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGVuY29kZWRSZWFkb25seUluZGV4ZXNMZW5ndGggPSBBcnJheTxudW1iZXI+KCk7XG4gICAgICBzaG9ydHZlYy5lbmNvZGVMZW5ndGgoXG4gICAgICAgIGVuY29kZWRSZWFkb25seUluZGV4ZXNMZW5ndGgsXG4gICAgICAgIGxvb2t1cC5yZWFkb25seUluZGV4ZXMubGVuZ3RoLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgYWRkcmVzc1RhYmxlTG9va3VwTGF5b3V0ID0gQnVmZmVyTGF5b3V0LnN0cnVjdDx7XG4gICAgICAgIGFjY291bnRLZXk6IFVpbnQ4QXJyYXk7XG4gICAgICAgIGVuY29kZWRXcml0YWJsZUluZGV4ZXNMZW5ndGg6IFVpbnQ4QXJyYXk7XG4gICAgICAgIHdyaXRhYmxlSW5kZXhlczogbnVtYmVyW107XG4gICAgICAgIGVuY29kZWRSZWFkb25seUluZGV4ZXNMZW5ndGg6IFVpbnQ4QXJyYXk7XG4gICAgICAgIHJlYWRvbmx5SW5kZXhlczogbnVtYmVyW107XG4gICAgICB9PihbXG4gICAgICAgIHB1YmxpY0tleSgnYWNjb3VudEtleScpLFxuICAgICAgICBCdWZmZXJMYXlvdXQuYmxvYihcbiAgICAgICAgICBlbmNvZGVkV3JpdGFibGVJbmRleGVzTGVuZ3RoLmxlbmd0aCxcbiAgICAgICAgICAnZW5jb2RlZFdyaXRhYmxlSW5kZXhlc0xlbmd0aCcsXG4gICAgICAgICksXG4gICAgICAgIEJ1ZmZlckxheW91dC5zZXEoXG4gICAgICAgICAgQnVmZmVyTGF5b3V0LnU4KCksXG4gICAgICAgICAgbG9va3VwLndyaXRhYmxlSW5kZXhlcy5sZW5ndGgsXG4gICAgICAgICAgJ3dyaXRhYmxlSW5kZXhlcycsXG4gICAgICAgICksXG4gICAgICAgIEJ1ZmZlckxheW91dC5ibG9iKFxuICAgICAgICAgIGVuY29kZWRSZWFkb25seUluZGV4ZXNMZW5ndGgubGVuZ3RoLFxuICAgICAgICAgICdlbmNvZGVkUmVhZG9ubHlJbmRleGVzTGVuZ3RoJyxcbiAgICAgICAgKSxcbiAgICAgICAgQnVmZmVyTGF5b3V0LnNlcShcbiAgICAgICAgICBCdWZmZXJMYXlvdXQudTgoKSxcbiAgICAgICAgICBsb29rdXAucmVhZG9ubHlJbmRleGVzLmxlbmd0aCxcbiAgICAgICAgICAncmVhZG9ubHlJbmRleGVzJyxcbiAgICAgICAgKSxcbiAgICAgIF0pO1xuXG4gICAgICBzZXJpYWxpemVkTGVuZ3RoICs9IGFkZHJlc3NUYWJsZUxvb2t1cExheW91dC5lbmNvZGUoXG4gICAgICAgIHtcbiAgICAgICAgICBhY2NvdW50S2V5OiBsb29rdXAuYWNjb3VudEtleS50b0J5dGVzKCksXG4gICAgICAgICAgZW5jb2RlZFdyaXRhYmxlSW5kZXhlc0xlbmd0aDogbmV3IFVpbnQ4QXJyYXkoXG4gICAgICAgICAgICBlbmNvZGVkV3JpdGFibGVJbmRleGVzTGVuZ3RoLFxuICAgICAgICAgICksXG4gICAgICAgICAgd3JpdGFibGVJbmRleGVzOiBsb29rdXAud3JpdGFibGVJbmRleGVzLFxuICAgICAgICAgIGVuY29kZWRSZWFkb25seUluZGV4ZXNMZW5ndGg6IG5ldyBVaW50OEFycmF5KFxuICAgICAgICAgICAgZW5jb2RlZFJlYWRvbmx5SW5kZXhlc0xlbmd0aCxcbiAgICAgICAgICApLFxuICAgICAgICAgIHJlYWRvbmx5SW5kZXhlczogbG9va3VwLnJlYWRvbmx5SW5kZXhlcyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VyaWFsaXplZEFkZHJlc3NUYWJsZUxvb2t1cHMsXG4gICAgICAgIHNlcmlhbGl6ZWRMZW5ndGgsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJpYWxpemVkQWRkcmVzc1RhYmxlTG9va3Vwcy5zbGljZSgwLCBzZXJpYWxpemVkTGVuZ3RoKTtcbiAgfVxuXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShzZXJpYWxpemVkTWVzc2FnZTogVWludDhBcnJheSk6IE1lc3NhZ2VWMCB7XG4gICAgY29uc3QgYnl0ZUFycmF5ID0gWy4uLnNlcmlhbGl6ZWRNZXNzYWdlXTtcblxuICAgIGNvbnN0IHByZWZpeCA9IGJ5dGVBcnJheS5zaGlmdCgpIGFzIG51bWJlcjtcbiAgICBjb25zdCBtYXNrZWRQcmVmaXggPSBwcmVmaXggJiBWRVJTSU9OX1BSRUZJWF9NQVNLO1xuICAgIGFzc2VydChcbiAgICAgIHByZWZpeCAhPT0gbWFza2VkUHJlZml4LFxuICAgICAgYEV4cGVjdGVkIHZlcnNpb25lZCBtZXNzYWdlIGJ1dCByZWNlaXZlZCBsZWdhY3kgbWVzc2FnZWAsXG4gICAgKTtcblxuICAgIGNvbnN0IHZlcnNpb24gPSBtYXNrZWRQcmVmaXg7XG4gICAgYXNzZXJ0KFxuICAgICAgdmVyc2lvbiA9PT0gMCxcbiAgICAgIGBFeHBlY3RlZCB2ZXJzaW9uZWQgbWVzc2FnZSB3aXRoIHZlcnNpb24gMCBidXQgZm91bmQgdmVyc2lvbiAke3ZlcnNpb259YCxcbiAgICApO1xuXG4gICAgY29uc3QgaGVhZGVyOiBNZXNzYWdlSGVhZGVyID0ge1xuICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzOiBieXRlQXJyYXkuc2hpZnQoKSBhcyBudW1iZXIsXG4gICAgICBudW1SZWFkb25seVNpZ25lZEFjY291bnRzOiBieXRlQXJyYXkuc2hpZnQoKSBhcyBudW1iZXIsXG4gICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IGJ5dGVBcnJheS5zaGlmdCgpIGFzIG51bWJlcixcbiAgICB9O1xuXG4gICAgY29uc3Qgc3RhdGljQWNjb3VudEtleXMgPSBbXTtcbiAgICBjb25zdCBzdGF0aWNBY2NvdW50S2V5c0xlbmd0aCA9IHNob3J0dmVjLmRlY29kZUxlbmd0aChieXRlQXJyYXkpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhdGljQWNjb3VudEtleXNMZW5ndGg7IGkrKykge1xuICAgICAgc3RhdGljQWNjb3VudEtleXMucHVzaChcbiAgICAgICAgbmV3IFB1YmxpY0tleShieXRlQXJyYXkuc3BsaWNlKDAsIFBVQkxJQ19LRVlfTEVOR1RIKSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY2VudEJsb2NraGFzaCA9IGJzNTguZW5jb2RlKGJ5dGVBcnJheS5zcGxpY2UoMCwgUFVCTElDX0tFWV9MRU5HVEgpKTtcblxuICAgIGNvbnN0IGluc3RydWN0aW9uQ291bnQgPSBzaG9ydHZlYy5kZWNvZGVMZW5ndGgoYnl0ZUFycmF5KTtcbiAgICBjb25zdCBjb21waWxlZEluc3RydWN0aW9uczogTWVzc2FnZUNvbXBpbGVkSW5zdHJ1Y3Rpb25bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zdHJ1Y3Rpb25Db3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBwcm9ncmFtSWRJbmRleCA9IGJ5dGVBcnJheS5zaGlmdCgpIGFzIG51bWJlcjtcbiAgICAgIGNvbnN0IGFjY291bnRLZXlJbmRleGVzTGVuZ3RoID0gc2hvcnR2ZWMuZGVjb2RlTGVuZ3RoKGJ5dGVBcnJheSk7XG4gICAgICBjb25zdCBhY2NvdW50S2V5SW5kZXhlcyA9IGJ5dGVBcnJheS5zcGxpY2UoMCwgYWNjb3VudEtleUluZGV4ZXNMZW5ndGgpO1xuICAgICAgY29uc3QgZGF0YUxlbmd0aCA9IHNob3J0dmVjLmRlY29kZUxlbmd0aChieXRlQXJyYXkpO1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KGJ5dGVBcnJheS5zcGxpY2UoMCwgZGF0YUxlbmd0aCkpO1xuICAgICAgY29tcGlsZWRJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgIHByb2dyYW1JZEluZGV4LFxuICAgICAgICBhY2NvdW50S2V5SW5kZXhlcyxcbiAgICAgICAgZGF0YSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZHJlc3NUYWJsZUxvb2t1cHNDb3VudCA9IHNob3J0dmVjLmRlY29kZUxlbmd0aChieXRlQXJyYXkpO1xuICAgIGNvbnN0IGFkZHJlc3NUYWJsZUxvb2t1cHM6IE1lc3NhZ2VBZGRyZXNzVGFibGVMb29rdXBbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkcmVzc1RhYmxlTG9va3Vwc0NvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGFjY291bnRLZXkgPSBuZXcgUHVibGljS2V5KGJ5dGVBcnJheS5zcGxpY2UoMCwgUFVCTElDX0tFWV9MRU5HVEgpKTtcbiAgICAgIGNvbnN0IHdyaXRhYmxlSW5kZXhlc0xlbmd0aCA9IHNob3J0dmVjLmRlY29kZUxlbmd0aChieXRlQXJyYXkpO1xuICAgICAgY29uc3Qgd3JpdGFibGVJbmRleGVzID0gYnl0ZUFycmF5LnNwbGljZSgwLCB3cml0YWJsZUluZGV4ZXNMZW5ndGgpO1xuICAgICAgY29uc3QgcmVhZG9ubHlJbmRleGVzTGVuZ3RoID0gc2hvcnR2ZWMuZGVjb2RlTGVuZ3RoKGJ5dGVBcnJheSk7XG4gICAgICBjb25zdCByZWFkb25seUluZGV4ZXMgPSBieXRlQXJyYXkuc3BsaWNlKDAsIHJlYWRvbmx5SW5kZXhlc0xlbmd0aCk7XG4gICAgICBhZGRyZXNzVGFibGVMb29rdXBzLnB1c2goe1xuICAgICAgICBhY2NvdW50S2V5LFxuICAgICAgICB3cml0YWJsZUluZGV4ZXMsXG4gICAgICAgIHJlYWRvbmx5SW5kZXhlcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTWVzc2FnZVYwKHtcbiAgICAgIGhlYWRlcixcbiAgICAgIHN0YXRpY0FjY291bnRLZXlzLFxuICAgICAgcmVjZW50QmxvY2toYXNoLFxuICAgICAgY29tcGlsZWRJbnN0cnVjdGlvbnMsXG4gICAgICBhZGRyZXNzVGFibGVMb29rdXBzLFxuICAgIH0pO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsR0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsWUFBQSxHQUFBQyx1QkFBQSxDQUFBRixPQUFBO0FBUUEsSUFBQUcsVUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksUUFBQSxHQUFBRix1QkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUssT0FBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sT0FBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sYUFBQSxHQUFBUCxPQUFBO0FBQWtELFNBQUFRLHlCQUFBQyxXQUFBLGVBQUFDLE9BQUEsa0NBQUFDLGlCQUFBLE9BQUFELE9BQUEsUUFBQUUsZ0JBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsV0FBQSxXQUFBQSxXQUFBLEdBQUFHLGdCQUFBLEdBQUFELGlCQUFBLEtBQUFGLFdBQUE7QUFBQSxTQUFBUCx3QkFBQVcs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