pw-js-world
Version:
An optional package for PW-JS-Api, aims to serve world purposes.
687 lines • 40.3 kB
JavaScript
/**
* CREDIT: Anatoly for making this Buffer Reader so I don't have to!
* Source: https://github.com/Anatoly03/pixelwalker.js/blob/9bb3c7e39a45006086a2abae8c515599bd3db835/src/util/buffer-reader.ts
* License: ISC
*/
/**
* Data during the communication in the process is dynamic
* typed. Every entry is followed by a byte identifying the
* type, followed by data. The type header is noted by its'
* 7-bit notation.
*/
export var ComponentTypeHeader;
(function (ComponentTypeHeader) {
ComponentTypeHeader[ComponentTypeHeader["String"] = 0] = "String";
ComponentTypeHeader[ComponentTypeHeader["Byte"] = 1] = "Byte";
ComponentTypeHeader[ComponentTypeHeader["Int16"] = 2] = "Int16";
ComponentTypeHeader[ComponentTypeHeader["Int32"] = 3] = "Int32";
ComponentTypeHeader[ComponentTypeHeader["Int64"] = 4] = "Int64";
ComponentTypeHeader[ComponentTypeHeader["Float"] = 5] = "Float";
ComponentTypeHeader[ComponentTypeHeader["Double"] = 6] = "Double";
ComponentTypeHeader[ComponentTypeHeader["Boolean"] = 7] = "Boolean";
ComponentTypeHeader[ComponentTypeHeader["ByteArray"] = 8] = "ByteArray";
ComponentTypeHeader[ComponentTypeHeader["UInt32"] = 9] = "UInt32";
})(ComponentTypeHeader || (ComponentTypeHeader = {}));
/**
* A Buffer reader is a special buffer extension made to perform
* game-specific tasks in the field of communication.
*
* @implements Buffer
*/
export default class BufferReader {
/**
*
*/
constructor(buffer) {
this.offset = 0;
this.buffer = buffer;
}
//
//
// Static Methods
//
//
/**
*
*/
static from(from) {
if (from instanceof Buffer)
return new BufferReader(from);
return new BufferReader(Buffer.from(from));
}
/**
*
*/
static alloc(amount) {
return BufferReader.from(Buffer.alloc(amount));
}
//
//
// Message Component Types
//
//
/**
* @param {string} value
* @returns {Buffer}
*/
static String(value = '') {
const stringByteLen = Buffer.byteLength(value);
const lengthByteCount = this.length7BitInt(stringByteLen);
const buffer = BufferReader.alloc(1 + lengthByteCount + stringByteLen);
buffer.writeUInt8(ComponentTypeHeader.String);
buffer.write7BitInt(stringByteLen);
buffer.write(value);
return buffer.toBuffer();
}
/**
* @param {number} value
* @returns {Buffer}
*/
static Byte(value = 0) {
const buffer = BufferReader.alloc(2);
buffer.writeUInt8(ComponentTypeHeader.Byte);
buffer.writeUInt8(value);
return buffer.toBuffer();
}
/**
* @param {number} value
* @returns {Buffer}
*/
static Int16(value = 0) {
const buffer = BufferReader.alloc(3);
buffer.writeUInt8(ComponentTypeHeader.Int16);
buffer.writeInt16BE(value);
return buffer.toBuffer();
}
/**
* @param {number} value
* @returns {Buffer}
*/
static Int32(value = 0) {
const buffer = BufferReader.alloc(5);
buffer.writeUInt8(ComponentTypeHeader.Int32);
buffer.writeInt32BE(value);
return buffer.toBuffer();
}
/**
* @param {bigint} value
* @returns {Buffer}
*/
static Int64(value = BigInt(0).valueOf()) {
const buffer = BufferReader.alloc(9);
buffer.writeUInt8(ComponentTypeHeader.Int64);
buffer.writeBigInt64BE(value);
return buffer.toBuffer();
}
/**
* @param {number} value
* @returns {Buffer}
*/
static Float(value = 0) {
const buffer = BufferReader.alloc(5);
buffer.writeUInt8(ComponentTypeHeader.Float);
buffer.writeFloatBE(value);
return buffer.toBuffer();
}
/**
* @param {number} value
* @returns {Buffer}
*/
static Double(value = 0) {
const buffer = BufferReader.alloc(9);
buffer.writeUInt8(ComponentTypeHeader.Double);
buffer.writeDoubleBE(value);
return buffer.toBuffer();
}
/**
* @param {boolean} value
* @returns {Buffer}
*/
static Boolean(value = false) {
const buffer = BufferReader.alloc(2);
buffer.writeUInt8(ComponentTypeHeader.Boolean);
buffer.writeUInt8(value ? 1 : 0);
return buffer.toBuffer();
}
/**
* @param {Uint8Array} buffer
* @returns {Buffer}
*/
static ByteArray(buffer = Buffer.from([0])) {
const bufferLength = Buffer.byteLength(buffer);
const prefix = BufferReader.alloc(2);
prefix.writeUInt8(ComponentTypeHeader.ByteArray);
prefix.writeUInt8(bufferLength);
return Buffer.concat([prefix.toBuffer(), buffer]);
}
/**
* @param {number} value
* @returns {Buffer}
*/
static UInt32(value = 0) {
const buffer = BufferReader.alloc(5);
buffer.writeUInt8(ComponentTypeHeader.UInt32);
buffer.writeUInt32BE(value);
return buffer.toBuffer();
}
/**
* @param {number} value
* @returns {Buffer}
*/
static Magic(value) {
if (value === undefined)
throw new Error('Received undefined magic byte');
return Buffer.from([value]);
}
/**
* @param {number} value
* @returns {Buffer}
*/
static Bit7(value = 0) {
const buffer = BufferReader.alloc(this.length7BitInt(value));
buffer.write7BitInt(value);
return buffer.toBuffer();
}
/**
* @param tt
* @param value
*/
static Dynamic(tt, value) {
switch (tt) {
case ComponentTypeHeader.String:
return this.String(value);
case ComponentTypeHeader.Byte:
return this.Byte(value);
case ComponentTypeHeader.Int16:
return this.Int16(value);
case ComponentTypeHeader.Int32:
return this.Int32(value);
case ComponentTypeHeader.Int64:
return this.Int64(value);
case ComponentTypeHeader.Float:
return this.Float(value);
case ComponentTypeHeader.Double:
return this.Double(value);
case ComponentTypeHeader.Boolean:
return this.Boolean(value);
case ComponentTypeHeader.ByteArray:
return this.ByteArray(value);
case ComponentTypeHeader.UInt32:
return this.UInt32(value);
}
}
//
//
// Overrides
//
//
/**
*
*/
get length() {
return this.buffer.length - this.offset;
}
/**
*
*/
subarray(start = this.offset, end = this.length) {
return new BufferReader(this.buffer.subarray(start, this.offset + end));
}
/**
*
*/
write(value) {
return (this.offset = this.buffer.write(value, this.offset));
}
/**
*
*/
writeBigInt64BE(value) {
return (this.offset = this.buffer.writeBigInt64BE(value, this.offset));
}
/**
*
*/
writeBigInt64LE(value) {
return (this.offset = this.buffer.writeBigInt64LE(value, this.offset));
}
/**
*
*/
writeUInt8(value) {
return (this.offset = this.buffer.writeUInt8(value, this.offset));
}
/**
*
*/
writeUInt16LE(value) {
return (this.offset = this.buffer.writeUInt16LE(value, this.offset));
}
/**
*
*/
writeUInt16BE(value) {
return (this.offset = this.buffer.writeUInt16BE(value, this.offset));
}
/**
*
*/
writeUInt32LE(value) {
return (this.offset = this.buffer.writeUInt32LE(value, this.offset));
}
/**
*
*/
writeUInt32BE(value) {
return (this.offset = this.buffer.writeUInt32BE(value, this.offset));
}
/**
*
*/
writeInt8(value) {
return (this.offset = this.buffer.writeInt8(value, this.offset));
}
/**
*
*/
writeInt16LE(value) {
return (this.offset = this.buffer.writeInt16LE(value, this.offset));
}
/**
*
*/
writeInt16BE(value) {
return (this.offset = this.buffer.writeInt16BE(value, this.offset));
}
/**
*
*/
writeInt32LE(value) {
return (this.offset = this.buffer.writeInt32LE(value, this.offset));
}
/**
*
*/
writeInt32BE(value) {
return (this.offset = this.buffer.writeInt32BE(value, this.offset));
}
/**
*
*/
writeFloatLE(value) {
return (this.offset = this.buffer.writeFloatLE(value, this.offset));
}
/**
*
*/
writeFloatBE(value) {
return (this.offset = this.buffer.writeFloatBE(value, this.offset));
}
/**
*
*/
writeDoubleLE(value) {
return (this.offset = this.buffer.writeDoubleLE(value, this.offset));
}
/**
*
*/
writeDoubleBE(value) {
return (this.offset = this.buffer.writeDoubleBE(value, this.offset));
}
/**
*
*/
readBigUInt64BE() {
const tmp = this.buffer.readBigUInt64BE(this.offset);
this.offset += 8;
return tmp;
}
/**
*
*/
readBigUInt64LE() {
const tmp = this.buffer.readBigUInt64LE(this.offset);
this.offset += 8;
return tmp;
}
/**
*
*/
readBigInt64BE() {
const tmp = this.buffer.readBigInt64BE(this.offset);
this.offset += 8;
return tmp;
}
/**
*
*/
readBigInt64LE() {
const tmp = this.buffer.readBigInt64LE(this.offset);
this.offset += 8;
return tmp;
}
// public readUIntLE() {
// const tmp = this.buffer.readUIntLE(this.offset);
// this.offset += 1;
// return tmp;
// }
// public readUIntBE() {
// const tmp = this.buffer.readUIntBE(this.offset);
// this.offset += 1;
// return tmp;
// }
// public readIntLE() {
// const tmp = this.buffer.readIntLE(this.offset);
// this.offset += 1;
// return tmp;
// }
// public readIntBE() {
// const tmp = this.buffer.readIntBE(this.offset);
// this.offset += 1;
// return tmp;
// }
/**
*
*/
expectUInt8(value) {
const tmp = this.buffer.readUInt8(this.offset);
this.offset += 1;
if (tmp !== value)
throw new Error(`Expected ${value} but got ${tmp}`);
return tmp;
}
/**
*
*/
readUInt8() {
const tmp = this.buffer.readUInt8(this.offset);
this.offset += 1;
return tmp;
}
/**
*
*/
readUInt16LE() {
const tmp = this.buffer.readUInt16LE(this.offset);
this.offset += 2;
return tmp;
}
/**
*
*/
readUInt16BE() {
const tmp = this.buffer.readUInt16BE(this.offset);
this.offset += 2;
return tmp;
}
/**
*
*/
readUInt32LE() {
const tmp = this.buffer.readUInt32LE(this.offset);
this.offset += 4;
return tmp;
}
/**
*
*/
readUInt32BE() {
const tmp = this.buffer.readUInt32BE(this.offset);
this.offset += 4;
return tmp;
}
/**
*
*/
readInt8() {
const tmp = this.buffer.readInt8(this.offset);
this.offset += 1;
return tmp;
}
/**
*
*/
readInt16LE() {
const tmp = this.buffer.readInt16LE(this.offset);
this.offset += 2;
return tmp;
}
/**
*
*/
readInt16BE() {
const tmp = this.buffer.readInt16BE(this.offset);
this.offset += 2;
return tmp;
}
/**
*
*/
readInt32LE() {
const tmp = this.buffer.readInt32LE(this.offset);
this.offset += 4;
return tmp;
}
/**
*
*/
readInt32BE() {
const tmp = this.buffer.readInt32BE(this.offset);
this.offset += 4;
return tmp;
}
/**
*
*/
readFloatLE() {
const tmp = this.buffer.readFloatLE(this.offset);
this.offset += 4;
return tmp;
}
/**
*
*/
readFloatBE() {
const tmp = this.buffer.readFloatBE(this.offset);
this.offset += 4;
return tmp;
}
/**
*
*/
readDoubleLE() {
const tmp = this.buffer.readDoubleLE(this.offset);
this.offset += 8;
return tmp;
}
/**
*
*/
readDoubleBE() {
const tmp = this.buffer.readDoubleBE(this.offset);
this.offset += 8;
return tmp;
}
read(tt, little = true) {
switch (tt) {
case ComponentTypeHeader.String:
return this.readDynamicBuffer().toString("ascii");
case ComponentTypeHeader.Byte:
return this.readUInt8();
case ComponentTypeHeader.Int16:
return little ? this.readInt16LE() : this.readInt16BE();
case ComponentTypeHeader.Int32:
return little ? this.readInt32LE() : this.readInt32BE();
case ComponentTypeHeader.Int64:
return little ? this.readBigInt64LE() : this.readBigInt64BE();
case ComponentTypeHeader.Float:
return little ? this.readFloatLE() : this.readFloatBE();
case ComponentTypeHeader.Double:
return little ? this.readDoubleLE() : this.readDoubleBE();
case ComponentTypeHeader.Boolean:
return !!this.readUInt8();
case ComponentTypeHeader.ByteArray:
return this.readDynamicBuffer();
case ComponentTypeHeader.UInt32:
return little ? this.readUInt32LE() : this.readUInt32BE();
}
}
//
//
// Methods
//
//
/**
*
*/
toBuffer() {
return this.buffer;
}
/**
* https://stackoverflow.com/questions/8609289/convert-a-binary-nodejs-buffer-to-javascript-arraybuffer
*/
toArrayBuffer() {
const arrayBuffer = new ArrayBuffer(this.length);
const view = new Uint8Array(arrayBuffer);
for (let i = 0; i < this.length; ++i) {
view[i] = this.buffer[i];
}
return arrayBuffer;
}
/**
*
*/
at(idx) {
return this.buffer[idx];
}
/**
* Advanced the buffer reader by pffset.
*/
advanceOffset(relativeOffset = 1) {
this.offset += relativeOffset;
return this;
}
/**
* This function reads how many bytes a normal integer would take
* as a 7-bit number
*
* 1(000 0001) 0(111 1110)
*/
static length7BitInt(value) {
let size = 0;
do
(value >>= 7), size++;
while (value > 0);
return size;
}
/**
* Reads in an integer in 7-bit notation. A 7-bit integer
* encoding splits a number into a variable size of bits,
* in which the first bit is set while bytes are following.
*
* @example
*
* ```
* 1111 0000 1010 1010 1000 0000 0000 0001 Reading In
* ^--- ---- ^--- ---- ^--- ---- ^--- ----
* 111 0000 010 1010 000 0000 000 0001 Writing Out
* ```
*/
read7BitInt() {
let value = 0, shift = 0, byte = 0xff;
while (byte & 0x80) {
byte = this.readUInt8();
value |= (byte & 0x7f) << shift;
shift += 7;
}
return value;
}
/**
* Write a normal integer value into buffer at offset.
*/
write7BitInt(value) {
while (value >= 128) {
this.writeUInt8((value & 127) | 128);
value >>= 7;
}
this.writeUInt8(value);
}
/**
* Reads a dynamic buffer which is prepended by its' length
* in 7-bit encoding.
*/
readDynamicBuffer() {
const length = this.read7BitInt();
const value = this.subarray(this.offset, length);
this.offset += length;
return value.toBuffer();
}
/**
* Append a buffer to the current buffer. Asserts the cursor
* to be at the end of the current buffer.
*/
append(buffer) {
if (this.offset !== this.length - 1)
throw new Error("Cursor hasn't finished reading yet.");
this.buffer = Buffer.concat([this.buffer, buffer]);
return this;
}
/**
* Keep Deserializing the buffer for typed data until
* you reach the end of the buffer. Typed data consists
* of a type indicator in 7-bit-encoding and data following
* accordingly.
*/
deserialize() {
const arr = [];
while (this.length > 0) {
const type = this.read7BitInt();
switch (type) {
case ComponentTypeHeader.String:
arr.push(this.readDynamicBuffer().toString("ascii"));
break;
case ComponentTypeHeader.Byte:
arr.push(this.readUInt8());
break;
case ComponentTypeHeader.Int16: // = Int16 (short)
arr.push(this.readInt16BE());
break;
case ComponentTypeHeader.Int32: // = Int32
arr.push(this.readInt32BE());
break;
case ComponentTypeHeader.Int64:
arr.push(this.readBigInt64BE());
break;
case ComponentTypeHeader.Float:
arr.push(this.readFloatBE());
break;
case ComponentTypeHeader.Double:
arr.push(this.readDoubleBE());
break;
case ComponentTypeHeader.Boolean:
arr.push(!!this.readUInt8()); // !! is truthy
break;
case ComponentTypeHeader.ByteArray:
arr.push(this.readDynamicBuffer());
break;
case ComponentTypeHeader.UInt32:
arr.push(this.readUInt32BE());
break;
default:
throw new Error(`While serializing a buffer for data, an unexpected type 0x${type.toString(16)} was read. Expected one of 0-8`);
}
}
return arr;
}
[Symbol.for("nodejs.util.inspect.custom")]() {
let s = '<BufferReader';
let copy = BufferReader.from(this.buffer);
copy.offset = this.offset;
for (let i = 0; i < 20 && this.offset + i < this.length - 1; i++) {
s += ' ' + copy.readUInt8().toString(16).padStart(2, '0');
}
return s + '>';
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVmZmVyUmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL0J1ZmZlclJlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUg7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQU4sSUFBWSxtQkFXWDtBQVhELFdBQVksbUJBQW1CO0lBQzNCLGlFQUFVLENBQUE7SUFDViw2REFBUSxDQUFBO0lBQ1IsK0RBQVMsQ0FBQTtJQUNULCtEQUFTLENBQUE7SUFDVCwrREFBUyxDQUFBO0lBQ1QsK0RBQVMsQ0FBQTtJQUNULGlFQUFVLENBQUE7SUFDVixtRUFBVyxDQUFBO0lBQ1gsdUVBQWEsQ0FBQTtJQUNiLGlFQUFVLENBQUE7QUFDZCxDQUFDLEVBWFcsbUJBQW1CLEtBQW5CLG1CQUFtQixRQVc5QjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxZQUFZO0lBSTdCOztPQUVHO0lBQ0gsWUFBb0IsTUFBYztRQUwxQixXQUFNLEdBQVcsQ0FBQyxDQUFDO1FBTXZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxFQUFFO0lBQ0YsRUFBRTtJQUNGLGlCQUFpQjtJQUNqQixFQUFFO0lBQ0YsRUFBRTtJQUVGOztPQUVHO0lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUF5QjtRQUN4QyxJQUFJLElBQUksWUFBWSxNQUFNO1lBQUUsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxPQUFPLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQWM7UUFDOUIsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsRUFBRTtJQUNGLEVBQUU7SUFDRiwwQkFBMEI7SUFDMUIsRUFBRTtJQUNGLEVBQUU7SUFFRjs7O09BR0c7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQWdCLEVBQUU7UUFDbkMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTFELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLGVBQWUsR0FBRyxhQUFhLENBQUMsQ0FBQztRQUN2RSxNQUFNLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwQixPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFnQixDQUFDO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQWdCLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsT0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBZ0IsQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFnQixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO1FBQ25ELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLE9BQU8sTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQWdCLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsT0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBZ0IsQ0FBQztRQUNsQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFpQixLQUFLO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFpQixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUvQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVoQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFnQixDQUFDO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLE9BQU8sTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQWE7UUFDN0IsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQTtRQUN6RSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQWdCLENBQUM7UUFDaEMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDN0QsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUF1QixFQUFFLEtBQWtEO1FBQzdGLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDVCxLQUFLLG1CQUFtQixDQUFDLE1BQU07Z0JBQzNCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFlLENBQUMsQ0FBQztZQUN4QyxLQUFLLG1CQUFtQixDQUFDLElBQUk7Z0JBQ3pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFlLENBQUMsQ0FBQztZQUN0QyxLQUFLLG1CQUFtQixDQUFDLEtBQUs7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFlLENBQUMsQ0FBQztZQUN2QyxLQUFLLG1CQUFtQixDQUFDLEtBQUs7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFlLENBQUMsQ0FBQztZQUN2QyxLQUFLLG1CQUFtQixDQUFDLEtBQUs7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFlLENBQUMsQ0FBQztZQUN2QyxLQUFLLG1CQUFtQixDQUFDLEtBQUs7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFlLENBQUMsQ0FBQztZQUN2QyxLQUFLLG1CQUFtQixDQUFDLE1BQU07Z0JBQzNCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFlLENBQUMsQ0FBQztZQUN4QyxLQUFLLG1CQUFtQixDQUFDLE9BQU87Z0JBQzVCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFnQixDQUFDLENBQUM7WUFDMUMsS0FBSyxtQkFBbUIsQ0FBQyxTQUFTO2dCQUM5QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBZSxDQUFDLENBQUM7WUFDM0MsS0FBSyxtQkFBbUIsQ0FBQyxNQUFNO2dCQUMzQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBZSxDQUFDLENBQUM7UUFDNUMsQ0FBQztJQUNMLENBQUM7SUFFRCxFQUFFO0lBQ0YsRUFBRTtJQUNGLFlBQVk7SUFDWixFQUFFO0lBQ0YsRUFBRTtJQUVGOztPQUVHO0lBQ0gsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzVDLENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVEsQ0FBQyxRQUFnQixJQUFJLENBQUMsTUFBTSxFQUFFLE1BQWMsSUFBSSxDQUFDLE1BQU07UUFDbEUsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFhO1FBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlLENBQUMsS0FBYTtRQUNoQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZSxDQUFDLEtBQWE7UUFDaEMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVUsQ0FBQyxLQUFhO1FBQzNCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhLENBQUMsS0FBYTtRQUM5QixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYSxDQUFDLEtBQWE7UUFDOUIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRDs7T0FFRztJQUNJLGFBQWEsQ0FBQyxLQUFhO1FBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhLENBQUMsS0FBYTtRQUM5QixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUyxDQUFDLEtBQWE7UUFDMUIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVksQ0FBQyxLQUFhO1FBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZLENBQUMsS0FBYTtRQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLEtBQWE7UUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVksQ0FBQyxLQUFhO1FBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZLENBQUMsS0FBYTtRQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLEtBQWE7UUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7T0FFRztJQUNJLGFBQWEsQ0FBQyxLQUFhO1FBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhLENBQUMsS0FBYTtRQUM5QixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZTtRQUNsQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDakIsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlO1FBQ2xCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNqQixPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWM7UUFDakIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksY0FBYztRQUNqQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDakIsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLHVEQUF1RDtJQUN2RCx3QkFBd0I7SUFDeEIsa0JBQWtCO0lBQ2xCLElBQUk7SUFFSix3QkFBd0I7SUFDeEIsdURBQXVEO0lBQ3ZELHdCQUF3QjtJQUN4QixrQkFBa0I7SUFDbEIsSUFBSTtJQUVKLHVCQUF1QjtJQUN2QixzREFBc0Q7SUFDdEQsd0JBQXdCO0lBQ3hCLGtCQUFrQjtJQUNsQixJQUFJO0lBRUosdUJBQXVCO0lBQ3ZCLHNEQUFzRDtJQUN0RCx3QkFBd0I7SUFDeEIsa0JBQWtCO0lBQ2xCLElBQUk7SUFFSjs7T0FFRztJQUNJLFdBQVcsQ0FBQyxLQUFhO1FBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNqQixJQUFJLEdBQUcsS0FBSyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssWUFBWSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztRQUNaLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNqQixPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVk7UUFDZixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDakIsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZO1FBQ2YsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWTtRQUNmLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNqQixPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVk7UUFDZixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDakIsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRO1FBQ1gsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVztRQUNkLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNqQixPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNJLFdBQVc7UUFDZCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDakIsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXO1FBQ2QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVztRQUNkLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNqQixPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNJLFdBQVc7UUFDZCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDakIsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXO1FBQ2QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWTtRQUNmLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNqQixPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVk7UUFDZixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDakIsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBYU0sSUFBSSxDQUFDLEVBQXVCLEVBQUUsTUFBTSxHQUFHLElBQUk7UUFDOUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNULEtBQUssbUJBQW1CLENBQUMsTUFBTTtnQkFDM0IsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEQsS0FBSyxtQkFBbUIsQ0FBQyxJQUFJO2dCQUN6QixPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM1QixLQUFLLG1CQUFtQixDQUFDLEtBQUs7Z0JBQzFCLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1RCxLQUFLLG1CQUFtQixDQUFDLEtBQUs7Z0JBQzFCLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1RCxLQUFLLG1CQUFtQixDQUFDLEtBQUs7Z0JBQzFCLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNsRSxLQUFLLG1CQUFtQixDQUFDLEtBQUs7Z0JBQzFCLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1RCxLQUFLLG1CQUFtQixDQUFDLE1BQU07Z0JBQzNCLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM5RCxLQUFLLG1CQUFtQixDQUFDLE9BQU87Z0JBQzVCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM5QixLQUFLLG1CQUFtQixDQUFDLFNBQVM7Z0JBQzlCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDcEMsS0FBSyxtQkFBbUIsQ0FBQyxNQUFNO2dCQUMzQixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEUsQ0FBQztJQUNMLENBQUM7SUFFRCxFQUFFO0lBQ0YsRUFBRTtJQUNGLFVBQVU7SUFDVixFQUFFO0lBQ0YsRUFBRTtJQUVGOztPQUVHO0lBQ0ksUUFBUTtRQUNYLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhO1FBQ2hCLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRCxNQUFNLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxFQUFFLENBQUMsR0FBVztRQUNqQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYSxDQUFDLGNBQWMsR0FBRyxDQUFDO1FBQ25DLElBQUksQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBYTtRQUNyQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYjtZQUFHLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO2VBQ2xCLEtBQUssR0FBRyxDQUFDLEVBQUU7UUFDbEIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNJLFdBQVc7UUFDZCxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQ1QsS0FBSyxHQUFHLENBQUMsRUFDVCxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRWhCLE9BQU8sSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ2pCLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEIsS0FBSyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUNoQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ2YsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVksQ0FBQyxLQUFhO1FBQzdCLE9BQU8sS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDckMsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUNoQixDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksaUJBQWlCO1FBQ3BCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUM7UUFDdEIsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxNQUFjO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFdBQVc7UUFDZCxNQUFNLEdBQUcsR0FBb0QsRUFBRSxDQUFDO1FBRWhFLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFaEMsUUFBUSxJQUFJLEVBQUUsQ0FBQztnQkFDWCxLQUFLLG1CQUFtQixDQUFDLE1BQU07b0JBQzNCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ3JELE1BQU07Z0JBQ1YsS0FBSyxtQkFBbUIsQ0FBQyxJQUFJO29CQUN6QixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO29CQUMzQixNQUFNO2dCQUNWLEtBQUssbUJBQW1CLENBQUMsS0FBSyxFQUFFLGtCQUFrQjtvQkFDOUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztvQkFDN0IsTUFBTTtnQkFDVixLQUFLLG1CQUFtQixDQUFDLEtBQUssRUFBRSxVQUFVO29CQUN0QyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO29CQUM3QixNQUFNO2dCQUNWLEtBQUssbUJBQW1CLENBQUMsS0FBSztvQkFDMUIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztvQkFDaEMsTUFBTTtnQkFDVixLQUFLLG1CQUFtQixDQUFDLEtBQUs7b0JBQzFCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7b0JBQzdCLE1BQU07Z0JBQ1YsS0FBSyxtQkFBbUIsQ0FBQyxNQUFNO29CQUMzQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO29CQUM5QixNQUFNO2dCQUNWLEtBQUssbUJBQW1CLENBQUMsT0FBTztvQkFDNUIsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlO29CQUM3QyxNQUFNO2dCQUNWLEtBQUssbUJBQW1CLENBQUMsU0FBUztvQkFDOUIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNWLEtBQUssbUJBQW1CLENBQUMsTUFBTTtvQkFDM0IsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztvQkFDOUIsTUFBTTtnQkFDVjtvQkFDSSxNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1lBQ3hJLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLEdBQUcsZUFBZSxDQUFDO1FBQ3hCLElBQUksSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUUxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0QsQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNuQixDQUFDO0NBQ0oifQ==