@bitgo-beta/utxo-lib
Version:
Client-side Bitcoin JavaScript library
109 lines • 15.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DashTransaction = void 0;
const bufferutils_1 = require("bitcoinjs-lib/src/bufferutils");
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
const UtxoTransaction_1 = require("../UtxoTransaction");
const networks_1 = require("../../networks");
class DashTransaction extends UtxoTransaction_1.UtxoTransaction {
constructor(network, tx, amountType) {
super(network, tx, amountType);
this.type = 0;
if (!networks_1.isDash(network)) {
throw new Error(`invalid network`);
}
if (tx) {
this.version = tx.version;
if (tx instanceof DashTransaction) {
this.type = tx.type;
this.extraPayload = tx.extraPayload;
}
}
// since `__toBuffer` is private we have to do a little hack here
this.__toBuffer = this.toBufferWithExtraPayload;
}
static newTransaction(network, transaction, amountType) {
return new DashTransaction(network, transaction, amountType);
}
static fromBuffer(buffer, noStrict, amountType = 'number', network) {
const tx = super.fromBuffer(buffer, true, amountType, network);
tx.type = tx.version >> 16;
tx.version = tx.version & 0xffff;
if (tx.byteLength() !== buffer.length) {
const bufferReader = new bufferutils_1.BufferReader(buffer, tx.byteLength());
tx.extraPayload = bufferReader.readVarSlice();
}
return tx;
}
clone(amountType) {
return new DashTransaction(this.network, this, amountType);
}
byteLength(_ALLOW_WITNESS) {
return super.byteLength(_ALLOW_WITNESS) + (this.extraPayload ? UtxoTransaction_1.varSliceSize(this.extraPayload) : 0);
}
/**
* Helper to override `__toBuffer()` of bitcoinjs.Transaction.
* Since the method is private, we use a hack in the constructor to make it work.
*
* TODO: remove `private` modifier in bitcoinjs `__toBuffer()` or find some other solution
*
* @param buffer - optional target buffer
* @param initialOffset - can only be undefined or 0. Other values are only used for serialization in blocks.
* @param _ALLOW_WITNESS - ignored
*/
toBufferWithExtraPayload(buffer, initialOffset, _ALLOW_WITNESS = false) {
// We can ignore the `_ALLOW_WITNESS` parameter here since it has no effect.
if (!buffer) {
buffer = Buffer.allocUnsafe(this.byteLength(false));
}
if (initialOffset !== undefined && initialOffset !== 0) {
throw new Error(`not supported`);
}
// Start out with regular bitcoin byte sequence.
// This buffer will have excess size because it uses `byteLength()` to allocate.
const baseBuffer = bitcoinjs_lib_1.Transaction.prototype.__toBuffer.call(this);
baseBuffer.copy(buffer);
// overwrite leading version bytes (uint16 version, uint16 type)
const bufferWriter = new bufferutils_1.BufferWriter(buffer, 0);
bufferWriter.writeUInt32((this.version & 0xffff) | (this.type << 16));
// Seek to end of original byte sequence and add extraPayload.
// We must use the byteLength as calculated by the bitcoinjs implementation since
// `baseBuffer` has an excess size.
if (this.extraPayload) {
bufferWriter.offset = bitcoinjs_lib_1.Transaction.prototype.byteLength.call(this);
bufferWriter.writeVarSlice(this.extraPayload);
}
return buffer;
}
getHash(forWitness) {
if (forWitness) {
throw new Error(`invalid argument`);
}
return bitcoinjs_lib_1.crypto.hash256(this.toBuffer());
}
/**
* Build a hash for all or none of the transaction inputs depending on the hashtype
* @param hashType
* @returns Buffer
*/
getPrevoutHash(hashType) {
if (!(hashType & UtxoTransaction_1.UtxoTransaction.SIGHASH_ANYONECANPAY)) {
const bufferWriter = new bufferutils_1.BufferWriter(Buffer.allocUnsafe(36 * this.ins.length));
this.ins.forEach(function (txIn) {
bufferWriter.writeSlice(txIn.hash);
bufferWriter.writeUInt32(txIn.index);
});
return bitcoinjs_lib_1.crypto.hash256(bufferWriter.buffer);
}
return Buffer.alloc(32, 0);
}
}
exports.DashTransaction = DashTransaction;
DashTransaction.DASH_NORMAL = 0;
DashTransaction.DASH_PROVIDER_REGISTER = 1;
DashTransaction.DASH_PROVIDER_UPDATE_SERVICE = 2;
DashTransaction.DASH_PROVIDER_UPDATE_REGISTRAR = 3;
DashTransaction.DASH_PROVIDER_UPDATE_REVOKE = 4;
DashTransaction.DASH_COINBASE = 5;
DashTransaction.DASH_QUORUM_COMMITMENT = 6;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGFzaFRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL2Rhc2gvRGFzaFRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtEQUEyRTtBQUMzRSxpREFBK0Q7QUFFL0Qsd0RBQW1FO0FBQ25FLDZDQUFpRDtBQUVqRCxNQUFhLGVBQTBELFNBQVEsaUNBQXdCO0lBWXJHLFlBQVksT0FBZ0IsRUFBRSxFQUFpQyxFQUFFLFVBQWdDO1FBQy9GLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBSjFCLFNBQUksR0FBRyxDQUFDLENBQUM7UUFNZCxJQUFJLENBQUMsaUJBQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDcEM7UUFFRCxJQUFJLEVBQUUsRUFBRTtZQUNOLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUUxQixJQUFJLEVBQUUsWUFBWSxlQUFlLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDO2FBQ3JDO1NBQ0Y7UUFFRCxpRUFBaUU7UUFDaEUsSUFBWSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDM0QsQ0FBQztJQUVTLE1BQU0sQ0FBQyxjQUFjLENBQzdCLE9BQWdCLEVBQ2hCLFdBQThDLEVBQzlDLFVBQWdDO1FBRWhDLE9BQU8sSUFBSSxlQUFlLENBQVUsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FDZixNQUFjLEVBQ2QsUUFBaUIsRUFDakIsYUFBa0MsUUFBUSxFQUMxQyxPQUFnQjtR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QUFDLEVBQUU7WUFDdEQsTUFBTSxZQUFZLEdBQUcsSUFBSSwwQkFBWSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUVoRixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUk7Z0JBQzdCLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuQyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sc0JBQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzdDO1FBRUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDOztBQWpJSCwwQ0FrSUM7QUFqSVEsMkJBQVcsR0FBRyxDQUFDLENBQUM7QUFDaEIsc0NBQXNCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLDRDQUE0QixHQUFHLENBQUMsQ0FBQztBQUNqQyw4Q0FBOEIsR0FBRyxDQUFDLENBQUM7QUFDbkMsMkNBQTJCLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLDZCQUFhLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLHNDQUFzQixHQUFHLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlclJlYWRlciwgQnVmZmVyV3JpdGVyIH0gZnJvbSAnYml0Y29pbmpzLWxpYi9zcmMvYnVmZmVydXRpbHMnO1xuaW1wb3J0IHsgY3J5cHRvIGFzIGJjcnlwdG8sIFRyYW5zYWN0aW9uIH0gZnJvbSAnYml0Y29pbmpzLWxpYic7XG5cbmltcG9ydCB7IFV0eG9UcmFuc2FjdGlvbiwgdmFyU2xpY2VTaXplIH0gZnJvbSAnLi4vVXR4b1RyYW5zYWN0aW9uJztcbmltcG9ydCB7IGlzRGFzaCwgTmV0d29yayB9IGZyb20gJy4uLy4uL25ldHdvcmtzJztcblxuZXhwb3J0IGNsYXNzIERhc2hUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIFV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gIHN0YXRpYyBEQVNIX05PUk1BTCA9IDA7XG4gIHN0YXRpYyBEQVNIX1BST1ZJREVSX1JFR0lTVEVSID0gMTtcbiAgc3RhdGljIERBU0hfUFJPVklERVJfVVBEQVRFX1NFUlZJQ0UgPSAyO1xuICBzdGF0aWMgREFTSF9QUk9WSURFUl9VUERBVEVfUkVHSVNUUkFSID0gMztcbiAgc3RhdGljIERBU0hfUFJPVklERVJfVVBEQVRFX1JFVk9LRSA9IDQ7XG4gIHN0YXRpYyBEQVNIX0NPSU5CQVNFID0gNTtcbiAgc3RhdGljIERBU0hfUVVPUlVNX0NPTU1JVE1FTlQgPSA2O1xuXG4gIHB1YmxpYyB0eXBlID0gMDtcbiAgcHVibGljIGV4dHJhUGF5bG9hZD86IEJ1ZmZlcjtcblxuICBjb25zdHJ1Y3RvcihuZXR3b3JrOiBOZXR3b3JrLCB0eD86IFRyYW5zYWN0aW9uPGJpZ2ludCB8IG51bWJlcj4sIGFtb3VudFR5cGU/OiAnYmlnaW50JyB8ICdudW1iZXInKSB7XG4gICAgc3VwZXIobmV0d29yaywgdHgsIGFtb3VudFR5cGUpO1xuXG4gICAgaWYgKCFpc0Rhc2gobmV0d29yaykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBuZXR3b3JrYCk7XG4gICAgfVxuXG4gICAgaWYgKHR4KSB7XG4gICAgICB0aGlzLnZlcnNpb24gPSB0eC52ZXJzaW9uO1xuXG4gICAgICBpZiAodHggaW5zdGFuY2VvZiBEYXNoVHJhbnNhY3Rpb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHgudHlwZTtcbiAgICAgICAgdGhpcy5leHRyYVBheWxvYWQgPSB0eC5leHRyYVBheWxvYWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2luY2UgYF9fdG9CdWZmZXJgIGlzIHByaXZhdGUgd2UgaGF2ZSB0byBkbyBhIGxpdHRsZSBoYWNrIGhlcmVcbiAgICAodGhpcyBhcyBhbnkpLl9fdG9CdWZmZXIgPSB0aGlzLnRvQnVmZmVyV2l0aEV4dHJhUGF5bG9hZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgbmV3VHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgbmV0d29yazogTmV0d29yayxcbiAgICB0cmFuc2FjdGlvbj86IERhc2hUcmFuc2FjdGlvbjxudW1iZXIgfCBiaWdpbnQ+LFxuICAgIGFtb3VudFR5cGU/OiAnbnVtYmVyJyB8ICdiaWdpbnQnXG4gICk6IERhc2hUcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gICAgcmV0dXJuIG5ldyBEYXNoVHJhbnNhY3Rpb248VE51bWJlcj4obmV0d29yaywgdHJhbnNhY3Rpb24sIGFtb3VudFR5cGUpO1xuICB9XG5cbiAgc3RhdGljIGZyb21CdWZmZXI8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgYnVmZmVyOiBCdWZmZXIsXG4gICAgbm9TdHJpY3Q6IGJvb2xlYW4sXG4gICAgYW1vdW50VHlwZTogJ251bWJlcicgfCAnYmlnaW50JyA9ICdudW1iZXInLFxuICAgIG5ldHdvcms6IE5ldHdvcmtcbiAgKTogRGFzaFRyYW5zYWN0aW9uPFROdW1iZXI+IHtcbiAgICBjb25zdCB0eCA9IHN1cGVyLmZyb21CdWZmZXI8VE51bWJlcj4oYnVmZmVyLCB0cnVlLCBhbW91bnRUeXBlLCBuZXR3b3JrKSBhcyBEYXNoVHJhbnNhY3Rpb248VE51bWJlcj47XG4gICAgdHgudHlwZSA9IHR4LnZlcnNpb24gPj4gMTY7XG4gICAgdHgudmVyc2lvbiA9IHR4LnZlcnNpb24gJiAweGZmZmY7XG4gICAgaWYgKHR4LmJ5dGVMZW5ndGgoKSAhPT0gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgY29uc3QgYnVmZmVyUmVhZGVyID0gbmV3IEJ1ZmZlclJlYWRlcihidWZmZXIsIHR4LmJ5dGVMZW5ndGgoKSk7XG4gICAgICB0eC5leHRyYVBheWxvYWQgPSBidWZmZXJSZWFkZXIucmVhZFZhclNsaWNlKCk7XG4gICAgfVxuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIGNsb25lPFROMiBleHRlbmRzIGJpZ2ludCB8IG51bWJlciA9IFROdW1iZXI+KGFtb3VudFR5cGU/OiAnbnVtYmVyJyB8ICdiaWdpbnQnKTogRGFzaFRyYW5zYWN0aW9uPFROMj4ge1xuICAgIHJldHVybiBuZXcgRGFzaFRyYW5zYWN0aW9uPFROMj4odGhpcy5uZXR3b3JrLCB0aGlzLCBhbW91bnRUeXBlKTtcbiAgfVxuXG4gIGJ5dGVMZW5ndGgoX0FMTE9XX1dJVE5FU1M/OiBib29sZWFuKTogbnVtYmVyIHtcbiAgICByZXR1cm4gc3VwZXIuYnl0ZUxlbmd0aChfQUxMT1dfV0lUTkVTUykgKyAodGhpcy5leHRyYVBheWxvYWQgPyB2YXJTbGljZVNpemUodGhpcy5leHRyYVBheWxvYWQpIDogMCk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIG92ZXJyaWRlIGBfX3RvQnVmZmVyKClgIG9mIGJpdGNvaW5qcy5UcmFuc2FjdGlvbi5cbiAgICogU2luY2UgdGhlIG1ldGhvZCBpcyBwcml2YXRlLCB3ZSB1c2UgYSBoYWNrIGluIHRoZSBjb25zdHJ1Y3RvciB0byBtYWtlIGl0IHdvcmsuXG4gICAqXG4gICAqIFRPRE86IHJlbW92ZSBgcHJpdmF0ZWAgbW9kaWZpZXIgaW4gYml0Y29pbmpzIGBfX3RvQnVmZmVyKClgIG9yIGZpbmQgc29tZSBvdGhlciBzb2x1dGlvblxuICAgKlxuICAgKiBAcGFyYW0gYnVmZmVyIC0gb3B0aW9uYWwgdGFyZ2V0IGJ1ZmZlclxuICAgKiBAcGFyYW0gaW5pdGlhbE9mZnNldCAtIGNhbiBvbmx5IGJlIHVuZGVmaW5lZCBvciAwLiBPdGhlciB2YWx1ZXMgYXJlIG9ubHkgdXNlZCBmb3Igc2VyaWFsaXphdGlvbiBpbiBibG9ja3MuXG4gICAqIEBwYXJhbSBfQUxMT1dfV0lUTkVTUyAtIGlnbm9yZWRcbiAgICovXG4gIHByaXZhdGUgdG9CdWZmZXJXaXRoRXh0cmFQYXlsb2FkKGJ1ZmZlcj86IEJ1ZmZlciwgaW5pdGlhbE9mZnNldD86IG51bWJlciwgX0FMTE9XX1dJVE5FU1MgPSBmYWxzZSk6IEJ1ZmZlciB7XG4gICAgLy8gV2UgY2FuIGlnbm9yZSB0aGUgYF9BTExPV19XSVRORVNTYCBwYXJhbWV0ZXIgaGVyZSBzaW5jZSBpdCBoYXMgbm8gZWZmZWN0LlxuICAgIGlmICghYnVmZmVyKSB7XG4gICAgICBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUodGhpcy5ieXRlTGVuZ3RoKGZhbHNlKSk7XG4gICAgfVxuXG4gICAgaWYgKGluaXRpYWxPZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBpbml0aWFsT2Zmc2V0ICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBzdXBwb3J0ZWRgKTtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBvdXQgd2l0aCByZWd1bGFyIGJpdGNvaW4gYnl0ZSBzZXF1ZW5jZS5cbiAgICAvLyBUaGlzIGJ1ZmZlciB3aWxsIGhhdmUgZXhjZXNzIHNpemUgYmVjYXVzZSBpdCB1c2VzIGBieXRlTGVuZ3RoKClgIHRvIGFsbG9jYXRlLlxuICAgIGNvbnN0IGJhc2VCdWZmZXIgPSAoVHJhbnNhY3Rpb24ucHJvdG90eXBlIGFzIGFueSkuX190b0J1ZmZlci5jYWxsKHRoaXMpO1xuICAgIGJhc2VCdWZmZXIuY29weShidWZmZXIpO1xuXG4gICAgLy8gb3ZlcndyaXRlIGxlYWRpbmcgdmVyc2lvbiBieXRlcyAodWludDE2IHZlcnNpb24sIHVpbnQxNiB0eXBlKVxuICAgIGNvbnN0IGJ1ZmZlcldyaXRlciA9IG5ldyBCdWZmZXJXcml0ZXIoYnVmZmVyLCAwKTtcbiAgICBidWZmZXJXcml0ZXIud3JpdGVVSW50MzIoKHRoaXMudmVyc2lvbiAmIDB4ZmZmZikgfCAodGhpcy50eXBlIDw8IDE2KSk7XG5cbiAgICAvLyBTZWVrIHRvIGVuZCBvZiBvcmlnaW5hbCBieXRlIHNlcXVlbmNlIGFuZCBhZGQgZXh0cmFQYXlsb2FkLlxuICAgIC8vIFdlIG11c3QgdXNlIHRoZSBieXRlTGVuZ3RoIGFzIGNhbGN1bGF0ZWQgYnkgdGhlIGJpdGNvaW5qcyBpbXBsZW1lbnRhdGlvbiBzaW5jZVxuICAgIC8vIGBiYXNlQnVmZmVyYCBoYXMgYW4gZXhjZXNzIHNpemUuXG4gICAgaWYgKHRoaXMuZXh0cmFQYXlsb2FkKSB7XG4gICAgICBidWZmZXJXcml0ZXIub2Zmc2V0ID0gVHJhbnNhY3Rpb24ucHJvdG90eXBlLmJ5dGVMZW5ndGguY2FsbCh0aGlzKTtcbiAgICAgIGJ1ZmZlcldyaXRlci53cml0ZVZhclNsaWNlKHRoaXMuZXh0cmFQYXlsb2FkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmZmVyO1xuICB9XG5cbiAgZ2V0SGFzaChmb3JXaXRuZXNzPzogYm9vbGVhbik6IEJ1ZmZlciB7XG4gICAgaWYgKGZvcldpdG5lc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBhcmd1bWVudGApO1xuICAgIH1cbiAgICByZXR1cm4gYmNyeXB0by5oYXNoMjU2KHRoaXMudG9CdWZmZXIoKSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBoYXNoIGZvciBhbGwgb3Igbm9uZSBvZiB0aGUgdHJhbnNhY3Rpb24gaW5wdXRzIGRlcGVuZGluZyBvbiB0aGUgaGFzaHR5cGVcbiAgICogQHBhcmFtIGhhc2hUeXBlXG4gICAqIEByZXR1cm5zIEJ1ZmZlclxuICAgKi9cbiAgZ2V0UHJldm91dEhhc2goaGFzaFR5cGU6IG51bWJlcik6IEJ1ZmZlciB7XG4gICAgaWYgKCEoaGFzaFR5cGUgJiBVdHhvVHJhbnNhY3Rpb24uU0lHSEFTSF9BTllPTkVDQU5QQVkpKSB7XG4gICAgICBjb25zdCBidWZmZXJXcml0ZXIgPSBuZXcgQnVmZmVyV3JpdGVyKEJ1ZmZlci5hbGxvY1Vuc2FmZSgzNiAqIHRoaXMuaW5zLmxlbmd0aCkpO1xuXG4gICAgICB0aGlzLmlucy5mb3JFYWNoKGZ1bmN0aW9uICh0eEluKSB7XG4gICAgICAgIGJ1ZmZlcldyaXRlci53cml0ZVNsaWNlKHR4SW4uaGFzaCk7XG4gICAgICAgIGJ1ZmZlcldyaXRlci53cml0ZVVJbnQzMih0eEluLmluZGV4KTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmNyeXB0by5oYXNoMjU2KGJ1ZmZlcldyaXRlci5idWZmZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMzIsIDApO1xuICB9XG59XG4iXX0=