UNPKG

@c4tplatform/caminojs

Version:
189 lines 23.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Tx = exports.UnsignedTx = exports.SelectTxClass = void 0; /** * @packageDocumentation * @module API-PlatformVM-Transactions */ const buffer_1 = require("buffer/"); const create_hash_1 = __importDefault(require("create-hash")); const common_1 = require("../../common"); const bintools_1 = __importDefault(require("../../utils/bintools")); const errors_1 = require("../../utils/errors"); const adddepositoffertx_1 = require("./adddepositoffertx"); const addproposaltx_1 = require("./addproposaltx"); const addressstatetx_1 = require("./addressstatetx"); const addsubnetvalidatortx_1 = require("./addsubnetvalidatortx"); const addvotetx_1 = require("./addvotetx"); const basetx_1 = require("./basetx"); const claimtx_1 = require("./claimtx"); const constants_1 = require("./constants"); const createsubnettx_1 = require("./createsubnettx"); const credentials_1 = require("./credentials"); const depositTx_1 = require("./depositTx"); const exporttx_1 = require("./exporttx"); const importtx_1 = require("./importtx"); const multisigaliastx_1 = require("./multisigaliastx"); const registernodetx_1 = require("./registernodetx"); const validationtx_1 = require("./validationtx"); const unlockdeposittx_1 = require("./unlockdeposittx"); /** * @ignore */ const bintools = bintools_1.default.getInstance(); /** * Takes a buffer representing the output and returns the proper [[BaseTx]] instance. * * @param txtype The id of the transaction type * * @returns An instance of an [[BaseTx]]-extended class. */ const SelectTxClass = (txtype, ...args) => { if (txtype === constants_1.PlatformVMConstants.BASETX) { return new basetx_1.BaseTx(...args); } else if (txtype === constants_1.PlatformVMConstants.IMPORTTX) { return new importtx_1.ImportTx(...args); } else if (txtype === constants_1.PlatformVMConstants.EXPORTTX) { return new exporttx_1.ExportTx(...args); } else if (txtype === constants_1.PlatformVMConstants.ADDDELEGATORTX) { return new validationtx_1.AddDelegatorTx(...args); } else if (txtype === constants_1.PlatformVMConstants.ADDVALIDATORTX) { return new validationtx_1.AddValidatorTx(...args); } else if (txtype === constants_1.PlatformVMConstants.CAMINOADDVALIDATORTX) { return new validationtx_1.CaminoAddValidatorTx(...args); } else if (txtype === constants_1.PlatformVMConstants.CREATESUBNETTX) { return new createsubnettx_1.CreateSubnetTx(...args); } else if (txtype === constants_1.PlatformVMConstants.ADDSUBNETVALIDATORTX) { return new addsubnetvalidatortx_1.AddSubnetValidatorTx(...args); } else if (txtype === constants_1.PlatformVMConstants.REGISTERNODETX) { return new registernodetx_1.RegisterNodeTx(...args); } else if (txtype === constants_1.PlatformVMConstants.DEPOSITTX) { return new depositTx_1.DepositTx(...args); } else if (txtype === constants_1.PlatformVMConstants.ADDRESSSTATETX) { return new addressstatetx_1.AddressStateTx(...args); } else if (txtype === constants_1.PlatformVMConstants.CLAIMTX) { return new claimtx_1.ClaimTx(...args); } else if (txtype === constants_1.PlatformVMConstants.UNLOCKDEPOSITTX) { return new unlockdeposittx_1.UnlockDepositTx(...args); } else if (txtype === constants_1.PlatformVMConstants.MULTISIGALIASTX) { return new multisigaliastx_1.MultisigAliasTx(...args); } else if (txtype === constants_1.PlatformVMConstants.ADDDEPOSITOFFERTX) { return new adddepositoffertx_1.AddDepositOfferTx(...args); } else if (txtype === constants_1.PlatformVMConstants.ADDPROPOSALTX) { return new addproposaltx_1.AddProposalTx(...args); } else if (txtype === constants_1.PlatformVMConstants.ADDVOTETX) { return new addvotetx_1.AddVoteTx(...args); } /* istanbul ignore next */ throw new errors_1.TransactionError("Error - SelectTxClass: unknown txtype"); }; exports.SelectTxClass = SelectTxClass; class UnsignedTx extends common_1.StandardUnsignedTx { constructor() { super(...arguments); this._typeName = "UnsignedTx"; this._typeID = undefined; } //serialize is inherited deserialize(fields, encoding = "hex") { super.deserialize(fields, encoding); this.transaction = (0, exports.SelectTxClass)(fields["transaction"]["_typeID"]); this.transaction.deserialize(fields["transaction"], encoding); } getTransaction() { return this.transaction; } fromBuffer(bytes, offset = 0) { this.codecID = bintools.copyFrom(bytes, offset, offset + 2).readUInt16BE(0); offset += 2; const txtype = bintools .copyFrom(bytes, offset, offset + 4) .readUInt32BE(0); offset += 4; this.transaction = (0, exports.SelectTxClass)(txtype); return this.transaction.fromBuffer(bytes, offset); } /** * Signs this [[UnsignedTx]] and returns signed [[StandardTx]] * * @param kc An [[KeyChain]] used in signing * * @returns A signed [[StandardTx]] */ sign(kc) { const txbuff = this.toBuffer(); const msg = buffer_1.Buffer.from((0, create_hash_1.default)("sha256").update(txbuff).digest()); const creds = kc instanceof common_1.MultisigKeyChain ? kc.getCredentials() : this.transaction.sign(msg, kc); return new Tx(this, creds); } } exports.UnsignedTx = UnsignedTx; class Tx extends common_1.StandardTx { constructor() { super(...arguments); this._typeName = "Tx"; this._typeID = undefined; } //serialize is inherited deserialize(fields, encoding = "hex") { super.deserialize(fields, encoding); this.unsignedTx = new UnsignedTx(); this.unsignedTx.deserialize(fields["unsignedTx"], encoding); this.credentials = []; for (let i = 0; i < fields["credentials"].length; i++) { const cred = (0, credentials_1.SelectCredentialClass)(fields["credentials"][`${i}`]["_typeID"]); cred.deserialize(fields["credentials"][`${i}`], encoding); this.credentials.push(cred); } } /** * Takes a {@link https://github.com/feross/buffer|Buffer} containing an [[Tx]], parses it, populates the class, and returns the length of the Tx in bytes. * * @param bytes A {@link https://github.com/feross/buffer|Buffer} containing a raw [[Tx]] * @param offset A number representing the starting point of the bytes to begin parsing * * @returns The length of the raw [[Tx]] */ fromBuffer(bytes, offset = 0) { this.unsignedTx = new UnsignedTx(); offset = this.unsignedTx.fromBuffer(bytes, offset); const numcreds = bintools .copyFrom(bytes, offset, offset + 4) .readUInt32BE(0); offset += 4; this.credentials = []; for (let i = 0; i < numcreds; i++) { const credid = bintools .copyFrom(bytes, offset, offset + 4) .readUInt32BE(0); offset += 4; const cred = (0, credentials_1.SelectCredentialClass)(credid); offset = cred.fromBuffer(bytes, offset); this.credentials.push(cred); } return offset; } } exports.Tx = Tx; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpcy9wbGF0Zm9ybXZtL3R4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7R0FHRztBQUNILG9DQUFnQztBQUNoQyw4REFBb0M7QUFDcEMseUNBTXFCO0FBRXJCLG9FQUEyQztBQUMzQywrQ0FBcUQ7QUFFckQsMkRBQXVEO0FBQ3ZELG1EQUErQztBQUMvQyxxREFBaUQ7QUFDakQsaUVBQTZEO0FBQzdELDJDQUF1QztBQUN2QyxxQ0FBaUM7QUFDakMsdUNBQW1DO0FBQ25DLDJDQUFpRDtBQUNqRCxxREFBaUQ7QUFDakQsK0NBQXFEO0FBQ3JELDJDQUF1QztBQUN2Qyx5Q0FBcUM7QUFDckMseUNBQXFDO0FBQ3JDLHVEQUFtRDtBQUNuRCxxREFBaUQ7QUFDakQsaURBSXVCO0FBQ3ZCLHVEQUFtRDtBQUVuRDs7R0FFRztBQUNILE1BQU0sUUFBUSxHQUFhLGtCQUFRLENBQUMsV0FBVyxFQUFFLENBQUE7QUFFakQ7Ozs7OztHQU1HO0FBQ0ksTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFjLEVBQUUsR0FBRyxJQUFXLEVBQVUsRUFBRTtJQUN0RSxJQUFJLE1BQU0sS0FBSywrQkFBbUIsQ0FBQyxNQUFNLEVBQUU7UUFDekMsT0FBTyxJQUFJLGVBQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO0tBQzNCO1NBQU0sSUFBSSxNQUFNLEtBQUssK0JBQW1CLENBQUMsUUFBUSxFQUFFO1FBQ2xELE9BQU8sSUFBSSxtQkFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUE7S0FDN0I7U0FBTSxJQUFJLE1BQU0sS0FBSywrQkFBbUIsQ0FBQyxRQUFRLEVBQUU7UUFDbEQsT0FBTyxJQUFJLG1CQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtLQUM3QjtTQUFNLElBQUksTUFBTSxLQUFLLCtCQUFtQixDQUFDLGNBQWMsRUFBRTtRQUN4RCxPQUFPLElBQUksNkJBQWMsQ0FB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LEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7YUFDbkMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2xCLE1BQU0sSUFBSSxDQUFDLENBQUE7UUFDWCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQTtRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLE1BQU0sTUFBTSxHQUFXLFFBQVE7aUJBQzVCLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7aUJBQ25DLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNsQixNQUFNLElBQUksQ0FBQyxDQUFBO1lBQ1gsTUFBTSxJQUFJLEdBQWUsSUFBQSxtQ0FBcUIsRUFBQyxNQUFNLENBQUMsQ0FBQTtZQUN0RCxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7U0FDNUI7UUFDRCxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7Q0FDRjtBQS9DRCxnQkErQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogQG1vZHVsZSBBUEktUGxhdGZvcm1WTS1UcmFuc2FjdGlvbnNcbiAqL1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcImJ1ZmZlci9cIlxuaW1wb3J0IGNyZWF0ZUhhc2ggZnJvbSBcImNyZWF0ZS1oYXNoXCJcbmltcG9ydCB7XG4gIE11bHRpc2lnS2V5Q2hhaW4sXG4gIFNpZ25lcktleUNoYWluLFxuICBTaWduZXJLZXlQYWlyLFxuICBTdGFuZGFyZFR4LFxuICBTdGFuZGFyZFVuc2lnbmVkVHhcbn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiXG5pbXBvcnQgeyBDcmVkZW50aWFsIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9jcmVkZW50aWFsc1wiXG5pbXBvcnQgQmluVG9vbHMgZnJvbSBcIi4uLy4uL3V0aWxzL2JpbnRvb2xzXCJcbmltcG9ydCB7IFRyYW5zYWN0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZXJyb3JzXCJcbmltcG9ydCB7IFNlcmlhbGl6ZWRFbmNvZGluZyB9IGZyb20gXCIuLi8uLi91dGlscy9zZXJpYWxpemF0aW9uXCJcbmltcG9ydCB7IEFkZERlcG9zaXRPZmZlclR4IH0gZnJvbSBcIi4vYWRkZGVwb3NpdG9mZmVydHhcIlxuaW1wb3J0IHsgQWRkUHJvcG9zYWxUeCB9IGZyb20gXCIuL2FkZHByb3Bvc2FsdHhcIlxuaW1wb3J0IHsgQWRkcmVzc1N0YXRlVHggfSBmcm9tIFwiLi9hZGRyZXNzc3RhdGV0eFwiXG5pbXBvcnQgeyBBZGRTdWJuZXRWYWxpZGF0b3JUeCB9IGZyb20gXCIuL2FkZHN1Ym5ldHZhbGlkYXRvcnR4XCJcbmltcG9ydCB7IEFkZFZvdGVUeCB9IGZyb20gXCIuL2FkZHZvdGV0eFwiXG5pbXBvcnQgeyBCYXNlVHggfSBmcm9tIFwiLi9iYXNldHhcIlxuaW1wb3J0IHsgQ2xhaW1UeCB9IGZyb20gXCIuL2NsYWltdHhcIlxuaW1wb3J0IHsgUGxhdGZvcm1WTUNvbnN0YW50cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiXG5pbXBvcnQgeyBDcmVhdGVTdWJuZXRUeCB9IGZyb20gXCIuL2NyZWF0ZXN1Ym5ldHR4XCJcbmltcG9ydCB7IFNlbGVjdENyZWRlbnRpYWxDbGFzcyB9IGZyb20gXCIuL2NyZWRlbnRpYWxzXCJcbmltcG9ydCB7IERlcG9zaXRUeCB9IGZyb20gXCIuL2RlcG9zaXRUeFwiXG5pbXBvcnQgeyBFeHBvcnRUeCB9IGZyb20gXCIuL2V4cG9ydHR4XCJcbmltcG9ydCB7IEltcG9ydFR4IH0gZnJvbSBcIi4vaW1wb3J0dHhcIlxuaW1wb3J0IHsgTXVsdGlzaWdBbGlhc1R4IH0gZnJvbSBcIi4vbXVsdGlzaWdhbGlhc3R4XCJcbmltcG9ydCB7IFJlZ2lzdGVyTm9kZVR4IH0gZnJvbSBcIi4vcmVnaXN0ZXJub2RldHhcIlxuaW1wb3J0IHtcbiAgQWRkRGVsZWdhdG9yVHgsXG4gIEFkZFZhbGlkYXRvclR4LFxuICBDYW1pbm9BZGRWYWxpZGF0b3JUeFxufSBmcm9tIFwiLi92YWxpZGF0aW9udHhcIlxuaW1wb3J0IHsgVW5sb2NrRGVwb3NpdFR4IH0gZnJvbSBcIi4vdW5sb2NrZGVwb3NpdHR4XCJcblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmNvbnN0IGJpbnRvb2xzOiBCaW5Ub29scyA9IEJpblRvb2xzLmdldEluc3RhbmNlKClcblxuLyoqXG4gKiBUYWtlcyBhIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIG91dHB1dCBhbmQgcmV0dXJucyB0aGUgcHJvcGVyIFtbQmFzZVR4XV0gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHR4dHlwZSBUaGUgaWQgb2YgdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAqXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBhbiBbW0Jhc2VUeF1dLWV4dGVuZGVkIGNsYXNzLlxuICovXG5leHBvcnQgY29uc3QgU2VsZWN0VHhDbGFzcyA9ICh0eHR5cGU6IG51bWJlciwgLi4uYXJnczogYW55W10pOiBCYXNlVHggPT4ge1xuICBpZiAodHh0eXBlID09PSBQbGF0Zm9ybVZNQ29uc3RhbnRzLkJBU0VUWCkge1xuICAgIHJldHVybiBuZXcgQmFzZVR4KC4uLmFyZ3MpXG4gIH0gZWxzZSBpZiAodHh0eXBlID09PSBQbGF0Zm9ybVZNQ29uc3RhbnRzLklNUE9SVFRYKSB7XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRUeCguLi5hcmdzKVxuICB9IGVsc2UgaWYgKHR4dHlwZSA9PT0gUGxhdGZvcm1WTUNvbnN0YW50cy5FWFBPUlRUWCkge1xuICAgIHJldHVybiBuZXcgRXhwb3J0VHgoLi4uYXJncylcbiAgfSBlbHNlIGlmICh0eHR5cGUgPT09IFBsYXRmb3JtVk1Db25zdGFudHMuQUREREVMRUdBVE9SVFgpIHtcbiAgICByZXR1cm4gbmV3IEFkZERlbGVnYXRvclR4KC4uLmFyZ3MpXG4gIH0gZWxzZSBpZiAodHh0eXBlID09PSBQbGF0Zm9ybVZNQ29uc3RhbnRzLkFERFZBTElEQVRPUlRYKSB7XG4gICAgcmV0dXJuIG5ldyBBZGRWYWxpZGF0b3JUeCguLi5hcmdzKVxuICB9IGVsc2UgaWYgKHR4dHlwZSA9PT0gUGxhdGZvcm1WTUNvbnN0YW50cy5DQU1JTk9BRERWQUxJREFUT1JUWCkge1xuICAgIHJldHVybiBuZXcgQ2FtaW5vQWRkVmFsaWRhdG9yVHgoLi4uYXJncylcbiAgfSBlbHNlIGlmICh0eHR5cGUgPT09IFBsYXRmb3JtVk1Db25zdGFudHMuQ1JFQVRFU1VCTkVUVFgpIHtcbiAgICByZXR1cm4gbmV3IENyZWF0ZVN1Ym5ldFR4KC4uLmFyZ3MpXG4gIH0gZWxzZSBpZiAodHh0eXBlID09PSBQbGF0Zm9ybVZNQ29uc3RhbnRzLkFERFNVQk5FVFZBTElEQVRPUlRYKSB7XG4gICAgcmV0dXJuIG5ldyBBZGRTdWJuZXRWYWxpZGF0b3JUeCguLi5hcmdzKVxuICB9IGVsc2UgaWYgKHR4dHlwZSA9PT0gUGxhdGZvcm1WTUNvbnN0YW50cy5SRUdJU1RFUk5PREVUWCkge1xuICAgIHJldHVybiBuZXcgUmVnaXN0ZXJOb2RlVHgoLi4uYXJncylcbiAgfSBlbHNlIGlmICh0eHR5cGUgPT09IFBsYXRmb3JtVk1Db25zdGFudHMuREVQT1NJVFRYKSB7XG4gICAgcmV0dXJuIG5ldyBEZXBvc2l0VHgoLi4uYXJncylcbiAgfSBlbHNlIGlmICh0eHR5cGUgPT09IFBsYXRmb3JtVk1Db25zdGFudHMuQUREUkVTU1NUQVRFVFgpIHtcbiAgICByZXR1cm4gbmV3IEFkZHJlc3NTdGF0ZVR4KC4uLmFyZ3MpXG4gIH0gZWxzZSBpZiAodHh0eXBlID09PSBQbGF0Zm9ybVZNQ29uc3RhbnRzLkNMQUlNVFgpIHtcbiAgICByZXR1cm4gbmV3IENsYWltVHgoLi4uYXJncylcbiAgfSBlbHNlIGlmICh0eHR5cGUgPT09IFBsYXRmb3JtVk1Db25zdGFudHMuVU5MT0NLREVQT1NJVFRYKSB7XG4gICAgcmV0dXJuIG5ldyBVbmxvY2tEZXBvc2l0VHgoLi4uYXJncylcbiAgfSBlbHNlIGlmICh0eHR5cGUgPT09IFBsYXRmb3JtVk1Db25zdGFudHMuTVVMVElTSUdBTElBU1RYKSB7XG4gICAgcmV0dXJuIG5ldyBNdWx0aXNpZ0FsaWFzVHgoLi4uYXJncylcbiAgfSBlbHNlIGlmICh0eHR5cGUgPT09IFBsYXRmb3JtVk1Db25zdGFudHMuQUREREVQT1NJVE9GRkVSVFgpIHtcbiAgICByZXR1cm4gbmV3IEFkZERlcG9zaXRPZmZlclR4KC4uLmFyZ3MpXG4gIH0gZWxzZSBpZiAodHh0eXBlID09PSBQbGF0Zm9ybVZNQ29uc3RhbnRzLkFERFBST1BPU0FMVFgpIHtcbiAgICByZXR1cm4gbmV3IEFkZFByb3Bvc2FsVHgoLi4uYXJncylcbiAgfSBlbHNlIGlmICh0eHR5cGUgPT09IFBsYXRmb3JtVk1Db25zdGFudHMuQUREVk9URVRYKSB7XG4gICAgcmV0dXJuIG5ldyBBZGRWb3RlVHgoLi4uYXJncylcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICB0aHJvdyBuZXcgVHJhbnNhY3Rpb25FcnJvcihcIkVycm9yIC0gU2VsZWN0VHhDbGFzczogdW5rbm93biB0eHR5cGVcIilcbn1cblxuZXhwb3J0IGNsYXNzIFVuc2lnbmVkVHggZXh0ZW5kcyBTdGFuZGFyZFVuc2lnbmVkVHg8XG4gIFNpZ25lcktleVBhaXIsXG4gIFNpZ25lcktleUNoYWluLFxuICBCYXNlVHhcbj4ge1xuICBwcm90ZWN0ZWQgX3R5cGVOYW1lID0gXCJVbnNpZ25lZFR4XCJcbiAgcHJvdGVjdGVkIF90eXBlSUQgPSB1bmRlZmluZWRcblxuICAvL3NlcmlhbGl6ZSBpcyBpbmhlcml0ZWRcblxuICBkZXNlcmlhbGl6ZShmaWVsZHM6IG9iamVjdCwgZW5jb2Rpbmc6IFNlcmlhbGl6ZWRFbmNvZGluZyA9IFwiaGV4XCIpIHtcbiAgICBzdXBlci5kZXNlcmlhbGl6ZShmaWVsZHMsIGVuY29kaW5nKVxuICAgIHRoaXMudHJhbnNhY3Rpb24gPSBTZWxlY3RUeENsYXNzKGZpZWxkc1tcInRyYW5zYWN0aW9uXCJdW1wiX3R5cGVJRFwiXSlcbiAgICB0aGlzLnRyYW5zYWN0aW9uLmRlc2VyaWFsaXplKGZpZWxkc1tcInRyYW5zYWN0aW9uXCJdLCBlbmNvZGluZylcbiAgfVxuXG4gIGdldFRyYW5zYWN0aW9uKCk6IEJhc2VUeCB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24gYXMgQmFzZVR4XG4gIH1cblxuICBmcm9tQnVmZmVyKGJ5dGVzOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gICAgdGhpcy5jb2RlY0lEID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgMikucmVhZFVJbnQxNkJFKDApXG4gICAgb2Zmc2V0ICs9IDJcbiAgICBjb25zdCB0eHR5cGU6IG51bWJlciA9IGJpbnRvb2xzXG4gICAgICAuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNClcbiAgICAgIC5yZWFkVUludDMyQkUoMClcbiAgICBvZmZzZXQgKz0gNFxuICAgIHRoaXMudHJhbnNhY3Rpb24gPSBTZWxlY3RUeENsYXNzKHR4dHlwZSlcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5mcm9tQnVmZmVyKGJ5dGVzLCBvZmZzZXQpXG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdGhpcyBbW1Vuc2lnbmVkVHhdXSBhbmQgcmV0dXJucyBzaWduZWQgW1tTdGFuZGFyZFR4XV1cbiAgICpcbiAgICogQHBhcmFtIGtjIEFuIFtbS2V5Q2hhaW5dXSB1c2VkIGluIHNpZ25pbmdcbiAgICpcbiAgICogQHJldHVybnMgQSBzaWduZWQgW1tTdGFuZGFyZFR4XV1cbiAgICovXG4gIHNpZ24oa2M6IFNpZ25lcktleUNoYWluKTogVHgge1xuICAgIGNvbnN0IHR4YnVmZiA9IHRoaXMudG9CdWZmZXIoKVxuICAgIGNvbnN0IG1zZzogQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gICAgICBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZSh0eGJ1ZmYpLmRpZ2VzdCgpXG4gICAgKVxuXG4gICAgY29uc3QgY3JlZHM6IENyZWRlbnRpYWxbXSA9XG4gICAgICBrYyBpbnN0YW5jZW9mIE11bHRpc2lnS2V5Q2hhaW5cbiAgICAgICAgPyBrYy5nZXRDcmVkZW50aWFscygpXG4gICAgICAgIDogdGhpcy50cmFuc2FjdGlvbi5zaWduKG1zZywga2MpXG4gICAgcmV0dXJuIG5ldyBUeCh0aGlzLCBjcmVkcylcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHggZXh0ZW5kcyBTdGFuZGFyZFR4PFNpZ25lcktleVBhaXIsIFNpZ25lcktleUNoYWluLCBVbnNpZ25lZFR4PiB7XG4gIHByb3RlY3RlZCBfdHlwZU5hbWUgPSBcIlR4XCJcbiAgcHJvdGVjdGVkIF90eXBlSUQgPSB1bmRlZmluZWRcblxuICAvL3NlcmlhbGl6ZSBpcyBpbmhlcml0ZWRcblxuICBkZXNlcmlhbGl6ZShmaWVsZHM6IG9iamVjdCwgZW5jb2Rpbmc6IFNlcmlhbGl6ZWRFbmNvZGluZyA9IFwiaGV4XCIpIHtcbiAgICBzdXBlci5kZXNlcmlhbGl6ZShmaWVsZHMsIGVuY29kaW5nKVxuICAgIHRoaXMudW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KClcbiAgICB0aGlzLnVuc2lnbmVkVHguZGVzZXJpYWxpemUoZmllbGRzW1widW5zaWduZWRUeFwiXSwgZW5jb2RpbmcpXG4gICAgdGhpcy5jcmVkZW50aWFscyA9IFtdXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGZpZWxkc1tcImNyZWRlbnRpYWxzXCJdLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjcmVkOiBDcmVkZW50aWFsID0gU2VsZWN0Q3JlZGVudGlhbENsYXNzKFxuICAgICAgICBmaWVsZHNbXCJjcmVkZW50aWFsc1wiXVtgJHtpfWBdW1wiX3R5cGVJRFwiXVxuICAgICAgKVxuICAgICAgY3JlZC5kZXNlcmlhbGl6ZShmaWVsZHNbXCJjcmVkZW50aWFsc1wiXVtgJHtpfWBdLCBlbmNvZGluZylcbiAgICAgIHRoaXMuY3JlZGVudGlhbHMucHVzaChjcmVkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IGNvbnRhaW5pbmcgYW4gW1tUeF1dLCBwYXJzZXMgaXQsIHBvcHVsYXRlcyB0aGUgY2xhc3MsIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIFR4IGluIGJ5dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gYnl0ZXMgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIGEgcmF3IFtbVHhdXVxuICAgKiBAcGFyYW0gb2Zmc2V0IEEgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGJ5dGVzIHRvIGJlZ2luIHBhcnNpbmdcbiAgICpcbiAgICogQHJldHVybnMgVGhlIGxlbmd0aCBvZiB0aGUgcmF3IFtbVHhdXVxuICAgKi9cbiAgZnJvbUJ1ZmZlcihieXRlczogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciA9IDApOiBudW1iZXIge1xuICAgIHRoaXMudW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KClcbiAgICBvZmZzZXQgPSB0aGlzLnVuc2lnbmVkVHguZnJvbUJ1ZmZlcihieXRlcywgb2Zmc2V0KVxuICAgIGNvbnN0IG51bWNyZWRzOiBudW1iZXIgPSBiaW50b29sc1xuICAgICAgLmNvcHlGcm9tKGJ5dGVzLCBvZmZzZXQsIG9mZnNldCArIDQpXG4gICAgICAucmVhZFVJbnQzMkJFKDApXG4gICAgb2Zmc2V0ICs9IDRcbiAgICB0aGlzLmNyZWRlbnRpYWxzID0gW11cbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbnVtY3JlZHM7IGkrKykge1xuICAgICAgY29uc3QgY3JlZGlkOiBudW1iZXIgPSBiaW50b29sc1xuICAgICAgICAuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNClcbiAgICAgICAgLnJlYWRVSW50MzJCRSgwKVxuICAgICAgb2Zmc2V0ICs9IDRcbiAgICAgIGNvbnN0IGNyZWQ6IENyZWRlbnRpYWwgPSBTZWxlY3RDcmVkZW50aWFsQ2xhc3MoY3JlZGlkKVxuICAgICAgb2Zmc2V0ID0gY3JlZC5mcm9tQnVmZmVyKGJ5dGVzLCBvZmZzZXQpXG4gICAgICB0aGlzLmNyZWRlbnRpYWxzLnB1c2goY3JlZClcbiAgICB9XG4gICAgcmV0dXJuIG9mZnNldFxuICB9XG59XG4iXX0=