@jsprismarine/nbt
Version:
Minecraft: Bedrock Edition NBT parser/writer
235 lines (232 loc) • 28.3 kB
JavaScript
import { ByteOrder } from './ByteOrder.es.js';
import ByteValue from './types/ByteVal.es.js';
import DoubleValue from './types/DoubleVal.es.js';
import FloatValue from './types/FloatVal.es.js';
import LongValue from './types/LongVal.es.js';
import { NBTDefinitions } from './NBTDefinitions.es.js';
import NBTTagCompound from './NBTTagCompound.es.js';
import NumberValue from './types/NumberVal.es.js';
import ShortValue from './types/ShortVal.es.js';
import StringValue from './types/StringVal.es.js';
class NBTWriter {
order;
buf;
useVarint = false;
constructor(out, byteOrder) {
this.buf = out;
this.order = byteOrder;
}
setUseVarint(useVarint) {
this.useVarint = useVarint;
}
writeList(list) {
this.writeTagHeader(NBTDefinitions.TAG_LIST, "");
this.writeListValue(list);
}
writeCompound(compound) {
this.writeTagHeader(NBTDefinitions.TAG_COMPOUND, compound.getName() ?? "");
this.writeCompoundValue(compound);
}
writeTagHeader(type, name) {
this.writeByteValue(type);
this.writeStringValue(name);
}
writeStringValue(value) {
if (value !== null) {
const bytes = Buffer.from(value, "utf8");
if (this.useVarint) {
this.buf.writeUnsignedVarInt(Buffer.byteLength(value));
} else {
this.writeShortValue(Buffer.byteLength(value));
}
this.buf.write(bytes);
} else if (this.useVarint) {
this.writeByteValue(0);
} else {
this.writeShortValue(0);
}
}
writeByteValue(value) {
this.buf.writeByte(value);
}
writeShortValue(value) {
if (this.order === ByteOrder.LITTLE_ENDIAN) {
this.buf.writeUnsignedShortLE(value);
} else {
this.buf.writeUnsignedShort(value);
}
}
writeIntegerValue(value) {
if (this.useVarint) {
this.buf.writeVarInt(value);
} else if (this.order === ByteOrder.LITTLE_ENDIAN) {
this.buf.writeUnsignedIntLE(value);
} else {
this.buf.writeUnsignedInt(value);
}
}
writeLongValue(value) {
if (this.useVarint) {
this.buf.writeVarLong(value);
} else if (this.order === ByteOrder.LITTLE_ENDIAN) {
this.buf.writeUnsignedLongLE(value);
} else {
this.buf.writeUnsignedLong(value);
}
}
writeFloatValue(value) {
if (this.order === ByteOrder.LITTLE_ENDIAN) {
this.buf.writeFloatLE(value);
} else {
this.buf.writeFloat(value);
}
}
writeDoubleValue(value) {
if (this.order === ByteOrder.LITTLE_ENDIAN) {
this.buf.writeDoubleLE(value);
} else {
this.buf.writeDouble(value);
}
}
writeByteArrayValue(value) {
this.writeIntegerValue(value.length);
this.buf.write(value);
}
writeIntegerArrayValue(value) {
this.writeIntegerValue(value.length);
value.forEach((v) => {
this.writeIntegerValue(v);
});
}
writeListValue(value) {
if (value.size > 0) {
const listNbtType = this.getNBTTypeFromValue(value.entries().next().value);
this.writeByteValue(listNbtType);
this.writeIntegerValue(value.size);
for (const rawValue of value) {
switch (listNbtType) {
case NBTDefinitions.TAG_BYTE:
this.writeByteValue(rawValue.getValue());
break;
case NBTDefinitions.TAG_SHORT:
this.writeShortValue(rawValue.getValue());
break;
case NBTDefinitions.TAG_INT:
this.writeIntegerValue(rawValue.getValue());
break;
case NBTDefinitions.TAG_LONG:
this.writeLongValue(rawValue.getValue());
break;
case NBTDefinitions.TAG_FLOAT:
this.writeFloatValue(rawValue.getValue());
break;
case NBTDefinitions.TAG_DOUBLE:
this.writeDoubleValue(rawValue.getValue());
break;
case NBTDefinitions.TAG_BYTE_ARRAY:
this.writeDoubleValue(rawValue);
break;
case NBTDefinitions.TAG_STRING:
this.writeStringValue(rawValue.getValue());
break;
case NBTDefinitions.TAG_LIST:
this.writeListValue(rawValue);
break;
case NBTDefinitions.TAG_COMPOUND:
this.writeCompoundValue(rawValue);
break;
case NBTDefinitions.TAG_INT_ARRAY:
this.writeIntegerArrayValue(rawValue);
break;
default:
throw new Error("Invalid NBTTagType");
}
}
} else {
this.writeByteValue(NBTDefinitions.TAG_BYTE);
this.writeIntegerValue(0);
}
}
writeCompoundValue(compound) {
for (const [key, value] of compound.entries()) {
const nbtType = this.getNBTTypeFromValue(value);
this.writeTagHeader(nbtType, key);
switch (nbtType) {
case NBTDefinitions.TAG_BYTE:
this.writeByteValue(value.getValue());
break;
case NBTDefinitions.TAG_SHORT:
this.writeShortValue(value.getValue());
break;
case NBTDefinitions.TAG_INT:
this.writeIntegerValue(value.getValue());
break;
case NBTDefinitions.TAG_LONG:
this.writeLongValue(value.getValue());
break;
case NBTDefinitions.TAG_FLOAT:
this.writeFloatValue(value.getValue());
break;
case NBTDefinitions.TAG_DOUBLE:
this.writeDoubleValue(value.getValue());
break;
case NBTDefinitions.TAG_BYTE_ARRAY:
this.writeByteArrayValue(value);
break;
case NBTDefinitions.TAG_STRING:
this.writeStringValue(value.getValue());
break;
case NBTDefinitions.TAG_LIST:
this.writeListValue(value);
break;
case NBTDefinitions.TAG_COMPOUND:
this.writeCompoundValue(value);
break;
case NBTDefinitions.TAG_INT_ARRAY:
this.writeIntegerValue(value);
break;
default:
throw new Error("Invalid NBTTagType");
}
}
this.writeByteValue(NBTDefinitions.TAG_END);
}
getNBTTypeFromValue(value) {
if (value instanceof ByteValue) {
return NBTDefinitions.TAG_BYTE;
}
if (value instanceof ShortValue) {
return NBTDefinitions.TAG_SHORT;
}
if (value instanceof NumberValue) {
return NBTDefinitions.TAG_INT;
}
if (value instanceof LongValue) {
return NBTDefinitions.TAG_LONG;
}
if (value instanceof FloatValue) {
return NBTDefinitions.TAG_FLOAT;
}
if (value instanceof DoubleValue) {
return NBTDefinitions.TAG_DOUBLE;
}
if (value instanceof Buffer) {
return NBTDefinitions.TAG_BYTE_ARRAY;
}
if (value instanceof StringValue) {
return NBTDefinitions.TAG_STRING;
}
if (value instanceof Set) {
return NBTDefinitions.TAG_LIST;
}
if (value instanceof NBTTagCompound) {
return NBTDefinitions.TAG_COMPOUND;
}
if (Array.isArray(value)) {
return NBTDefinitions.TAG_INT_ARRAY;
}
throw new TypeError(`Invalid NBT Data: Cannot deduce NBT type of class ${value.constructor.name} (${value})`);
}
}
export { NBTWriter as default };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUV3JpdGVyLmVzLmpzIiwic291cmNlcyI6WyIuLi9zcmMvTkJUV3JpdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHsgQnl0ZU9yZGVyIH0gZnJvbSAnLi9CeXRlT3JkZXInO1xuaW1wb3J0IEJ5dGVWYWwgZnJvbSAnLi90eXBlcy9CeXRlVmFsJztcbmltcG9ydCBEb3VibGVWYWwgZnJvbSAnLi90eXBlcy9Eb3VibGVWYWwnO1xuaW1wb3J0IEZsb2F0VmFsIGZyb20gJy4vdHlwZXMvRmxvYXRWYWwnO1xuaW1wb3J0IExvbmdWYWwgZnJvbSAnLi90eXBlcy9Mb25nVmFsJztcbmltcG9ydCB7IE5CVERlZmluaXRpb25zIH0gZnJvbSAnLi9OQlREZWZpbml0aW9ucyc7XG5pbXBvcnQgTkJUVGFnQ29tcG91bmQgZnJvbSAnLi9OQlRUYWdDb21wb3VuZCc7XG5pbXBvcnQgTnVtYmVyVmFsIGZyb20gJy4vdHlwZXMvTnVtYmVyVmFsJztcbmltcG9ydCBTaG9ydFZhbCBmcm9tICcuL3R5cGVzL1Nob3J0VmFsJztcbmltcG9ydCBTdHJpbmdWYWwgZnJvbSAnLi90eXBlcy9TdHJpbmdWYWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOQlRXcml0ZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3JkZXI6IEJ5dGVPcmRlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJ1ZjogQmluYXJ5U3RyZWFtO1xuXG4gICAgcHJpdmF0ZSB1c2VWYXJpbnQgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvdXQ6IEJpbmFyeVN0cmVhbSwgYnl0ZU9yZGVyOiBCeXRlT3JkZXIpIHtcbiAgICAgICAgdGhpcy5idWYgPSBvdXQ7XG4gICAgICAgIHRoaXMub3JkZXIgPSBieXRlT3JkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFVzZVZhcmludCh1c2VWYXJpbnQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy51c2VWYXJpbnQgPSB1c2VWYXJpbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlTGlzdChsaXN0OiBTZXQ8YW55Pik6IHZvaWQge1xuICAgICAgICB0aGlzLndyaXRlVGFnSGVhZGVyKE5CVERlZmluaXRpb25zLlRBR19MSVNULCAnJyk7XG4gICAgICAgIHRoaXMud3JpdGVMaXN0VmFsdWUobGlzdCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlQ29tcG91bmQoY29tcG91bmQ6IE5CVFRhZ0NvbXBvdW5kKTogdm9pZCB7XG4gICAgICAgIHRoaXMud3JpdGVUYWdIZWFkZXIoTkJURGVmaW5pdGlvbnMuVEFHX0NPTVBPVU5ELCBjb21wb3VuZC5nZXROYW1lKCkgPz8gJycpO1xuICAgICAgICB0aGlzLndyaXRlQ29tcG91bmRWYWx1ZShjb21wb3VuZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZVRhZ0hlYWRlcih0eXBlOiBudW1iZXIsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLndyaXRlQnl0ZVZhbHVlKHR5cGUpO1xuICAgICAgICB0aGlzLndyaXRlU3RyaW5nVmFsdWUobmFtZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZVN0cmluZ1ZhbHVlKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBCdWZmZXIuZnJvbSh2YWx1ZSwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnVzZVZhcmludCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlVW5zaWduZWRWYXJJbnQoQnVmZmVyLmJ5dGVMZW5ndGgodmFsdWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZVNob3J0VmFsdWUoQnVmZmVyLmJ5dGVMZW5ndGgodmFsdWUpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5idWYud3JpdGUoYnl0ZXMpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXNlVmFyaW50KSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlQnl0ZVZhbHVlKDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53cml0ZVNob3J0VmFsdWUoMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVCeXRlVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUJ5dGUodmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVNob3J0VmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcmRlciA9PT0gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlVW5zaWduZWRTaG9ydExFKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlVW5zaWduZWRTaG9ydCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlSW50ZWdlclZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudXNlVmFyaW50KSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZVZhckludCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcmRlciA9PT0gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlVW5zaWduZWRJbnRMRSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZVVuc2lnbmVkSW50KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVMb25nVmFsdWUodmFsdWU6IGJpZ2ludCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy51c2VWYXJpbnQpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlVmFyTG9uZyh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcmRlciA9PT0gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlVW5zaWduZWRMb25nTEUodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZExvbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZUZsb2F0VmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcmRlciA9PT0gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlRmxvYXRMRSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVEb3VibGVWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVEb3VibGVMRSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZURvdWJsZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlQnl0ZUFycmF5VmFsdWUodmFsdWU6IEJ1ZmZlcik6IHZvaWQge1xuICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHZhbHVlLmxlbmd0aCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlSW50ZWdlckFycmF5VmFsdWUodmFsdWU6IG51bWJlcltdKSB7XG4gICAgICAgIHRoaXMud3JpdGVJbnRlZ2VyVmFsdWUodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgdmFsdWUuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgICAgdGhpcy53cml0ZUludGVnZXJWYWx1ZSh2KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZUxpc3RWYWx1ZSh2YWx1ZTogU2V0PGFueT4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlLnNpemUgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0TmJ0VHlwZSA9IHRoaXMuZ2V0TkJUVHlwZUZyb21WYWx1ZSh2YWx1ZS5lbnRyaWVzKCkubmV4dCgpLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUobGlzdE5idFR5cGUpO1xuICAgICAgICAgICAgdGhpcy53cml0ZUludGVnZXJWYWx1ZSh2YWx1ZS5zaXplKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmF3VmFsdWUgb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGxpc3ROYnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEU6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlQnl0ZVZhbHVlKHJhd1ZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NIT1JUOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVNob3J0VmFsdWUocmF3VmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUludGVnZXJWYWx1ZShyYXdWYWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MT05HOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUxvbmdWYWx1ZShyYXdWYWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19GTE9BVDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVGbG9hdFZhbHVlKHJhd1ZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0RPVUJMRTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVEb3VibGVWYWx1ZShyYXdWYWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19CWVRFX0FSUkFZOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZURvdWJsZVZhbHVlKHJhd1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TVFJJTkc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlU3RyaW5nVmFsdWUocmF3VmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTElTVDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVMaXN0VmFsdWUocmF3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0NPTVBPVU5EOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUNvbXBvdW5kVmFsdWUocmF3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVF9BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVJbnRlZ2VyQXJyYXlWYWx1ZShyYXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBOQlRUYWdUeXBlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53cml0ZUJ5dGVWYWx1ZShOQlREZWZpbml0aW9ucy5UQUdfQllURSk7XG4gICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZUNvbXBvdW5kVmFsdWUoY29tcG91bmQ6IE5CVFRhZ0NvbXBvdW5kKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGNvbXBvdW5kLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgbmJ0VHlwZSA9IHRoaXMuZ2V0TkJUVHlwZUZyb21WYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLndyaXRlVGFnSGVhZGVyKG5idFR5cGUsIGtleSk7XG4gICAgICAgICAgICBzd2l0Y2ggKG5idFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19CWVRFOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlQnl0ZVZhbHVlKHZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TSE9SVDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVNob3J0VmFsdWUodmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUludGVnZXJWYWx1ZSh2YWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTE9ORzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUxvbmdWYWx1ZSh2YWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRkxPQVQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVGbG9hdFZhbHVlKHZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19ET1VCTEU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVEb3VibGVWYWx1ZSh2YWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURV9BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUJ5dGVBcnJheVZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU1RSSU5HOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlU3RyaW5nVmFsdWUodmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0xJU1Q6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVMaXN0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19DT01QT1VORDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUNvbXBvdW5kVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlRfQVJSQVk6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVJbnRlZ2VyVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgTkJUVGFnVHlwZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53cml0ZUJ5dGVWYWx1ZShOQlREZWZpbml0aW9ucy5UQUdfRU5EKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5CVFR5cGVGcm9tVmFsdWUodmFsdWU6IGFueSk6IE5CVERlZmluaXRpb25zIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnl0ZVZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19CWVRFO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNob3J0VmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX1NIT1JUO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlclZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19JTlQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9uZ1ZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19MT05HO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0VmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0ZMT0FUO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERvdWJsZVZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19ET1VCTEU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0JZVEVfQVJSQVk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX1NUUklORztcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfTElTVDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOQlRUYWdDb21wb3VuZCkge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19DT01QT1VORDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfSU5UX0FSUkFZO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBOQlQgRGF0YTogQ2Fubm90IGRlZHVjZSBOQlQgdHlwZSBvZiBjbGFzcyAke3ZhbHVlLmNvbnN0cnVjdG9yLm5hbWV9ICgke3ZhbHVlfSlgKTtcbiAgICB9XG59XG4iXSwibmFtZXMiOlsiQnl0ZVZhbCIsIlNob3J0VmFsIiwiTnVtYmVyVmFsIiwiTG9uZ1ZhbCIsIkZsb2F0VmFsIiwiRG91YmxlVmFsIiwiU3RyaW5nVmFsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQVlBLE1BQXFCLFNBQVUsQ0FBQTtBQUFBLEVBQ1YsS0FBQTtBQUFBLEVBQ0EsR0FBQTtBQUFBLEVBRVQsU0FBWSxHQUFBLEtBQUE7QUFBQSxFQUViLFdBQUEsQ0FBWSxLQUFtQixTQUFzQixFQUFBO0FBQ3hELElBQUEsSUFBQSxDQUFLLEdBQU0sR0FBQSxHQUFBO0FBQ1gsSUFBQSxJQUFBLENBQUssS0FBUSxHQUFBLFNBQUE7QUFBQTtBQUNqQixFQUVPLGFBQWEsU0FBMEIsRUFBQTtBQUMxQyxJQUFBLElBQUEsQ0FBSyxTQUFZLEdBQUEsU0FBQTtBQUFBO0FBQ3JCLEVBRU8sVUFBVSxJQUFzQixFQUFBO0FBQ25DLElBQUssSUFBQSxDQUFBLGNBQUEsQ0FBZSxjQUFlLENBQUEsUUFBQSxFQUFVLEVBQUUsQ0FBQTtBQUMvQyxJQUFBLElBQUEsQ0FBSyxlQUFlLElBQUksQ0FBQTtBQUFBO0FBQzVCLEVBRU8sY0FBYyxRQUFnQyxFQUFBO0FBQ2pELElBQUEsSUFBQSxDQUFLLGVBQWUsY0FBZSxDQUFBLFlBQUEsRUFBYyxRQUFTLENBQUEsT0FBQSxNQUFhLEVBQUUsQ0FBQTtBQUN6RSxJQUFBLElBQUEsQ0FBSyxtQkFBbUIsUUFBUSxDQUFBO0FBQUE7QUFDcEMsRUFFUSxjQUFBLENBQWUsTUFBYyxJQUFvQixFQUFBO0FBQ3JELElBQUEsSUFBQSxDQUFLLGVBQWUsSUFBSSxDQUFBO0FBQ3hCLElBQUEsSUFBQSxDQUFLLGlCQUFpQixJQUFJLENBQUE7QUFBQTtBQUM5QixFQUVRLGlCQUFpQixLQUE0QixFQUFBO0FBQ2pELElBQUEsSUFBSSxVQUFVLElBQU0sRUFBQTtBQUNoQixNQUFBLE1BQU0sS0FBUSxHQUFBLE1BQUEsQ0FBTyxJQUFLLENBQUEsS0FBQSxFQUFPLE1BQU0sQ0FBQTtBQUN2QyxNQUFBLElBQUksS0FBSyxTQUFXLEVBQUE7QUFDaEIsUUFBQSxJQUFBLENBQUssR0FBSSxDQUFBLG1CQUFBLENBQW9CLE1BQU8sQ0FBQSxVQUFBLENBQVcsS0FBSyxDQUFDLENBQUE7QUFBQSxPQUNsRCxNQUFBO0FBQ0gsUUFBQSxJQUFBLENBQUssZUFBZ0IsQ0FBQSxNQUFBLENBQU8sVUFBVyxDQUFBLEtBQUssQ0FBQyxDQUFBO0FBQUE7QUFHakQsTUFBSyxJQUFBLENBQUEsR0FBQSxDQUFJLE1BQU0sS0FBSyxDQUFBO0FBQUEsS0FDeEIsTUFBQSxJQUFXLEtBQUssU0FBVyxFQUFBO0FBQ3ZCLE1BQUEsSUFBQSxDQUFLLGVBQWUsQ0FBQyxDQUFBO0FBQUEsS0FDbEIsTUFBQTtBQUNILE1BQUEsSUFBQSxDQUFLLGdCQUFnQixDQUFDLENBQUE7QUFBQTtBQUMxQjtBQUNKLEVBRU8sZUFBZSxLQUFxQixFQUFBO0FBQ3ZDLElBQUssSUFBQSxDQUFBLEdBQUEsQ0FBSSxVQUFVLEtBQUssQ0FBQTtBQUFBO0FBQzVCLEVBRU8sZ0JBQWdCLEtBQXFCLEVBQUE7QUFDeEMsSUFBSSxJQUFBLElBQUEsQ0FBSyxLQUFVLEtBQUEsU0FBQSxDQUFVLGFBQWUsRUFBQTtBQUN4QyxNQUFLLElBQUEsQ0FBQSxHQUFBLENBQUkscUJBQXFCLEtBQUssQ0FBQTtBQUFBLEtBQ2hDLE1BQUE7QUFDSCxNQUFLLElBQUEsQ0FBQSxHQUFBLENBQUksbUJBQW1CLEtBQUssQ0FBQTtBQUFBO0FBQ3JDO0FBQ0osRUFFUSxrQkFBa0IsS0FBcUIsRUFBQTtBQUMzQyxJQUFBLElBQUksS0FBSyxTQUFXLEVBQUE7QUFDaEIsTUFBSyxJQUFBLENBQUEsR0FBQSxDQUFJLFlBQVksS0FBSyxDQUFBO0FBQUEsS0FDbkIsTUFBQSxJQUFBLElBQUEsQ0FBSyxLQUFVLEtBQUEsU0FBQSxDQUFVLGFBQWUsRUFBQTtBQUMvQyxNQUFLLElBQUEsQ0FBQSxHQUFBLENBQUksbUJBQW1CLEtBQUssQ0FBQTtBQUFBLEtBQzlCLE1BQUE7QUFDSCxNQUFLLElBQUEsQ0FBQSxHQUFBLENBQUksaUJBQWlCLEtBQUssQ0FBQTtBQUFBO0FBQ25DO0FBQ0osRUFFUSxlQUFlLEtBQXFCLEVBQUE7QUFDeEMsSUFBQSxJQUFJLEtBQUssU0FBVyxFQUFBO0FBQ2hCLE1BQUssSUFBQSxDQUFBLEdBQUEsQ0FBSSxhQUFhLEtBQUssQ0FBQTtBQUFBLEtBQ3BCLE1BQUEsSUFBQSxJQUFBLENBQUssS0FBVSxLQUFBLFNBQUEsQ0FBVSxhQUFlLEVBQUE7QUFDL0MsTUFBSyxJQUFBLENBQUEsR0FBQSxDQUFJLG9CQUFvQixLQUFLLENBQUE7QUFBQSxLQUMvQixNQUFBO0FBQ0gsTUFBSyxJQUFBLENBQUEsR0FBQSxDQUFJLGtCQUFrQixLQUFLLENBQUE7QUFBQTtBQUNwQztBQUNKLEVBRVEsZ0JBQWdCLEtBQXFCLEVBQUE7QUFDekMsSUFBSSxJQUFBLElBQUEsQ0FBSyxLQUFVLEtBQUEsU0FBQSxDQUFVLGFBQWUsRUFBQTtBQUN4QyxNQUFLLElBQUEsQ0FBQSxHQUFBLENBQUksYUFBYSxLQUFLLENBQUE7QUFBQSxLQUN4QixNQUFBO0FBQ0gsTUFBSyxJQUFBLENBQUEsR0FBQSxDQUFJLFdBQVcsS0FBSyxDQUFBO0FBQUE7QUFDN0I7QUFDSixFQUVRLGlCQUFpQixLQUFxQixFQUFBO0FBQzFDLElBQUksSUFBQSxJQUFBLENBQUssS0FBVSxLQUFBLFNBQUEsQ0FBVSxhQUFlLEVBQUE7QUFDeEMsTUFBSyxJQUFBLENBQUEsR0FBQSxDQUFJLGNBQWMsS0FBSyxDQUFBO0FBQUEsS0FDekIsTUFBQTtBQUNILE1BQUssSUFBQSxDQUFBLEdBQUEsQ0FBSSxZQUFZLEtBQUssQ0FBQTtBQUFBO0FBQzlCO0FBQ0osRUFFUSxvQkFBb0IsS0FBcUIsRUFBQTtBQUM3QyxJQUFLLElBQUEsQ0FBQSxpQkFBQSxDQUFrQixNQUFNLE1BQU0sQ0FBQTtBQUNuQyxJQUFLLElBQUEsQ0FBQSxHQUFBLENBQUksTUFBTSxLQUFLLENBQUE7QUFBQTtBQUN4QixFQUVRLHVCQUF1QixLQUFpQixFQUFBO0FBQzVDLElBQUssSUFBQSxDQUFBLGlCQUFBLENBQWtCLE1BQU0sTUFBTSxDQUFBO0FBQ25DLElBQU0sS0FBQSxDQUFBLE9BQUEsQ0FBUSxDQUFDLENBQU0sS0FBQTtBQUNqQixNQUFBLElBQUEsQ0FBSyxrQkFBa0IsQ0FBQyxDQUFBO0FBQUEsS0FDM0IsQ0FBQTtBQUFBO0FBQ0wsRUFFUSxlQUFlLEtBQXVCLEVBQUE7QUFDMUMsSUFBSSxJQUFBLEtBQUEsQ0FBTSxPQUFPLENBQUcsRUFBQTtBQUNoQixNQUFNLE1BQUEsV0FBQSxHQUFjLEtBQUssbUJBQW9CLENBQUEsS0FBQSxDQUFNLFNBQVUsQ0FBQSxJQUFBLEdBQU8sS0FBSyxDQUFBO0FBQ3pFLE1BQUEsSUFBQSxDQUFLLGVBQWUsV0FBVyxDQUFBO0FBQy9CLE1BQUssSUFBQSxDQUFBLGlCQUFBLENBQWtCLE1BQU0sSUFBSSxDQUFBO0FBQ2pDLE1BQUEsS0FBQSxNQUFXLFlBQVksS0FBTyxFQUFBO0FBQzFCLFFBQUEsUUFBUSxXQUFhO0FBQUEsVUFDakIsS0FBSyxjQUFlLENBQUEsUUFBQTtBQUNoQixZQUFLLElBQUEsQ0FBQSxjQUFBLENBQWUsUUFBUyxDQUFBLFFBQUEsRUFBVSxDQUFBO0FBQ3ZDLFlBQUE7QUFBQSxVQUNKLEtBQUssY0FBZSxDQUFBLFNBQUE7QUFDaEIsWUFBSyxJQUFBLENBQUEsZUFBQSxDQUFnQixRQUFTLENBQUEsUUFBQSxFQUFVLENBQUE7QUFDeEMsWUFBQTtBQUFBLFVBQ0osS0FBSyxjQUFlLENBQUEsT0FBQTtBQUNoQixZQUFLLElBQUEsQ0FBQSxpQkFBQSxDQUFrQixRQUFTLENBQUEsUUFBQSxFQUFVLENBQUE7QUFDMUMsWUFBQTtBQUFBLFVBQ0osS0FBSyxjQUFlLENBQUEsUUFBQTtBQUNoQixZQUFLLElBQUEsQ0FBQSxjQUFBLENBQWUsUUFBUyxDQUFBLFFBQUEsRUFBVSxDQUFBO0FBQ3ZDLFlBQUE7QUFBQSxVQUNKLEtBQUssY0FBZSxDQUFBLFNBQUE7QUFDaEIsWUFBSyxJQUFBLENBQUEsZUFBQSxDQUFnQixRQUFTLENBQUEsUUFBQSxFQUFVLENBQUE7QUFDeEMsWUFBQTtBQUFBLFVBQ0osS0FBSyxjQUFlLENBQUEsVUFBQTtBQUNoQixZQUFLLElBQUEsQ0FBQSxnQkFBQSxDQUFpQixRQUFTLENBQUEsUUFBQSxFQUFVLENBQUE7QUFDekMsWUFBQTtBQUFBLFVBQ0osS0FBSyxjQUFlLENBQUEsY0FBQTtBQUNoQixZQUFBLElBQUEsQ0FBSyxpQkFBaUIsUUFBUSxDQUFBO0FBQzlCLFlBQUE7QUFBQSxVQUNKLEtBQUssY0FBZSxDQUFBLFVBQUE7QUFDaEIsWUFBSyxJQUFBLENBQUEsZ0JBQUEsQ0FBaUIsUUFBUyxDQUFBLFFBQUEsRUFBVSxDQUFBO0FBQ3pDLFlBQUE7QUFBQSxVQUNKLEtBQUssY0FBZSxDQUFBLFFBQUE7QUFDaEIsWUFBQSxJQUFBLENBQUssZUFBZSxRQUFRLENBQUE7QUFDNUIsWUFBQTtBQUFBLFVBQ0osS0FBSyxjQUFlLENBQUEsWUFBQTtBQUNoQixZQUFBLElBQUEsQ0FBSyxtQkFBbUIsUUFBUSxDQUFBO0FBQ2hDLFlBQUE7QUFBQSxVQUNKLEtBQUssY0FBZSxDQUFBLGFBQUE7QUFDaEIsWUFBQSxJQUFBLENBQUssdUJBQXVCLFFBQVEsQ0FBQTtBQUNwQyxZQUFBO0FBQUEsVUFDSjtBQUNJLFlBQU0sTUFBQSxJQUFJLE1BQU0sb0JBQW9CLENBQUE7QUFBQTtBQUM1QztBQUNKLEtBQ0csTUFBQTtBQUNILE1BQUssSUFBQSxDQUFBLGNBQUEsQ0FBZSxlQUFlLFFBQVEsQ0FBQTtBQUMzQyxNQUFBLElBQUEsQ0FBSyxrQkFBa0IsQ0FBQyxDQUFBO0FBQUE7QUFDNUI7QUFDSixFQUVRLG1CQUFtQixRQUFnQyxFQUFBO0FBQ3ZELElBQUEsS0FBQSxNQUFXLENBQUMsR0FBSyxFQUFBLEtBQUssQ0FBSyxJQUFBLFFBQUEsQ0FBUyxTQUFXLEVBQUE7QUFDM0MsTUFBTSxNQUFBLE9BQUEsR0FBVSxJQUFLLENBQUEsbUJBQUEsQ0FBb0IsS0FBSyxDQUFBO0FBQzlDLE1BQUssSUFBQSxDQUFBLGNBQUEsQ0FBZSxTQUFTLEdBQUcsQ0FBQTtBQUNoQyxNQUFBLFFBQVEsT0FBUztBQUFBLFFBQ2IsS0FBSyxjQUFlLENBQUEsUUFBQTtBQUNoQixVQUFLLElBQUEsQ0FBQSxjQUFBLENBQWUsS0FBTSxDQUFBLFFBQUEsRUFBVSxDQUFBO0FBQ3BDLFVBQUE7QUFBQSxRQUNKLEtBQUssY0FBZSxDQUFBLFNBQUE7QUFDaEIsVUFBSyxJQUFBLENBQUEsZUFBQSxDQUFnQixLQUFNLENBQUEsUUFBQSxFQUFVLENBQUE7QUFDckMsVUFBQTtBQUFBLFFBQ0osS0FBSyxjQUFlLENBQUEsT0FBQTtBQUNoQixVQUFLLElBQUEsQ0FBQSxpQkFBQSxDQUFrQixLQUFNLENBQUEsUUFBQSxFQUFVLENBQUE7QUFDdkMsVUFBQTtBQUFBLFFBQ0osS0FBSyxjQUFlLENBQUEsUUFBQTtBQUNoQixVQUFLLElBQUEsQ0FBQSxjQUFBLENBQWUsS0FBTSxDQUFBLFFBQUEsRUFBVSxDQUFBO0FBQ3BDLFVBQUE7QUFBQSxRQUNKLEtBQUssY0FBZSxDQUFBLFNBQUE7QUFDaEIsVUFBSyxJQUFBLENBQUEsZUFBQSxDQUFnQixLQUFNLENBQUEsUUFBQSxFQUFVLENBQUE7QUFDckMsVUFBQTtBQUFBLFFBQ0osS0FBSyxjQUFlLENBQUEsVUFBQTtBQUNoQixVQUFLLElBQUEsQ0FBQSxnQkFBQSxDQUFpQixLQUFNLENBQUEsUUFBQSxFQUFVLENBQUE7QUFDdEMsVUFBQTtBQUFBLFFBQ0osS0FBSyxjQUFlLENBQUEsY0FBQTtBQUNoQixVQUFBLElBQUEsQ0FBSyxvQkFBb0IsS0FBSyxDQUFBO0FBQzlCLFVBQUE7QUFBQSxRQUNKLEtBQUssY0FBZSxDQUFBLFVBQUE7QUFDaEIsVUFBSyxJQUFBLENBQUEsZ0JBQUEsQ0FBaUIsS0FBTSxDQUFBLFFBQUEsRUFBVSxDQUFBO0FBQ3RDLFVBQUE7QUFBQSxRQUNKLEtBQUssY0FBZSxDQUFBLFFBQUE7QUFDaEIsVUFBQSxJQUFBLENBQUssZUFBZSxLQUFLLENBQUE7QUFDekIsVUFBQTtBQUFBLFFBQ0osS0FBSyxjQUFlLENBQUEsWUFBQTtBQUNoQixVQUFBLElBQUEsQ0FBSyxtQkFBbUIsS0FBSyxDQUFBO0FBQzdCLFVBQUE7QUFBQSxRQUNKLEtBQUssY0FBZSxDQUFBLGFBQUE7QUFDaEIsVUFBQSxJQUFBLENBQUssa0JBQWtCLEtBQUssQ0FBQTtBQUM1QixVQUFBO0FBQUEsUUFDSjtBQUNJLFVBQU0sTUFBQSxJQUFJLE1BQU0sb0JBQW9CLENBQUE7QUFBQTtBQUM1QztBQUdKLElBQUssSUFBQSxDQUFBLGNBQUEsQ0FBZSxlQUFlLE9BQU8sQ0FBQTtBQUFBO0FBQzlDLEVBRVEsb0JBQW9CLEtBQTRCLEVBQUE7QUFDcEQsSUFBQSxJQUFJLGlCQUFpQkEsU0FBUyxFQUFBO0FBQzFCLE1BQUEsT0FBTyxjQUFlLENBQUEsUUFBQTtBQUFBO0FBRTFCLElBQUEsSUFBSSxpQkFBaUJDLFVBQVUsRUFBQTtBQUMzQixNQUFBLE9BQU8sY0FBZSxDQUFBLFNBQUE7QUFBQTtBQUUxQixJQUFBLElBQUksaUJBQWlCQyxXQUFXLEVBQUE7QUFDNUIsTUFBQSxPQUFPLGNBQWUsQ0FBQSxPQUFBO0FBQUE7QUFFMUIsSUFBQSxJQUFJLGlCQUFpQkMsU0FBUyxFQUFBO0FBQzFCLE1BQUEsT0FBTyxjQUFlLENBQUEsUUFBQTtBQUFBO0FBRTFCLElBQUEsSUFBSSxpQkFBaUJDLFVBQVUsRUFBQTtBQUMzQixNQUFBLE9BQU8sY0FBZSxDQUFBLFNBQUE7QUFBQTtBQUUxQixJQUFBLElBQUksaUJBQWlCQyxXQUFXLEVBQUE7QUFDNUIsTUFBQSxPQUFPLGNBQWUsQ0FBQSxVQUFBO0FBQUE7QUFFMUIsSUFBQSxJQUFJLGlCQUFpQixNQUFRLEVBQUE7QUFDekIsTUFBQSxPQUFPLGNBQWUsQ0FBQSxjQUFBO0FBQUE7QUFFMUIsSUFBQSxJQUFJLGlCQUFpQkMsV0FBVyxFQUFBO0FBQzVCLE1BQUEsT0FBTyxjQUFlLENBQUEsVUFBQTtBQUFBO0FBRTFCLElBQUEsSUFBSSxpQkFBaUIsR0FBSyxFQUFBO0FBQ3RCLE1BQUEsT0FBTyxjQUFlLENBQUEsUUFBQTtBQUFBO0FBRTFCLElBQUEsSUFBSSxpQkFBaUIsY0FBZ0IsRUFBQTtBQUNqQyxNQUFBLE9BQU8sY0FBZSxDQUFBLFlBQUE7QUFBQTtBQUUxQixJQUFJLElBQUEsS0FBQSxDQUFNLE9BQVEsQ0FBQSxLQUFLLENBQUcsRUFBQTtBQUN0QixNQUFBLE9BQU8sY0FBZSxDQUFBLGFBQUE7QUFBQTtBQUcxQixJQUFNLE1BQUEsSUFBSSxVQUFVLENBQXFELGtEQUFBLEVBQUEsS0FBQSxDQUFNLFlBQVksSUFBSSxDQUFBLEVBQUEsRUFBSyxLQUFLLENBQUcsQ0FBQSxDQUFBLENBQUE7QUFBQTtBQUVwSDs7OzsifQ==