UNPKG

@c4tplatform/caminojs

Version:
201 lines 22.8 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Vertex = void 0; /** * @packageDocumentation * @module API-AVM-Vertex */ const buffer_1 = require("buffer/"); const bintools_1 = __importDefault(require("../../utils/bintools")); const constants_1 = require("./constants"); const tx_1 = require("./tx"); const utils_1 = require("../../utils"); const bn_js_1 = __importDefault(require("bn.js")); /** * @ignore */ const bintools = bintools_1.default.getInstance(); /** * Class representing a Vertex */ class Vertex extends utils_1.Serializable { /** * Returns the NetworkID as a number */ getNetworkID() { return this.networkID; } /** * Returns the BlockchainID as a CB58 string */ getBlockchainID() { return bintools.cb58Encode(this.blockchainID); } /** * Returns the Height as a {@link https://github.com/indutny/bn.js/|BN}. */ getHeight() { return this.height; } /** * Returns the Epoch as a number. */ getEpoch() { return this.epoch; } /** * @returns An array of Buffers */ getParentIDs() { return this.parentIDs; } /** * Returns array of UnsignedTxs. */ getTxs() { return this.txs; } /** * @returns An array of Buffers */ getRestrictions() { return this.restrictions; } /** * Set the codecID * * @param codecID The codecID to set */ setCodecID(codecID) { if (codecID !== 0 && codecID !== 1) { /* istanbul ignore next */ throw new utils_1.CodecIdError("Error - Vertex.setCodecID: invalid codecID. Valid codecIDs are 0 and 1."); } this._codecID = codecID; this._typeID = this._codecID === 0 ? constants_1.AVMConstants.VERTEX : constants_1.AVMConstants.VERTEX_CODECONE; } /** * Takes a {@link https://github.com/feross/buffer|Buffer} containing an [[Vertex]], parses it, populates the class, and returns the length of the Vertex in bytes. * * @param bytes A {@link https://github.com/feross/buffer|Buffer} containing a raw [[Vertex]] * * @returns The length of the raw [[Vertex]] * * @remarks assume not-checksummed */ fromBuffer(bytes, offset = 0) { offset += 2; this.blockchainID = bintools.copyFrom(bytes, offset, offset + 32); offset += 32; const h = bintools.copyFrom(bytes, offset, offset + 8); this.height = bintools.fromBufferToBN(h); offset += 8; const e = bintools.copyFrom(bytes, offset, offset + 4); this.epoch = e.readInt32BE(0); offset += 4; const nPIDs = bintools.copyFrom(bytes, offset, offset + 4); this.numParentIDs = nPIDs.readInt32BE(0); offset += 4; for (let i = 0; i < this.numParentIDs; i++) { const parentID = bintools.copyFrom(bytes, offset, offset + 32); offset += 32; this.parentIDs.push(parentID); } const nTxs = bintools.copyFrom(bytes, offset, offset + 4); this.numTxs = nTxs.readInt32BE(0); // account for tx-size bytes offset += 8; for (let i = 0; i < this.numTxs; i++) { const tx = new tx_1.Tx(); offset += tx.fromBuffer(bintools.copyFrom(bytes, offset)); this.txs.push(tx); } if (bytes.byteLength > offset && bytes.byteLength - offset > 4) { const nRs = bintools.copyFrom(bytes, offset, offset + 4); this.numRestrictions = nRs.readInt32BE(0); offset += 4; for (let i = 0; i < this.numRestrictions; i++) { const tx = bintools.copyFrom(bytes, offset, offset + 32); offset += 32; this.restrictions.push(tx); } } return offset; } /** * Returns a {@link https://github.com/feross/buffer|Buffer} representation of the [[Vertex]]. */ toBuffer() { const codec = this.getCodecID(); const codecBuf = buffer_1.Buffer.alloc(2); codecBuf.writeUInt16BE(codec, 0); const epochBuf = buffer_1.Buffer.alloc(4); epochBuf.writeInt32BE(this.epoch, 0); const numParentIDsBuf = buffer_1.Buffer.alloc(4); numParentIDsBuf.writeInt32BE(this.numParentIDs, 0); let barr = [ codecBuf, this.blockchainID, bintools.fromBNToBuffer(this.height, 8), epochBuf, numParentIDsBuf ]; this.parentIDs.forEach((parentID) => { barr.push(parentID); }); const txs = this.getTxs(); const numTxs = buffer_1.Buffer.alloc(4); numTxs.writeUInt32BE(txs.length, 0); barr.push(numTxs); let size = 0; const txSize = buffer_1.Buffer.alloc(4); txs.forEach((tx) => { const b = tx.toBuffer(); size += b.byteLength; }); txSize.writeUInt32BE(size, 0); barr.push(txSize); txs.forEach((tx) => { const b = tx.toBuffer(); barr.push(b); }); return buffer_1.Buffer.concat(barr); } clone() { let vertex = new Vertex(); vertex.fromBuffer(this.toBuffer()); return vertex; } /** * Class representing a Vertex which is a container for AVM Transactions. * * @param networkID Optional, [[DefaultNetworkID]] * @param blockchainID Optional, default "2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM" * @param height Optional, default new BN(0) * @param epoch Optional, default new BN(0) * @param parentIDs Optional, default [] * @param txs Optional, default [] * @param restrictions Optional, default [] */ constructor(networkID = utils_1.DefaultNetworkID, blockchainID = "2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM", height = new bn_js_1.default(0), epoch = 0, parentIDs = [], txs = [], restrictions = []) { super(); this._typeName = "Vertex"; this._codecID = constants_1.AVMConstants.LATESTCODEC; this.networkID = networkID; this.blockchainID = bintools.cb58Decode(blockchainID); this.height = height; this.epoch = epoch; this.parentIDs = parentIDs; this.numParentIDs = parentIDs.length; this.txs = txs; this.numTxs = txs.length; this.restrictions = restrictions; this.numRestrictions = restrictions.length; } } exports.Vertex = Vertex; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVydGV4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaXMvYXZtL3ZlcnRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7O0dBR0c7QUFDSCxvQ0FBZ0M7QUFDaEMsb0VBQTJDO0FBQzNDLDJDQUEwQztBQUMxQyw2QkFBeUI7QUFDekIsdUNBQTBFO0FBQzFFLGtEQUFzQjtBQUV0Qjs7R0FFRztBQUNILE1BQU0sUUFBUSxHQUFhLGtCQUFRLENBQUMsV0FBVyxFQUFFLENBQUE7QUFFakQ7O0dBRUc7QUFDSCxNQUFhLE1BQU8sU0FBUSxvQkFBWTtJQWdCdEM7O09BRUc7SUFDSCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFBO0lBQ3ZCLENBQUM7SUFDRDs7T0FFRztJQUNILGVBQWU7UUFDYixPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUE7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQTtJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFBO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUE7SUFDakIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQTtJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVUsQ0FBQyxPQUFlO1FBQ3hCLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLDBCQUEwQjtZQUMxQixNQUFNLElBQUksb0JBQVksQ0FDcEIseUVBQXlF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QVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUNsQyxPQUFPLE1BQWMsQ0FBQTtJQUN2QixDQUFDO0lBQ0Q7Ozs7Ozs7Ozs7T0FVRztJQUNILFlBQ0UsWUFBb0Isd0JBQWdCLEVBQ3BDLGVBQXVCLG9EQUFvRCxFQUMzRSxTQUFhLElBQUksZUFBRSxDQUFDLENBQUMsQ0FBQyxFQUN0QixRQUFnQixDQUFDLEVBQ2pCLFlBQXNCLEVBQUUsRUFDeEIsTUFBWSxFQUFFLEVBQ2QsZUFBeUIsRUFBRTtRQUUzQixLQUFLLEVBQUUsQ0FBQTtRQWhOQyxjQUFTLEdBQUcsUUFBUSxDQUFBO1FBQ3BCLGFBQVEsR0FBRyx3QkFBWSxDQUFDLFdBQVcsQ0FBQTtRQWdOM0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ3JELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQTtRQUNwQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUNkLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQTtRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUE7SUFDNUMsQ0FBQztDQUNGO0FBN05ELHdCQTZOQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBAbW9kdWxlIEFQSS1BVk0tVmVydGV4XG4gKi9cbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJidWZmZXIvXCJcbmltcG9ydCBCaW5Ub29scyBmcm9tIFwiLi4vLi4vdXRpbHMvYmludG9vbHNcIlxuaW1wb3J0IHsgQVZNQ29uc3RhbnRzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCJcbmltcG9ydCB7IFR4IH0gZnJvbSBcIi4vdHhcIlxuaW1wb3J0IHsgU2VyaWFsaXphYmxlLCBDb2RlY0lkRXJyb3IsIERlZmF1bHROZXR3b3JrSUQgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IEJOIGZyb20gXCJibi5qc1wiXG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5jb25zdCBiaW50b29sczogQmluVG9vbHMgPSBCaW5Ub29scy5nZXRJbnN0YW5jZSgpXG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgVmVydGV4XG4gKi9cbmV4cG9ydCBjbGFzcyBWZXJ0ZXggZXh0ZW5kcyBTZXJpYWxpemFibGUge1xuICBwcm90ZWN0ZWQgX3R5cGVOYW1lID0gXCJWZXJ0ZXhcIlxuICBwcm90ZWN0ZWQgX2NvZGVjSUQgPSBBVk1Db25zdGFudHMuTEFURVNUQ09ERUNcbiAgLy8gc2VyaWFsaXplIGlzIGluaGVyaXRlZFxuICAvLyBkZXNlcmlhbGl6ZSBpcyBpbmhlcml0ZWRcbiAgcHJvdGVjdGVkIG5ldHdvcmtJRDogbnVtYmVyXG4gIHByb3RlY3RlZCBibG9ja2NoYWluSUQ6IEJ1ZmZlclxuICBwcm90ZWN0ZWQgaGVpZ2h0OiBCTlxuICBwcm90ZWN0ZWQgZXBvY2g6IG51bWJlclxuICBwcm90ZWN0ZWQgcGFyZW50SURzOiBCdWZmZXJbXVxuICBwcm90ZWN0ZWQgbnVtUGFyZW50SURzOiBudW1iZXJcbiAgcHJvdGVjdGVkIHR4czogVHhbXVxuICBwcm90ZWN0ZWQgbnVtVHhzOiBudW1iZXJcbiAgcHJvdGVjdGVkIHJlc3RyaWN0aW9uczogQnVmZmVyW11cbiAgcHJvdGVjdGVkIG51bVJlc3RyaWN0aW9uczogbnVtYmVyXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIE5ldHdvcmtJRCBhcyBhIG51bWJlclxuICAgKi9cbiAgZ2V0TmV0d29ya0lEKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubmV0d29ya0lEXG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIEJsb2NrY2hhaW5JRCBhcyBhIENCNTggc3RyaW5nXG4gICAqL1xuICBnZXRCbG9ja2NoYWluSUQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYmludG9vbHMuY2I1OEVuY29kZSh0aGlzLmJsb2NrY2hhaW5JRClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBIZWlnaHQgYXMgYSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvYm4uanMvfEJOfS5cbiAgICovXG4gIGdldEhlaWdodCgpOiBCTiB7XG4gICAgcmV0dXJuIHRoaXMuaGVpZ2h0XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgRXBvY2ggYXMgYSBudW1iZXIuXG4gICAqL1xuICBnZXRFcG9jaCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVwb2NoXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgQnVmZmVyc1xuICAgKi9cbiAgZ2V0UGFyZW50SURzKCk6IEJ1ZmZlcltdIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRJRHNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFycmF5IG9mIFVuc2lnbmVkVHhzLlxuICAgKi9cbiAgZ2V0VHhzKCk6IFR4W10ge1xuICAgIHJldHVybiB0aGlzLnR4c1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIEJ1ZmZlcnNcbiAgICovXG4gIGdldFJlc3RyaWN0aW9ucygpOiBCdWZmZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMucmVzdHJpY3Rpb25zXG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjb2RlY0lEXG4gICAqXG4gICAqIEBwYXJhbSBjb2RlY0lEIFRoZSBjb2RlY0lEIHRvIHNldFxuICAgKi9cbiAgc2V0Q29kZWNJRChjb2RlY0lEOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoY29kZWNJRCAhPT0gMCAmJiBjb2RlY0lEICE9PSAxKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgdGhyb3cgbmV3IENvZGVjSWRFcnJvcihcbiAgICAgICAgXCJFcnJvciAtIFZlcnRleC5zZXRDb2RlY0lEOiBpbnZhbGlkIGNvZGVjSUQuIFZhbGlkIGNvZGVjSURzIGFyZSAwIGFuZCAxLlwiXG4gICAgICApXG4gICAgfVxuICAgIHRoaXMuX2NvZGVjSUQgPSBjb2RlY0lEXG4gICAgdGhpcy5fdHlwZUlEID1cbiAgICAgIHRoaXMuX2NvZGVjSUQgPT09IDAgPyBBVk1Db25zdGFudHMuVkVSVEVYIDogQVZNQ29uc3RhbnRzLlZFUlRFWF9DT0RFQ09ORVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gY29udGFpbmluZyBhbiBbW1ZlcnRleF1dLCBwYXJzZXMgaXQsIHBvcHVsYXRlcyB0aGUgY2xhc3MsIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIFZlcnRleCBpbiBieXRlcy5cbiAgICpcbiAgICogQHBhcmFtIGJ5dGVzIEEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gY29udGFpbmluZyBhIHJhdyBbW1ZlcnRleF1dXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBsZW5ndGggb2YgdGhlIHJhdyBbW1ZlcnRleF1dXG4gICAqXG4gICAqIEByZW1hcmtzIGFzc3VtZSBub3QtY2hlY2tzdW1tZWRcbiAgICovXG4gIGZyb21CdWZmZXIoYnl0ZXM6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIgPSAwKTogbnVtYmVyIHtcbiAgICBvZmZzZXQgKz0gMlxuICAgIHRoaXMuYmxvY2tjaGFpbklEID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgMzIpXG4gICAgb2Zmc2V0ICs9IDMyXG5cbiAgICBjb25zdCBoOiBCdWZmZXIgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyA4KVxuICAgIHRoaXMuaGVpZ2h0ID0gYmludG9vbHMuZnJvbUJ1ZmZlclRvQk4oaClcbiAgICBvZmZzZXQgKz0gOFxuXG4gICAgY29uc3QgZTogQnVmZmVyID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNClcbiAgICB0aGlzLmVwb2NoID0gZS5yZWFkSW50MzJCRSgwKVxuICAgIG9mZnNldCArPSA0XG5cbiAgICBjb25zdCBuUElEczogQnVmZmVyID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNClcbiAgICB0aGlzLm51bVBhcmVudElEcyA9IG5QSURzLnJlYWRJbnQzMkJFKDApXG4gICAgb2Zmc2V0ICs9IDRcblxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLm51bVBhcmVudElEczsgaSsrKSB7XG4gICAgICBjb25zdCBwYXJlbnRJRDogQnVmZmVyID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgMzIpXG4gICAgICBvZmZzZXQgKz0gMzJcbiAgICAgIHRoaXMucGFyZW50SURzLnB1c2gocGFyZW50SUQpXG4gICAgfVxuXG4gICAgY29uc3QgblR4czogQnVmZmVyID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNClcbiAgICB0aGlzLm51bVR4cyA9IG5UeHMucmVhZEludDMyQkUoMClcbiAgICAvLyBhY2NvdW50IGZvciB0eC1zaXplIGJ5dGVzXG4gICAgb2Zmc2V0ICs9IDhcblxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLm51bVR4czsgaSsrKSB7XG4gICAgICBjb25zdCB0eDogVHggPSBuZXcgVHgoKVxuICAgICAgb2Zmc2V0ICs9IHR4LmZyb21CdWZmZXIoYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCkpXG4gICAgICB0aGlzLnR4cy5wdXNoKHR4KVxuICAgIH1cblxuICAgIGlmIChieXRlcy5ieXRlTGVuZ3RoID4gb2Zmc2V0ICYmIGJ5dGVzLmJ5dGVMZW5ndGggLSBvZmZzZXQgPiA0KSB7XG4gICAgICBjb25zdCBuUnM6IEJ1ZmZlciA9IGJpbnRvb2xzLmNvcHlGcm9tKGJ5dGVzLCBvZmZzZXQsIG9mZnNldCArIDQpXG4gICAgICB0aGlzLm51bVJlc3RyaWN0aW9ucyA9IG5Scy5yZWFkSW50MzJCRSgwKVxuICAgICAgb2Zmc2V0ICs9IDRcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLm51bVJlc3RyaWN0aW9uczsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHR4OiBCdWZmZXIgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyAzMilcbiAgICAgICAgb2Zmc2V0ICs9IDMyXG4gICAgICAgIHRoaXMucmVzdHJpY3Rpb25zLnB1c2godHgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSByZXByZXNlbnRhdGlvbiBvZiB0aGUgW1tWZXJ0ZXhdXS5cbiAgICovXG4gIHRvQnVmZmVyKCk6IEJ1ZmZlciB7XG4gICAgY29uc3QgY29kZWM6IG51bWJlciA9IHRoaXMuZ2V0Q29kZWNJRCgpXG4gICAgY29uc3QgY29kZWNCdWY6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygyKVxuICAgIGNvZGVjQnVmLndyaXRlVUludDE2QkUoY29kZWMsIDApXG5cbiAgICBjb25zdCBlcG9jaEJ1ZjogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpXG4gICAgZXBvY2hCdWYud3JpdGVJbnQzMkJFKHRoaXMuZXBvY2gsIDApXG5cbiAgICBjb25zdCBudW1QYXJlbnRJRHNCdWY6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KVxuICAgIG51bVBhcmVudElEc0J1Zi53cml0ZUludDMyQkUodGhpcy5udW1QYXJlbnRJRHMsIDApXG4gICAgbGV0IGJhcnI6IEJ1ZmZlcltdID0gW1xuICAgICAgY29kZWNCdWYsXG4gICAgICB0aGlzLmJsb2NrY2hhaW5JRCxcbiAgICAgIGJpbnRvb2xzLmZyb21CTlRvQnVmZmVyKHRoaXMuaGVpZ2h0LCA4KSxcbiAgICAgIGVwb2NoQnVmLFxuICAgICAgbnVtUGFyZW50SURzQnVmXG4gICAgXVxuICAgIHRoaXMucGFyZW50SURzLmZvckVhY2goKHBhcmVudElEOiBCdWZmZXIpOiB2b2lkID0+IHtcbiAgICAgIGJhcnIucHVzaChwYXJlbnRJRClcbiAgICB9KVxuXG4gICAgY29uc3QgdHhzOiBUeFtdID0gdGhpcy5nZXRUeHMoKVxuICAgIGNvbnN0IG51bVR4czogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpXG4gICAgbnVtVHhzLndyaXRlVUludDMyQkUodHhzLmxlbmd0aCwgMClcbiAgICBiYXJyLnB1c2gobnVtVHhzKVxuXG4gICAgbGV0IHNpemU6IG51bWJlciA9IDBcbiAgICBjb25zdCB0eFNpemU6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KVxuICAgIHR4cy5mb3JFYWNoKCh0eDogVHgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGI6IEJ1ZmZlciA9IHR4LnRvQnVmZmVyKClcbiAgICAgIHNpemUgKz0gYi5ieXRlTGVuZ3RoXG4gICAgfSlcbiAgICB0eFNpemUud3JpdGVVSW50MzJCRShzaXplLCAwKVxuICAgIGJhcnIucHVzaCh0eFNpemUpXG5cbiAgICB0eHMuZm9yRWFjaCgodHg6IFR4KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBiOiBCdWZmZXIgPSB0eC50b0J1ZmZlcigpXG4gICAgICBiYXJyLnB1c2goYilcbiAgICB9KVxuXG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYmFycilcbiAgfVxuXG4gIGNsb25lKCk6IHRoaXMge1xuICAgIGxldCB2ZXJ0ZXg6IFZlcnRleCA9IG5ldyBWZXJ0ZXgoKVxuICAgIHZlcnRleC5mcm9tQnVmZmVyKHRoaXMudG9CdWZmZXIoKSlcbiAgICByZXR1cm4gdmVydGV4IGFzIHRoaXNcbiAgfVxuICAvKipcbiAgICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgVmVydGV4IHdoaWNoIGlzIGEgY29udGFpbmVyIGZvciBBVk0gVHJhbnNhY3Rpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gbmV0d29ya0lEIE9wdGlvbmFsLCBbW0RlZmF1bHROZXR3b3JrSURdXVxuICAgKiBAcGFyYW0gYmxvY2tjaGFpbklEIE9wdGlvbmFsLCBkZWZhdWx0IFwiMm9ZTUJOVjRlTkh5cWsyZmpqVjVuVlFMRGJ0bU5KenE1czNxczNMbzZmdG5DNkZCeU1cIlxuICAgKiBAcGFyYW0gaGVpZ2h0IE9wdGlvbmFsLCBkZWZhdWx0IG5ldyBCTigwKVxuICAgKiBAcGFyYW0gZXBvY2ggT3B0aW9uYWwsIGRlZmF1bHQgbmV3IEJOKDApXG4gICAqIEBwYXJhbSBwYXJlbnRJRHMgT3B0aW9uYWwsIGRlZmF1bHQgW11cbiAgICogQHBhcmFtIHR4cyBPcHRpb25hbCwgZGVmYXVsdCBbXVxuICAgKiBAcGFyYW0gcmVzdHJpY3Rpb25zIE9wdGlvbmFsLCBkZWZhdWx0IFtdXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBuZXR3b3JrSUQ6IG51bWJlciA9IERlZmF1bHROZXR3b3JrSUQsXG4gICAgYmxvY2tjaGFpbklEOiBzdHJpbmcgPSBcIjJvWU1CTlY0ZU5IeXFrMmZqalY1blZRTERidG1OSnpxNXMzcXMzTG82ZnRuQzZGQnlNXCIsXG4gICAgaGVpZ2h0OiBCTiA9IG5ldyBCTigwKSxcbiAgICBlcG9jaDogbnVtYmVyID0gMCxcbiAgICBwYXJlbnRJRHM6IEJ1ZmZlcltdID0gW10sXG4gICAgdHhzOiBUeFtdID0gW10sXG4gICAgcmVzdHJpY3Rpb25zOiBCdWZmZXJbXSA9IFtdXG4gICkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLm5ldHdvcmtJRCA9IG5ldHdvcmtJRFxuICAgIHRoaXMuYmxvY2tjaGFpbklEID0gYmludG9vbHMuY2I1OERlY29kZShibG9ja2NoYWluSUQpXG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHRcbiAgICB0aGlzLmVwb2NoID0gZXBvY2hcbiAgICB0aGlzLnBhcmVudElEcyA9IHBhcmVudElEc1xuICAgIHRoaXMubnVtUGFyZW50SURzID0gcGFyZW50SURzLmxlbmd0aFxuICAgIHRoaXMudHhzID0gdHhzXG4gICAgdGhpcy5udW1UeHMgPSB0eHMubGVuZ3RoXG4gICAgdGhpcy5yZXN0cmljdGlvbnMgPSByZXN0cmljdGlvbnNcbiAgICB0aGlzLm51bVJlc3RyaWN0aW9ucyA9IHJlc3RyaWN0aW9ucy5sZW5ndGhcbiAgfVxufVxuIl19