UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

266 lines (256 loc) • 28.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; const SHIFT_LEFT_32 = (1 << 16) * (1 << 16); const SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; // The first chunk starts small and doubles up to `CHUNK_SIZE`: most payloads // built through this class are a few dozen bytes. const MIN_CHUNK_SIZE = 64; /** * A write-side buffer list. * * Bytes are appended through the `write*` methods, and taken out again * either as a single buffer (`data`, `slice`) or as a list of chunks * (`getBuffers`, `consume`). Small pieces are coalesced into chunks of at * most `CHUNK_SIZE` bytes. Buffers of at least `CHUNK_SIZE` bytes written * through `writeBuffer` are referenced rather than copied, so that large * values cost no extra memory. (The caller must therefore not modify such * buffers until they have been consumed.) * * The consumer side (`length`, `getBuffers`, `consume`, `slice`) mirrors * that of `bl`'s `BufferList`. */ class WritableTrackingBuffer { /** * The size of the chunks a `WritableTrackingBuffer` produces, and the size * from which written buffers are referenced rather than copied. */ static CHUNK_SIZE = 8 * 1024; /** * The number of bytes appended and not yet consumed. */ constructor() { this.length = 0; this._bufs = []; this._open = Buffer.allocUnsafe(MIN_CHUNK_SIZE); this._pos = 0; } /** * All appended and not yet consumed bytes as a single buffer. * * When everything fits into a single chunk this is a view of that chunk * rather than a copy. The returned buffer must not be modified. */ get data() { if (this._bufs.length === 0) { return this._open.subarray(0, this._pos); } return this.slice(); } _seal() { if (this._pos > 0) { this._bufs.push(this._open.subarray(0, this._pos)); this._open = Buffer.allocUnsafe(Math.min(this._open.length * 2, WritableTrackingBuffer.CHUNK_SIZE)); this._pos = 0; } } _ensure(size) { if (this._open.length - this._pos < size) { this._seal(); if (this._open.length < size) { this._open = Buffer.allocUnsafe(size); } } } /** * The chunks holding all appended and not yet consumed bytes. * * The returned array is the list's own: later appends can add chunks to * it. `consume` does not modify it, so taking the chunks and consuming * them right away yields a stable snapshot. */ getBuffers() { this._seal(); return this._bufs; } /** * Discards the given number of bytes from the front of the list. */ consume(bytes) { this._seal(); const bufs = this._bufs; let i = 0; while (i < bufs.length && bytes >= bufs[i].length) { bytes -= bufs[i].length; this.length -= bufs[i].length; i++; } // A fresh array, so that a previously returned `getBuffers()` result // stays intact. this._bufs = bufs.slice(i); if (bytes > 0 && this._bufs.length) { this._bufs[0] = this._bufs[0].subarray(bytes); this.length -= bytes; } return this; } /** * Copies all appended and not yet consumed bytes into a new buffer. */ slice() { this._seal(); const result = Buffer.allocUnsafe(this.length); let position = 0; for (const buffer of this._bufs) { position += buffer.copy(result, position); } return result; } writeUInt8(value) { this._ensure(1); this._open.writeUInt8(value, this._pos); this._pos += 1; this.length += 1; } writeUInt16LE(value) { this._ensure(2); this._open.writeUInt16LE(value, this._pos); this._pos += 2; this.length += 2; } writeUShort(value) { this.writeUInt16LE(value); } writeUInt16BE(value) { this._ensure(2); this._open.writeUInt16BE(value, this._pos); this._pos += 2; this.length += 2; } writeUInt24LE(value) { this._ensure(3); this._open[this._pos + 2] = value >>> 16 & 0xff; this._open[this._pos + 1] = value >>> 8 & 0xff; this._open[this._pos] = value & 0xff; this._pos += 3; this.length += 3; } writeUInt32LE(value) { this._ensure(4); this._open.writeUInt32LE(value, this._pos); this._pos += 4; this.length += 4; } writeBigInt64LE(value) { this._ensure(8); this._open.writeBigInt64LE(value, this._pos); this._pos += 8; this.length += 8; } writeInt64LE(value) { this.writeBigInt64LE(BigInt(value)); } writeUInt64LE(value) { this.writeBigUInt64LE(BigInt(value)); } writeBigUInt64LE(value) { this._ensure(8); this._open.writeBigUInt64LE(value, this._pos); this._pos += 8; this.length += 8; } writeUInt32BE(value) { this._ensure(4); this._open.writeUInt32BE(value, this._pos); this._pos += 4; this.length += 4; } writeUInt40LE(value) { // inspired by https://github.com/dpw/node-buffer-more-ints this.writeInt32LE(value & -1); this.writeUInt8(Math.floor(value * SHIFT_RIGHT_32)); } writeInt8(value) { this._ensure(1); this._open.writeInt8(value, this._pos); this._pos += 1; this.length += 1; } writeInt16LE(value) { this._ensure(2); this._open.writeInt16LE(value, this._pos); this._pos += 2; this.length += 2; } writeInt16BE(value) { this._ensure(2); this._open.writeInt16BE(value, this._pos); this._pos += 2; this.length += 2; } writeInt32LE(value) { this._ensure(4); this._open.writeInt32LE(value, this._pos); this._pos += 4; this.length += 4; } writeInt32BE(value) { this._ensure(4); this._open.writeInt32BE(value, this._pos); this._pos += 4; this.length += 4; } writeFloatLE(value) { this._ensure(4); this._open.writeFloatLE(value, this._pos); this._pos += 4; this.length += 4; } writeDoubleLE(value) { this._ensure(8); this._open.writeDoubleLE(value, this._pos); this._pos += 8; this.length += 8; } writeString(value, encoding) { // UCS-2 is two bytes per UTF-16 code unit. const length = encoding === 'ucs2' ? value.length * 2 : Buffer.byteLength(value, encoding); this._ensure(length); this._open.write(value, this._pos, encoding); this._pos += length; this.length += length; } writeBVarchar(value, encoding) { this.writeUInt8(value.length); this.writeString(value, encoding); } writeUsVarchar(value, encoding) { this.writeUInt16LE(value.length); this.writeString(value, encoding); } writeUsVarbyte(value) { this.writeUInt16LE(value.length); this.writeBuffer(value); } /** * Appends a buffer. Buffers of at least `CHUNK_SIZE` bytes are referenced * rather than copied, and must not be modified until consumed. */ writeBuffer(value) { const length = value.length; if (length >= WritableTrackingBuffer.CHUNK_SIZE) { this._seal(); this._bufs.push(value); } else { this._ensure(length); value.copy(this._open, this._pos); this._pos += length; } this.length += length; } } var _default = exports.default = WritableTrackingBuffer; module.exports = WritableTrackingBuffer; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTSElGVF9MRUZUXzMyIiwiU0hJRlRfUklHSFRfMzIiLCJNSU5fQ0hVTktfU0laRSIsIldyaXRhYmxlVHJhY2tpbmdCdWZmZXIiLCJDSFVOS19TSVpFIiwiY29uc3RydWN0b3IiLCJsZW5ndGgiLCJfYnVmcyIsIl9vcGVuIiwiQnVmZmVyIiwiYWxsb2NVbnNhZmUiLCJfcG9zIiwiZGF0YSIsInN1YmFycmF5Iiwic2xpY2UiLCJfc2VhbCIsInB1c2giLCJNYXRoIiwibWluIiwiX2Vuc3VyZSIsInNpemUiLCJnZXRCdWZmZXJzIiwiY29uc3VtZSIsImJ5dGVzIiwiYnVmcyIsImkiLCJyZXN1bHQiLCJwb3NpdGlvbiIsImJ1ZmZlciIsImNvcHkiLCJ3cml0ZVVJbnQ4IiwidmFsdWUiLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVVU2hvcnQiLCJ3cml0ZVVJbnQxNkJFIiwid3JpdGVVSW50MjRMRSIsIndyaXRlVUludDMyTEUiLCJ3cml0ZUJpZ0ludDY0TEUiLCJ3cml0ZUludDY0TEUiLCJCaWdJbnQiLCJ3cml0ZVVJbnQ2NExFIiwid3JpdGVCaWdVSW50NjRMRSIsIndyaXRlVUludDMyQkUiLCJ3cml0ZVVJbnQ0MExFIiwid3JpdGVJbnQzMkxFIiwiZmxvb3IiLCJ3cml0ZUludDgiLCJ3cml0ZUludDE2TEUiLCJ3cml0ZUludDE2QkUiLCJ3cml0ZUludDMyQkUiLCJ3cml0ZUZsb2F0TEUiLCJ3cml0ZURvdWJsZUxFIiwid3JpdGVTdHJpbmciLCJlbmNvZGluZyIsImJ5dGVMZW5ndGgiLCJ3cml0ZSIsIndyaXRlQlZhcmNoYXIiLCJ3cml0ZVVzVmFyY2hhciIsIndyaXRlVXNWYXJieXRlIiwid3JpdGVCdWZmZXIiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJkZWZhdWx0IiwibW9kdWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYWNraW5nLWJ1ZmZlci93cml0YWJsZS10cmFja2luZy1idWZmZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgU0hJRlRfTEVGVF8zMiA9ICgxIDw8IDE2KSAqICgxIDw8IDE2KTtcbmNvbnN0IFNISUZUX1JJR0hUXzMyID0gMSAvIFNISUZUX0xFRlRfMzI7XG5cbi8vIFRoZSBmaXJzdCBjaHVuayBzdGFydHMgc21hbGwgYW5kIGRvdWJsZXMgdXAgdG8gYENIVU5LX1NJWkVgOiBtb3N0IHBheWxvYWRzXG4vLyBidWlsdCB0aHJvdWdoIHRoaXMgY2xhc3MgYXJlIGEgZmV3IGRvemVuIGJ5dGVzLlxuY29uc3QgTUlOX0NIVU5LX1NJWkUgPSA2NDtcblxuZXhwb3J0IHR5cGUgRW5jb2RpbmcgPSAndXRmOCcgfCAndWNzMicgfCAnYXNjaWknO1xuXG4vKipcbiAqIEEgd3JpdGUtc2lkZSBidWZmZXIgbGlzdC5cbiAqXG4gKiBCeXRlcyBhcmUgYXBwZW5kZWQgdGhyb3VnaCB0aGUgYHdyaXRlKmAgbWV0aG9kcywgYW5kIHRha2VuIG91dCBhZ2FpblxuICogZWl0aGVyIGFzIGEgc2luZ2xlIGJ1ZmZlciAoYGRhdGFgLCBgc2xpY2VgKSBvciBhcyBhIGxpc3Qgb2YgY2h1bmtzXG4gKiAoYGdldEJ1ZmZlcnNgLCBgY29uc3VtZWApLiBTbWFsbCBwaWVjZXMgYXJlIGNvYWxlc2NlZCBpbnRvIGNodW5rcyBvZiBhdFxuICogbW9zdCBgQ0hVTktfU0laRWAgYnl0ZXMuIEJ1ZmZlcnMgb2YgYXQgbGVhc3QgYENIVU5LX1NJWkVgIGJ5dGVzIHdyaXR0ZW5cbiAqIHRocm91Z2ggYHdyaXRlQnVmZmVyYCBhcmUgcmVmZXJlbmNlZCByYXRoZXIgdGhhbiBjb3BpZWQsIHNvIHRoYXQgbGFyZ2VcbiAqIHZhbHVlcyBjb3N0IG5vIGV4dHJhIG1lbW9yeS4gKFRoZSBjYWxsZXIgbXVzdCB0aGVyZWZvcmUgbm90IG1vZGlmeSBzdWNoXG4gKiBidWZmZXJzIHVudGlsIHRoZXkgaGF2ZSBiZWVuIGNvbnN1bWVkLilcbiAqXG4gKiBUaGUgY29uc3VtZXIgc2lkZSAoYGxlbmd0aGAsIGBnZXRCdWZmZXJzYCwgYGNvbnN1bWVgLCBgc2xpY2VgKSBtaXJyb3JzXG4gKiB0aGF0IG9mIGBibGAncyBgQnVmZmVyTGlzdGAuXG4gKi9cbmNsYXNzIFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIge1xuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGNodW5rcyBhIGBXcml0YWJsZVRyYWNraW5nQnVmZmVyYCBwcm9kdWNlcywgYW5kIHRoZSBzaXplXG4gICAqIGZyb20gd2hpY2ggd3JpdHRlbiBidWZmZXJzIGFyZSByZWZlcmVuY2VkIHJhdGhlciB0aGFuIGNvcGllZC5cbiAgICovXG4gIHN0YXRpYyByZWFkb25seSBDSFVOS19TSVpFID0gOCAqIDEwMjQ7XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgYXBwZW5kZWQgYW5kIG5vdCB5ZXQgY29uc3VtZWQuXG4gICAqL1xuICBkZWNsYXJlIGxlbmd0aDogbnVtYmVyO1xuXG4gIGRlY2xhcmUgcHJpdmF0ZSBfYnVmczogQnVmZmVyW107XG4gIGRlY2xhcmUgcHJpdmF0ZSBfb3BlbjogQnVmZmVyO1xuICBkZWNsYXJlIHByaXZhdGUgX3BvczogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9idWZzID0gW107XG4gICAgdGhpcy5fb3BlbiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShNSU5fQ0hVTktfU0laRSk7XG4gICAgdGhpcy5fcG9zID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgYXBwZW5kZWQgYW5kIG5vdCB5ZXQgY29uc3VtZWQgYnl0ZXMgYXMgYSBzaW5nbGUgYnVmZmVyLlxuICAgKlxuICAgKiBXaGVuIGV2ZXJ5dGhpbmcgZml0cyBpbnRvIGEgc2luZ2xlIGNodW5rIHRoaXMgaXMgYSB2aWV3IG9mIHRoYXQgY2h1bmtcbiAgICogcmF0aGVyIHRoYW4gYSBjb3B5LiBUaGUgcmV0dXJuZWQgYnVmZmVyIG11c3Qgbm90IGJlIG1vZGlmaWVkLlxuICAgKi9cbiAgZ2V0IGRhdGEoKTogQnVmZmVyIHtcbiAgICBpZiAodGhpcy5fYnVmcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLl9vcGVuLnN1YmFycmF5KDAsIHRoaXMuX3Bvcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2xpY2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlYWwoKSB7XG4gICAgaWYgKHRoaXMuX3BvcyA+IDApIHtcbiAgICAgIHRoaXMuX2J1ZnMucHVzaCh0aGlzLl9vcGVuLnN1YmFycmF5KDAsIHRoaXMuX3BvcykpO1xuICAgICAgdGhpcy5fb3BlbiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShNYXRoLm1pbih0aGlzLl9vcGVuLmxlbmd0aCAqIDIsIFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIuQ0hVTktfU0laRSkpO1xuICAgICAgdGhpcy5fcG9zID0gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9lbnN1cmUoc2l6ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuX29wZW4ubGVuZ3RoIC0gdGhpcy5fcG9zIDwgc2l6ZSkge1xuICAgICAgdGhpcy5fc2VhbCgpO1xuXG4gICAgICBpZiAodGhpcy5fb3Blbi5sZW5ndGggPCBzaXplKSB7XG4gICAgICAgIHRoaXMuX29wZW4gPSBCdWZmZXIuYWxsb2NVbnNhZmUoc2l6ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjaHVua3MgaG9sZGluZyBhbGwgYXBwZW5kZWQgYW5kIG5vdCB5ZXQgY29uc3VtZWQgYnl0ZXMuXG4gICAqXG4gICAqIFRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGUgbGlzdCdzIG93bjogbGF0ZXIgYXBwZW5kcyBjYW4gYWRkIGNodW5rcyB0b1xuICAgKiBpdC4gYGNvbnN1bWVgIGRvZXMgbm90IG1vZGlmeSBpdCwgc28gdGFraW5nIHRoZSBjaHVua3MgYW5kIGNvbnN1bWluZ1xuICAgKiB0aGVtIHJpZ2h0IGF3YXkgeWllbGRzIGEgc3RhYmxlIHNuYXBzaG90LlxuICAgKi9cbiAgZ2V0QnVmZmVycygpOiBCdWZmZXJbXSB7XG4gICAgdGhpcy5fc2VhbCgpO1xuICAgIHJldHVybiB0aGlzLl9idWZzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2NhcmRzIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuXG4gICAqL1xuICBjb25zdW1lKGJ5dGVzOiBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLl9zZWFsKCk7XG5cbiAgICBjb25zdCBidWZzID0gdGhpcy5fYnVmcztcbiAgICBsZXQgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBidWZzLmxlbmd0aCAmJiBieXRlcyA+PSBidWZzW2ldLmxlbmd0aCkge1xuICAgICAgYnl0ZXMgLT0gYnVmc1tpXS5sZW5ndGg7XG4gICAgICB0aGlzLmxlbmd0aCAtPSBidWZzW2ldLmxlbmd0aDtcbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICAvLyBBIGZyZXNoIGFycmF5LCBzbyB0aGF0IGEgcHJldmlvdXNseSByZXR1cm5lZCBgZ2V0QnVmZmVycygpYCByZXN1bHRcbiAgICAvLyBzdGF5cyBpbnRhY3QuXG4gICAgdGhpcy5fYnVmcyA9IGJ1ZnMuc2xpY2UoaSk7XG5cbiAgICBpZiAoYnl0ZXMgPiAwICYmIHRoaXMuX2J1ZnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9idWZzWzBdID0gdGhpcy5fYnVmc1swXS5zdWJhcnJheShieXRlcyk7XG4gICAgICB0aGlzLmxlbmd0aCAtPSBieXRlcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3BpZXMgYWxsIGFwcGVuZGVkIGFuZCBub3QgeWV0IGNvbnN1bWVkIGJ5dGVzIGludG8gYSBuZXcgYnVmZmVyLlxuICAgKi9cbiAgc2xpY2UoKTogQnVmZmVyIHtcbiAgICB0aGlzLl9zZWFsKCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBCdWZmZXIuYWxsb2NVbnNhZmUodGhpcy5sZW5ndGgpO1xuICAgIGxldCBwb3NpdGlvbiA9IDA7XG4gICAgZm9yIChjb25zdCBidWZmZXIgb2YgdGhpcy5fYnVmcykge1xuICAgICAgcG9zaXRpb24gKz0gYnVmZmVyLmNvcHkocmVzdWx0LCBwb3NpdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHdyaXRlVUludDgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Vuc3VyZSgxKTtcbiAgICB0aGlzLl9vcGVuLndyaXRlVUludDgodmFsdWUsIHRoaXMuX3Bvcyk7XG4gICAgdGhpcy5fcG9zICs9IDE7XG4gICAgdGhpcy5sZW5ndGggKz0gMTtcbiAgfVxuXG4gIHdyaXRlVUludDE2TEUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Vuc3VyZSgyKTtcbiAgICB0aGlzLl9vcGVuLndyaXRlVUludDE2TEUodmFsdWUsIHRoaXMuX3Bvcyk7XG4gICAgdGhpcy5fcG9zICs9IDI7XG4gICAgdGhpcy5sZW5ndGggKz0gMjtcbiAgfVxuXG4gIHdyaXRlVVNob3J0KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLndyaXRlVUludDE2TEUodmFsdWUpO1xuICB9XG5cbiAgd3JpdGVVSW50MTZCRSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZW5zdXJlKDIpO1xuICAgIHRoaXMuX29wZW4ud3JpdGVVSW50MTZCRSh2YWx1ZSwgdGhpcy5fcG9zKTtcbiAgICB0aGlzLl9wb3MgKz0gMjtcbiAgICB0aGlzLmxlbmd0aCArPSAyO1xuICB9XG5cbiAgd3JpdGVVSW50MjRMRSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZW5zdXJlKDMpO1xuICAgIHRoaXMuX29wZW5bdGhpcy5fcG9zICsgMl0gPSAodmFsdWUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgdGhpcy5fb3Blblt0aGlzLl9wb3MgKyAxXSA9ICh2YWx1ZSA+Pj4gOCkgJiAweGZmO1xuICAgIHRoaXMuX29wZW5bdGhpcy5fcG9zXSA9IHZhbHVlICYgMHhmZjtcbiAgICB0aGlzLl9wb3MgKz0gMztcbiAgICB0aGlzLmxlbmd0aCArPSAzO1xuICB9XG5cbiAgd3JpdGVVSW50MzJMRSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZW5zdXJlKDQpO1xuICAgIHRoaXMuX29wZW4ud3JpdGVVSW50MzJMRSh2YWx1ZSwgdGhpcy5fcG9zKTtcbiAgICB0aGlzLl9wb3MgKz0gNDtcbiAgICB0aGlzLmxlbmd0aCArPSA0O1xuICB9XG5cbiAgd3JpdGVCaWdJbnQ2NExFKHZhbHVlOiBiaWdpbnQpIHtcbiAgICB0aGlzLl9lbnN1cmUoOCk7XG4gICAgdGhpcy5fb3Blbi53cml0ZUJpZ0ludDY0TEUodmFsdWUsIHRoaXMuX3Bvcyk7XG4gICAgdGhpcy5fcG9zICs9IDg7XG4gICAgdGhpcy5sZW5ndGggKz0gODtcbiAgfVxuXG4gIHdyaXRlSW50NjRMRSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy53cml0ZUJpZ0ludDY0TEUoQmlnSW50KHZhbHVlKSk7XG4gIH1cblxuICB3cml0ZVVJbnQ2NExFKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLndyaXRlQmlnVUludDY0TEUoQmlnSW50KHZhbHVlKSk7XG4gIH1cblxuICB3cml0ZUJpZ1VJbnQ2NExFKHZhbHVlOiBiaWdpbnQpIHtcbiAgICB0aGlzLl9lbnN1cmUoOCk7XG4gICAgdGhpcy5fb3Blbi53cml0ZUJpZ1VJbnQ2NExFKHZhbHVlLCB0aGlzLl9wb3MpO1xuICAgIHRoaXMuX3BvcyArPSA4O1xuICAgIHRoaXMubGVuZ3RoICs9IDg7XG4gIH1cblxuICB3cml0ZVVJbnQzMkJFKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9lbnN1cmUoNCk7XG4gICAgdGhpcy5fb3Blbi53cml0ZVVJbnQzMkJFKHZhbHVlLCB0aGlzLl9wb3MpO1xuICAgIHRoaXMuX3BvcyArPSA0O1xuICAgIHRoaXMubGVuZ3RoICs9IDQ7XG4gIH1cblxuICB3cml0ZVVJbnQ0MExFKHZhbHVlOiBudW1iZXIpIHtcbiAgICAvLyBpbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vZHB3L25vZGUtYnVmZmVyLW1vcmUtaW50c1xuICAgIHRoaXMud3JpdGVJbnQzMkxFKHZhbHVlICYgLTEpO1xuICAgIHRoaXMud3JpdGVVSW50OChNYXRoLmZsb29yKHZhbHVlICogU0hJRlRfUklHSFRfMzIpKTtcbiAgfVxuXG4gIHdyaXRlSW50OCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZW5zdXJlKDEpO1xuICAgIHRoaXMuX29wZW4ud3JpdGVJbnQ4KHZhbHVlLCB0aGlzLl9wb3MpO1xuICAgIHRoaXMuX3BvcyArPSAxO1xuICAgIHRoaXMubGVuZ3RoICs9IDE7XG4gIH1cblxuICB3cml0ZUludDE2TEUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Vuc3VyZSgyKTtcbiAgICB0aGlzLl9vcGVuLndyaXRlSW50MTZMRSh2YWx1ZSwgdGhpcy5fcG9zKTtcbiAgICB0aGlzLl9wb3MgKz0gMjtcbiAgICB0aGlzLmxlbmd0aCArPSAyO1xuICB9XG5cbiAgd3JpdGVJbnQxNkJFKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9lbnN1cmUoMik7XG4gICAgdGhpcy5fb3Blbi53cml0ZUludDE2QkUodmFsdWUsIHRoaXMuX3Bvcyk7XG4gICAgdGhpcy5fcG9zICs9IDI7XG4gICAgdGhpcy5sZW5ndGggKz0gMjtcbiAgfVxuXG4gIHdyaXRlSW50MzJMRSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZW5zdXJlKDQpO1xuICAgIHRoaXMuX29wZW4ud3JpdGVJbnQzMkxFKHZhbHVlLCB0aGlzLl9wb3MpO1xuICAgIHRoaXMuX3BvcyArPSA0O1xuICAgIHRoaXMubGVuZ3RoICs9IDQ7XG4gIH1cblxuICB3cml0ZUludDMyQkUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Vuc3VyZSg0KTtcbiAgICB0aGlzLl9vcGVuLndyaXRlSW50MzJCRSh2YWx1ZSwgdGhpcy5fcG9zKTtcbiAgICB0aGlzLl9wb3MgKz0gNDtcbiAgICB0aGlzLmxlbmd0aCArPSA0O1xuICB9XG5cbiAgd3JpdGVGbG9hdExFKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9lbnN1cmUoNCk7XG4gICAgdGhpcy5fb3Blbi53cml0ZUZsb2F0TEUodmFsdWUsIHRoaXMuX3Bvcyk7XG4gICAgdGhpcy5fcG9zICs9IDQ7XG4gICAgdGhpcy5sZW5ndGggKz0gNDtcbiAgfVxuXG4gIHdyaXRlRG91YmxlTEUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Vuc3VyZSg4KTtcbiAgICB0aGlzLl9vcGVuLndyaXRlRG91YmxlTEUodmFsdWUsIHRoaXMuX3Bvcyk7XG4gICAgdGhpcy5fcG9zICs9IDg7XG4gICAgdGhpcy5sZW5ndGggKz0gODtcbiAgfVxuXG4gIHdyaXRlU3RyaW5nKHZhbHVlOiBzdHJpbmcsIGVuY29kaW5nOiBFbmNvZGluZykge1xuICAgIC8vIFVDUy0yIGlzIHR3byBieXRlcyBwZXIgVVRGLTE2IGNvZGUgdW5pdC5cbiAgICBjb25zdCBsZW5ndGggPSBlbmNvZGluZyA9PT0gJ3VjczInID8gdmFsdWUubGVuZ3RoICogMiA6IEJ1ZmZlci5ieXRlTGVuZ3RoKHZhbHVlLCBlbmNvZGluZyk7XG4gICAgdGhpcy5fZW5zdXJlKGxlbmd0aCk7XG4gICAgdGhpcy5fb3Blbi53cml0ZSh2YWx1ZSwgdGhpcy5fcG9zLCBlbmNvZGluZyk7XG4gICAgdGhpcy5fcG9zICs9IGxlbmd0aDtcbiAgICB0aGlzLmxlbmd0aCArPSBsZW5ndGg7XG4gIH1cblxuICB3cml0ZUJWYXJjaGFyKHZhbHVlOiBzdHJpbmcsIGVuY29kaW5nOiBFbmNvZGluZykge1xuICAgIHRoaXMud3JpdGVVSW50OCh2YWx1ZS5sZW5ndGgpO1xuICAgIHRoaXMud3JpdGVTdHJpbmcodmFsdWUsIGVuY29kaW5nKTtcbiAgfVxuXG4gIHdyaXRlVXNWYXJjaGFyKHZhbHVlOiBzdHJpbmcsIGVuY29kaW5nOiBFbmNvZGluZykge1xuICAgIHRoaXMud3JpdGVVSW50MTZMRSh2YWx1ZS5sZW5ndGgpO1xuICAgIHRoaXMud3JpdGVTdHJpbmcodmFsdWUsIGVuY29kaW5nKTtcbiAgfVxuXG4gIHdyaXRlVXNWYXJieXRlKHZhbHVlOiBCdWZmZXIpIHtcbiAgICB0aGlzLndyaXRlVUludDE2TEUodmFsdWUubGVuZ3RoKTtcbiAgICB0aGlzLndyaXRlQnVmZmVyKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgYnVmZmVyLiBCdWZmZXJzIG9mIGF0IGxlYXN0IGBDSFVOS19TSVpFYCBieXRlcyBhcmUgcmVmZXJlbmNlZFxuICAgKiByYXRoZXIgdGhhbiBjb3BpZWQsIGFuZCBtdXN0IG5vdCBiZSBtb2RpZmllZCB1bnRpbCBjb25zdW1lZC5cbiAgICovXG4gIHdyaXRlQnVmZmVyKHZhbHVlOiBCdWZmZXIpIHtcbiAgICBjb25zdCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCA+PSBXcml0YWJsZVRyYWNraW5nQnVmZmVyLkNIVU5LX1NJWkUpIHtcbiAgICAgIHRoaXMuX3NlYWwoKTtcbiAgICAgIHRoaXMuX2J1ZnMucHVzaCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Vuc3VyZShsZW5ndGgpO1xuICAgICAgdmFsdWUuY29weSh0aGlzLl9vcGVuLCB0aGlzLl9wb3MpO1xuICAgICAgdGhpcy5fcG9zICs9IGxlbmd0aDtcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCArPSBsZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgV3JpdGFibGVUcmFja2luZ0J1ZmZlcjtcbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGVUcmFja2luZ0J1ZmZlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsTUFBTUEsYUFBYSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzNDLE1BQU1DLGNBQWMsR0FBRyxDQUFDLEdBQUdELGFBQWE7O0FBRXhDO0FBQ0E7QUFDQSxNQUFNRSxjQUFjLEdBQUcsRUFBRTtBQUl6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFB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