PHP WebShell

Текущая директория: /opt/BitGoJS/modules/utxo-lib/dist/src/bitgo/zcash

Просмотр файла: ZcashBufferutils.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.VALUE_INT64_ZERO = void 0;
exports.readInputs = readInputs;
exports.readOutputs = readOutputs;
exports.readEmptyVector = readEmptyVector;
exports.readEmptyOrchardBundle = readEmptyOrchardBundle;
exports.writeEmptyOrchardBundle = writeEmptyOrchardBundle;
exports.readEmptySaplingBundle = readEmptySaplingBundle;
exports.writeEmptySamplingBundle = writeEmptySamplingBundle;
exports.fromBufferV4 = fromBufferV4;
exports.fromBufferV5 = fromBufferV5;
exports.writeInputs = writeInputs;
exports.writeOutputs = writeOutputs;
exports.toBufferV4 = toBufferV4;
exports.toBufferV5 = toBufferV5;
const ZcashTransaction_1 = require("./ZcashTransaction");
exports.VALUE_INT64_ZERO = Buffer.from('0000000000000000', 'hex');
function readInputs(bufferReader) {
    const vinLen = bufferReader.readVarInt();
    const ins = [];
    for (let i = 0; i < vinLen; ++i) {
        ins.push({
            hash: bufferReader.readSlice(32),
            index: bufferReader.readUInt32(),
            script: bufferReader.readVarSlice(),
            sequence: bufferReader.readUInt32(),
            witness: [],
        });
    }
    return ins;
}
function readOutputs(bufferReader, amountType = 'number') {
    const voutLen = bufferReader.readVarInt();
    const outs = [];
    for (let i = 0; i < voutLen; ++i) {
        outs.push({
            value: (amountType === 'bigint' ? bufferReader.readUInt64BigInt() : bufferReader.readUInt64()),
            script: bufferReader.readVarSlice(),
        });
    }
    return outs;
}
function readEmptyVector(bufferReader) {
    const n = bufferReader.readVarInt();
    if (n !== 0) {
        throw new ZcashTransaction_1.UnsupportedTransactionError(`expected empty vector`);
    }
}
function readEmptyOrchardBundle(bufferReader) {
    // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/orchard.h#L66
    // https://github.com/zcash/librustzcash/blob/edcde252de221d4851f1e5145306c2caf95453bc/zcash_primitives/src/transaction/components/orchard.rs#L36
    const v = bufferReader.readUInt8();
    if (v !== 0x00) {
        throw new ZcashTransaction_1.UnsupportedTransactionError(`expected byte 0x00`);
    }
}
function writeEmptyOrchardBundle(bufferWriter) {
    // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/orchard.h#L66
    // https://github.com/zcash/librustzcash/blob/edcde252de221d4851f1e5145306c2caf95453bc/zcash_primitives/src/transaction/components/orchard.rs#L201
    bufferWriter.writeUInt8(0);
}
function readEmptySaplingBundle(bufferReader) {
    // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/transaction.h#L283
    readEmptyVector(bufferReader) /* vSpendsSapling */;
    readEmptyVector(bufferReader) /* vOutputsSapling */;
}
function writeEmptySamplingBundle(bufferWriter) {
    // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/transaction.h#L283
    bufferWriter.writeVarInt(0) /* vSpendsSapling */;
    bufferWriter.writeVarInt(0) /* vOutputsSapling */;
}
function fromBufferV4(bufferReader, tx, amountType = 'number') {
    // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/transaction.h#L855-L857
    tx.ins = readInputs(bufferReader);
    tx.outs = readOutputs(bufferReader, amountType);
    tx.locktime = bufferReader.readUInt32();
    if (tx.isOverwinterCompatible()) {
        tx.expiryHeight = bufferReader.readUInt32();
    }
    if (tx.isSaplingCompatible()) {
        const valueBalance = bufferReader.readSlice(8);
        if (!valueBalance.equals(exports.VALUE_INT64_ZERO)) {
            /* istanbul ignore next */
            throw new ZcashTransaction_1.UnsupportedTransactionError(`valueBalance must be zero`);
        }
        // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/transaction.h#L863
        readEmptySaplingBundle(bufferReader);
    }
    if (tx.supportsJoinSplits()) {
        // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/transaction.h#L869
        readEmptyVector(bufferReader) /* vJoinSplit */;
    }
}
function fromBufferV5(bufferReader, tx, amountType = 'number') {
    // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/transaction.h#L815
    tx.consensusBranchId = bufferReader.readUInt32();
    tx.locktime = bufferReader.readUInt32();
    tx.expiryHeight = bufferReader.readUInt32();
    // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/transaction.h#L828
    tx.ins = readInputs(bufferReader);
    tx.outs = readOutputs(bufferReader, amountType);
    // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/transaction.h#L835
    readEmptySaplingBundle(bufferReader);
    readEmptyOrchardBundle(bufferReader);
}
function writeInputs(bufferWriter, ins) {
    bufferWriter.writeVarInt(ins.length);
    ins.forEach(function (txIn) {
        bufferWriter.writeSlice(txIn.hash);
        bufferWriter.writeUInt32(txIn.index);
        bufferWriter.writeVarSlice(txIn.script);
        bufferWriter.writeUInt32(txIn.sequence);
    });
}
function writeOutputs(bufferWriter, outs) {
    bufferWriter.writeVarInt(outs.length);
    outs.forEach(function (txOut) {
        if (txOut.valueBuffer) {
            bufferWriter.writeSlice(txOut.valueBuffer);
        }
        else {
            bufferWriter.writeUInt64(txOut.value);
        }
        bufferWriter.writeVarSlice(txOut.script);
    });
}
function toBufferV4(bufferWriter, tx) {
    // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/transaction.h#L1083
    writeInputs(bufferWriter, tx.ins);
    writeOutputs(bufferWriter, tx.outs);
    bufferWriter.writeUInt32(tx.locktime);
    if (tx.isOverwinterCompatible()) {
        bufferWriter.writeUInt32(tx.expiryHeight);
    }
    if (tx.isSaplingCompatible()) {
        bufferWriter.writeSlice(exports.VALUE_INT64_ZERO);
        bufferWriter.writeVarInt(0); // vShieldedSpendLength
        bufferWriter.writeVarInt(0); // vShieldedOutputLength
    }
    if (tx.supportsJoinSplits()) {
        bufferWriter.writeVarInt(0); // joinsSplits length
    }
}
function toBufferV5(bufferWriter, tx) {
    // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/transaction.h#L825-L826
    bufferWriter.writeUInt32(tx.consensusBranchId);
    bufferWriter.writeUInt32(tx.locktime);
    bufferWriter.writeUInt32(tx.expiryHeight);
    writeInputs(bufferWriter, tx.ins);
    writeOutputs(bufferWriter, tx.outs);
    // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/transaction.h#L1063
    writeEmptySamplingBundle(bufferWriter);
    // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/transaction.h#L1081
    writeEmptyOrchardBundle(bufferWriter);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWmNhc2hCdWZmZXJ1dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby96Y2FzaC9aY2FzaEJ1ZmZlcnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWNBLGdDQWFDO0FBRUQsa0NBYUM7QUFFRCwwQ0FLQztBQUVELHdEQU9DO0FBRUQsMERBSUM7QUFFRCx3REFJQztBQUVELDREQUlDO0FBRUQsb0NBNkJDO0FBRUQsb0NBaUJDO0FBRUQsa0NBUUM7QUFFRCxvQ0FjQztBQUVELGdDQXVCQztBQUVELGdDQWVDO0FBeExELHlEQUFtRjtBQUV0RSxRQUFBLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFdkUsU0FBZ0IsVUFBVSxDQUFDLFlBQTBCO0lBQ25ELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN6QyxNQUFNLEdBQUcsR0FBYyxFQUFFLENBQUM7SUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2hDLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDUCxJQUFJLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDaEMsS0FBSyxFQUFFLFlBQVksQ0FBQyxVQUFVLEVBQUU7WUFDaEMsTUFBTSxFQUFFLFlBQVksQ0FBQyxZQUFZLEVBQUU7WUFDbkMsUUFBUSxFQUFFLFlBQVksQ0FBQyxVQUFVLEVBQUU7WUFDbkMsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBZ0IsV0FBVyxDQUN6QixZQUEwQixFQUMxQixhQUFrQyxRQUFRO0lBRTFDLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FB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LENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCO0lBQ3BELENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBZ0IsVUFBVSxDQUN4QixZQUEwQixFQUMxQixFQUE2QjtJQUU3QixvRkFBb0Y7SUFDcEYsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMvQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxQyxXQUFXLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxZQUFZLENBQVUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU3QyxnRkFBZ0Y7SUFDaEYsd0JBQXdCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdkMsZ0ZBQWdGO0lBQ2hGLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRyYW5zYWN0aW9uIChkZSlzZXJpYWxpemF0aW9uIGhlbHBlcnMuXG4gKiBPbmx5IHN1cHBvcnRzIGZ1bGwgdHJhbnNwYXJlbnQgdHJhbnNhY3Rpb25zIHdpdGhvdXQgc2hpZWxkZWQgaW5wdXRzIG9yIG91dHB1dHMuXG4gKlxuICogUmVmZXJlbmNlczpcbiAqIC0gaHR0cHM6Ly9naXRodWIuY29tL3pjYXNoL3pjYXNoL2Jsb2IvdjQuNS4xL3NyYy9wcmltaXRpdmVzL3RyYW5zYWN0aW9uLmgjTDc3MVxuICovXG5pbXBvcnQgeyBUeElucHV0LCBUeE91dHB1dCB9IGZyb20gJ2JpdGNvaW5qcy1saWInO1xuaW1wb3J0IHsgQnVmZmVyUmVhZGVyLCBCdWZmZXJXcml0ZXIgfSBmcm9tICdiaXRjb2luanMtbGliL3NyYy9idWZmZXJ1dGlscyc7XG5cbmltcG9ydCB7IFVuc3VwcG9ydGVkVHJhbnNhY3Rpb25FcnJvciwgWmNhc2hUcmFuc2FjdGlvbiB9IGZyb20gJy4vWmNhc2hUcmFuc2FjdGlvbic7XG5cbmV4cG9ydCBjb25zdCBWQUxVRV9JTlQ2NF9aRVJPID0gQnVmZmVyLmZyb20oJzAwMDAwMDAwMDAwMDAwMDAnLCAnaGV4Jyk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkSW5wdXRzKGJ1ZmZlclJlYWRlcjogQnVmZmVyUmVhZGVyKTogVHhJbnB1dFtdIHtcbiAgY29uc3QgdmluTGVuID0gYnVmZmVyUmVhZGVyLnJlYWRWYXJJbnQoKTtcbiAgY29uc3QgaW5zOiBUeElucHV0W10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aW5MZW47ICsraSkge1xuICAgIGlucy5wdXNoKHtcbiAgICAgIGhhc2g6IGJ1ZmZlclJlYWRlci5yZWFkU2xpY2UoMzIpLFxuICAgICAgaW5kZXg6IGJ1ZmZlclJlYWRlci5yZWFkVUludDMyKCksXG4gICAgICBzY3JpcHQ6IGJ1ZmZlclJlYWRlci5yZWFkVmFyU2xpY2UoKSxcbiAgICAgIHNlcXVlbmNlOiBidWZmZXJSZWFkZXIucmVhZFVJbnQzMigpLFxuICAgICAgd2l0bmVzczogW10sXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGlucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRPdXRwdXRzPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICBidWZmZXJSZWFkZXI6IEJ1ZmZlclJlYWRlcixcbiAgYW1vdW50VHlwZTogJ251bWJlcicgfCAnYmlnaW50JyA9ICdudW1iZXInXG4pOiBUeE91dHB1dDxUTnVtYmVyPltdIHtcbiAgY29uc3Qgdm91dExlbiA9IGJ1ZmZlclJlYWRlci5yZWFkVmFySW50KCk7XG4gIGNvbnN0IG91dHM6IFR4T3V0cHV0PFROdW1iZXI+W10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2b3V0TGVuOyArK2kpIHtcbiAgICBvdXRzLnB1c2goe1xuICAgICAgdmFsdWU6IChhbW91bnRUeXBlID09PSAnYmlnaW50JyA/IGJ1ZmZlclJlYWRlci5yZWFkVUludDY0QmlnSW50KCkgOiBidWZmZXJSZWFkZXIucmVhZFVJbnQ2NCgpKSBhcyBUTnVtYmVyLFxuICAgICAgc2NyaXB0OiBidWZmZXJSZWFkZXIucmVhZFZhclNsaWNlKCksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW1wdHlWZWN0b3IoYnVmZmVyUmVhZGVyOiBCdWZmZXJSZWFkZXIpOiB2b2lkIHtcbiAgY29uc3QgbiA9IGJ1ZmZlclJlYWRlci5yZWFkVmFySW50KCk7XG4gIGlmIChuICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkVHJhbnNhY3Rpb25FcnJvcihgZXhwZWN0ZWQgZW1wdHkgdmVjdG9yYCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRFbXB0eU9yY2hhcmRCdW5kbGUoYnVmZmVyUmVhZGVyOiBCdWZmZXJSZWFkZXIpOiB2b2lkIHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3pjYXNoL3pjYXNoL2Jsb2IvdjQuNS4xL3NyYy9wcmltaXRpdmVzL29yY2hhcmQuaCNMNjZcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3pjYXNoL2xpYnJ1c3R6Y2FzaC9ibG9iL2VkY2RlMjUyZGUyMjFkNDg1MWYxZTUxNDUzMDZjMmNhZjk1NDUzYmMvemNhc2hfcHJpbWl0aXZlcy9zcmMvdHJhbnNhY3Rpb24vY29tcG9uZW50cy9vcmNoYXJkLnJzI0wzNlxuICBjb25zdCB2ID0gYnVmZmVyUmVhZGVyLnJlYWRVSW50OCgpO1xuICBpZiAodiAhPT0gMHgwMCkge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZFRyYW5zYWN0aW9uRXJyb3IoYGV4cGVjdGVkIGJ5dGUgMHgwMGApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUVtcHR5T3JjaGFyZEJ1bmRsZShidWZmZXJXcml0ZXI6IEJ1ZmZlcldyaXRlcik6IHZvaWQge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemNhc2gvemNhc2gvYmxvYi92NC41LjEvc3JjL3ByaW1pdGl2ZXMvb3JjaGFyZC5oI0w2NlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemNhc2gvbGlicnVzdHpjYXNoL2Jsb2IvZWRjZGUyNTJkZTIyMWQ0ODUxZjFlNTE0NTMwNmMyY2FmOTU0NTNiYy96Y2FzaF9wcmltaXRpdmVzL3NyYy90cmFuc2FjdGlvbi9jb21wb25lbnRzL29yY2hhcmQucnMjTDIwMVxuICBidWZmZXJXcml0ZXIud3JpdGVVSW50OCgwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRFbXB0eVNhcGxpbmdCdW5kbGUoYnVmZmVyUmVhZGVyOiBCdWZmZXJSZWFkZXIpOiB2b2lkIHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3pjYXNoL3pjYXNoL2Jsb2IvdjQuNS4xL3NyYy9wcmltaXRpdmVzL3RyYW5zYWN0aW9uLmgjTDI4M1xuICByZWFkRW1wdHlWZWN0b3IoYnVmZmVyUmVhZGVyKSAvKiB2U3BlbmRzU2FwbGluZyAqLztcbiAgcmVhZEVtcHR5VmVjdG9yKGJ1ZmZlclJlYWRlcikgLyogdk91dHB1dHNTYXBsaW5nICovO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVFbXB0eVNhbXBsaW5nQnVuZGxlKGJ1ZmZlcldyaXRlcjogQnVmZmVyV3JpdGVyKTogdm9pZCB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96Y2FzaC96Y2FzaC9ibG9iL3Y0LjUuMS9zcmMvcHJpbWl0aXZlcy90cmFuc2FjdGlvbi5oI0wyODNcbiAgYnVmZmVyV3JpdGVyLndyaXRlVmFySW50KDApIC8qIHZTcGVuZHNTYXBsaW5nICovO1xuICBidWZmZXJXcml0ZXIud3JpdGVWYXJJbnQoMCkgLyogdk91dHB1dHNTYXBsaW5nICovO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbUJ1ZmZlclY0PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICBidWZmZXJSZWFkZXI6IEJ1ZmZlclJlYWRlcixcbiAgdHg6IFpjYXNoVHJhbnNhY3Rpb248VE51bWJlcj4sXG4gIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCcgPSAnbnVtYmVyJ1xuKTogdm9pZCB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96Y2FzaC96Y2FzaC9ibG9iL3Y0LjUuMS9zcmMvcHJpbWl0aXZlcy90cmFuc2FjdGlvbi5oI0w4NTUtTDg1N1xuICB0eC5pbnMgPSByZWFkSW5wdXRzKGJ1ZmZlclJlYWRlcik7XG4gIHR4Lm91dHMgPSByZWFkT3V0cHV0czxUTnVtYmVyPihidWZmZXJSZWFkZXIsIGFtb3VudFR5cGUpO1xuICB0eC5sb2NrdGltZSA9IGJ1ZmZlclJlYWRlci5yZWFkVUludDMyKCk7XG5cbiAgaWYgKHR4LmlzT3ZlcndpbnRlckNvbXBhdGlibGUoKSkge1xuICAgIHR4LmV4cGlyeUhlaWdodCA9IGJ1ZmZlclJlYWRlci5yZWFkVUludDMyKCk7XG4gIH1cblxuICBpZiAodHguaXNTYXBsaW5nQ29tcGF0aWJsZSgpKSB7XG4gICAgY29uc3QgdmFsdWVCYWxhbmNlID0gYnVmZmVyUmVhZGVyLnJlYWRTbGljZSg4KTtcbiAgICBpZiAoIXZhbHVlQmFsYW5jZS5lcXVhbHMoVkFMVUVfSU5UNjRfWkVSTykpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRUcmFuc2FjdGlvbkVycm9yKGB2YWx1ZUJhbGFuY2UgbXVzdCBiZSB6ZXJvYCk7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3pjYXNoL3pjYXNoL2Jsb2IvdjQuNS4xL3NyYy9wcmltaXRpdmVzL3RyYW5zYWN0aW9uLmgjTDg2M1xuICAgIHJlYWRFbXB0eVNhcGxpbmdCdW5kbGUoYnVmZmVyUmVhZGVyKTtcbiAgfVxuXG4gIGlmICh0eC5zdXBwb3J0c0pvaW5TcGxpdHMoKSkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96Y2FzaC96Y2FzaC9ibG9iL3Y0LjUuMS9zcmMvcHJpbWl0aXZlcy90cmFuc2FjdGlvbi5oI0w4NjlcbiAgICByZWFkRW1wdHlWZWN0b3IoYnVmZmVyUmVhZGVyKSAvKiB2Sm9pblNwbGl0ICovO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQnVmZmVyVjU8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gIGJ1ZmZlclJlYWRlcjogQnVmZmVyUmVhZGVyLFxuICB0eDogWmNhc2hUcmFuc2FjdGlvbjxUTnVtYmVyPixcbiAgYW1vdW50VHlwZTogJ251bWJlcicgfCAnYmlnaW50JyA9ICdudW1iZXInXG4pOiB2b2lkIHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3pjYXNoL3pjYXNoL2Jsb2IvdjQuNS4xL3NyYy9wcmltaXRpdmVzL3RyYW5zYWN0aW9uLmgjTDgxNVxuICB0eC5jb25zZW5zdXNCcmFuY2hJZCA9IGJ1ZmZlclJlYWRlci5yZWFkVUludDMyKCk7XG4gIHR4LmxvY2t0aW1lID0gYnVmZmVyUmVhZGVyLnJlYWRVSW50MzIoKTtcbiAgdHguZXhwaXJ5SGVpZ2h0ID0gYnVmZmVyUmVhZGVyLnJlYWRVSW50MzIoKTtcblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemNhc2gvemNhc2gvYmxvYi92NC41LjEvc3JjL3ByaW1pdGl2ZXMvdHJhbnNhY3Rpb24uaCNMODI4XG4gIHR4LmlucyA9IHJlYWRJbnB1dHMoYnVmZmVyUmVhZGVyKTtcbiAgdHgub3V0cyA9IHJlYWRPdXRwdXRzPFROdW1iZXI+KGJ1ZmZlclJlYWRlciwgYW1vdW50VHlwZSk7XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3pjYXNoL3pjYXNoL2Jsb2IvdjQuNS4xL3NyYy9wcmltaXRpdmVzL3RyYW5zYWN0aW9uLmgjTDgzNVxuICByZWFkRW1wdHlTYXBsaW5nQnVuZGxlKGJ1ZmZlclJlYWRlcik7XG4gIHJlYWRFbXB0eU9yY2hhcmRCdW5kbGUoYnVmZmVyUmVhZGVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSW5wdXRzKGJ1ZmZlcldyaXRlcjogQnVmZmVyV3JpdGVyLCBpbnM6IFR4SW5wdXRbXSk6IHZvaWQge1xuICBidWZmZXJXcml0ZXIud3JpdGVWYXJJbnQoaW5zLmxlbmd0aCk7XG4gIGlucy5mb3JFYWNoKGZ1bmN0aW9uICh0eEluKSB7XG4gICAgYnVmZmVyV3JpdGVyLndyaXRlU2xpY2UodHhJbi5oYXNoKTtcbiAgICBidWZmZXJXcml0ZXIud3JpdGVVSW50MzIodHhJbi5pbmRleCk7XG4gICAgYnVmZmVyV3JpdGVyLndyaXRlVmFyU2xpY2UodHhJbi5zY3JpcHQpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVVJbnQzMih0eEluLnNlcXVlbmNlKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZU91dHB1dHM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gIGJ1ZmZlcldyaXRlcjogQnVmZmVyV3JpdGVyLFxuICBvdXRzOiBUeE91dHB1dDxUTnVtYmVyPltdXG4pOiB2b2lkIHtcbiAgYnVmZmVyV3JpdGVyLndyaXRlVmFySW50KG91dHMubGVuZ3RoKTtcbiAgb3V0cy5mb3JFYWNoKGZ1bmN0aW9uICh0eE91dCkge1xuICAgIGlmICgodHhPdXQgYXMgYW55KS52YWx1ZUJ1ZmZlcikge1xuICAgICAgYnVmZmVyV3JpdGVyLndyaXRlU2xpY2UoKHR4T3V0IGFzIGFueSkudmFsdWVCdWZmZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXJXcml0ZXIud3JpdGVVSW50NjQodHhPdXQudmFsdWUpO1xuICAgIH1cblxuICAgIGJ1ZmZlcldyaXRlci53cml0ZVZhclNsaWNlKHR4T3V0LnNjcmlwdCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9CdWZmZXJWNDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgYnVmZmVyV3JpdGVyOiBCdWZmZXJXcml0ZXIsXG4gIHR4OiBaY2FzaFRyYW5zYWN0aW9uPFROdW1iZXI+XG4pOiB2b2lkIHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3pjYXNoL3pjYXNoL2Jsb2IvdjQuNS4xL3NyYy9wcmltaXRpdmVzL3RyYW5zYWN0aW9uLmgjTDEwODNcbiAgd3JpdGVJbnB1dHMoYnVmZmVyV3JpdGVyLCB0eC5pbnMpO1xuICB3cml0ZU91dHB1dHM8VE51bWJlcj4oYnVmZmVyV3JpdGVyLCB0eC5vdXRzKTtcblxuICBidWZmZXJXcml0ZXIud3JpdGVVSW50MzIodHgubG9ja3RpbWUpO1xuXG4gIGlmICh0eC5pc092ZXJ3aW50ZXJDb21wYXRpYmxlKCkpIHtcbiAgICBidWZmZXJXcml0ZXIud3JpdGVVSW50MzIodHguZXhwaXJ5SGVpZ2h0KTtcbiAgfVxuXG4gIGlmICh0eC5pc1NhcGxpbmdDb21wYXRpYmxlKCkpIHtcbiAgICBidWZmZXJXcml0ZXIud3JpdGVTbGljZShWQUxVRV9JTlQ2NF9aRVJPKTtcbiAgICBidWZmZXJXcml0ZXIud3JpdGVWYXJJbnQoMCk7IC8vIHZTaGllbGRlZFNwZW5kTGVuZ3RoXG4gICAgYnVmZmVyV3JpdGVyLndyaXRlVmFySW50KDApOyAvLyB2U2hpZWxkZWRPdXRwdXRMZW5ndGhcbiAgfVxuXG4gIGlmICh0eC5zdXBwb3J0c0pvaW5TcGxpdHMoKSkge1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVZhckludCgwKTsgLy8gam9pbnNTcGxpdHMgbGVuZ3RoXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQnVmZmVyVjU8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gIGJ1ZmZlcldyaXRlcjogQnVmZmVyV3JpdGVyLFxuICB0eDogWmNhc2hUcmFuc2FjdGlvbjxUTnVtYmVyPlxuKTogdm9pZCB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96Y2FzaC96Y2FzaC9ibG9iL3Y0LjUuMS9zcmMvcHJpbWl0aXZlcy90cmFuc2FjdGlvbi5oI0w4MjUtTDgyNlxuICBidWZmZXJXcml0ZXIud3JpdGVVSW50MzIodHguY29uc2Vuc3VzQnJhbmNoSWQpO1xuICBidWZmZXJXcml0ZXIud3JpdGVVSW50MzIodHgubG9ja3RpbWUpO1xuICBidWZmZXJXcml0ZXIud3JpdGVVSW50MzIodHguZXhwaXJ5SGVpZ2h0KTtcbiAgd3JpdGVJbnB1dHMoYnVmZmVyV3JpdGVyLCB0eC5pbnMpO1xuICB3cml0ZU91dHB1dHM8VE51bWJlcj4oYnVmZmVyV3JpdGVyLCB0eC5vdXRzKTtcblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemNhc2gvemNhc2gvYmxvYi92NC41LjEvc3JjL3ByaW1pdGl2ZXMvdHJhbnNhY3Rpb24uaCNMMTA2M1xuICB3cml0ZUVtcHR5U2FtcGxpbmdCdW5kbGUoYnVmZmVyV3JpdGVyKTtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3pjYXNoL3pjYXNoL2Jsb2IvdjQuNS4xL3NyYy9wcmltaXRpdmVzL3RyYW5zYWN0aW9uLmgjTDEwODFcbiAgd3JpdGVFbXB0eU9yY2hhcmRCdW5kbGUoYnVmZmVyV3JpdGVyKTtcbn1cbiJdfQ==

Выполнить команду


Для локальной разработки. Не используйте в интернете!