@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
128 lines (127 loc) • 13.8 kB
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const require_runtime = require("../_virtual/_rolldown/runtime.cjs.cjs");
const require_block_BlockToolType = require("../block/BlockToolType.cjs.cjs");
const require_block_BlockMappings = require("../block/BlockMappings.cjs.cjs");
let _jsprismarine_jsbinaryutils = require("@jsprismarine/jsbinaryutils");
_jsprismarine_jsbinaryutils = require_runtime.__toESM(_jsprismarine_jsbinaryutils, 1);
let _jsprismarine_bedrock_data = require("@jsprismarine/bedrock-data");
let _jsprismarine_nbt = require("@jsprismarine/nbt");
//#region src/item/Item.ts
var Item = class Item {
id;
networkId;
name;
meta = 0;
durability = this.getMaxDurability();
nbt = null;
count = 1;
constructor({ id, name, meta }) {
this.id = id;
this.name = name;
if (meta) this.meta = meta;
this.networkId = _jsprismarine_bedrock_data.item_id_map[name];
}
getName() {
return this.name;
}
getId() {
return this.id;
}
/**
* Get the Block's network numeric id
*/
getNetworkId() {
return this.networkId || this.getId();
}
isTool() {
return false;
}
isArmorPiece() {
return false;
}
getBurnTime() {
return 0;
}
getToolType() {
return require_block_BlockToolType.BlockToolType.None;
}
getToolHarvestLevel() {
return 0;
}
getArmorDefensePoints() {
return 0;
}
getArmorToughness() {
return 0;
}
hasEnchantment(_enchantment) {
return false;
}
getEnchantability() {
return 0;
}
getMaxDurability() {
return 0;
}
getDurability() {
return this.durability;
}
getMaxAmount() {
return 64;
}
getAmount() {
return this.count;
}
isPartOfCreativeInventory() {
return true;
}
networkSerialize(stream, additionalData = null) {
stream.writeVarInt(this.getNetworkId());
if (this.getId() === 0 || this.getName() === "minecraft:air") return;
stream.writeShortLE(this.getAmount());
stream.writeUnsignedVarInt(this.meta);
if (additionalData) additionalData(stream);
stream.writeVarInt(require_block_BlockMappings.BlockMappings.getRuntimeId(this.getName()));
const str = new _jsprismarine_jsbinaryutils.default();
str.writeShortLE(0);
str.writeIntLE(0);
str.writeIntLE(0);
if (this.getName() === "minecraft:shield") str.writeLongLE(BigInt(0));
stream.writeUnsignedVarInt(str.getBuffer().byteLength);
stream.write(new Uint8Array(str.getBuffer()));
}
static networkDeserialize(stream, extra = false) {
const id = stream.readVarInt();
if (id === 0) return new Item({
id: 0,
name: "minecraft:air"
});
stream.readUnsignedShortLE();
stream.readUnsignedVarInt();
if (extra && stream.readBoolean()) stream.readVarInt();
const data = stream.readVarInt() >> 8;
if (stream.readUnsignedShortLE() === -1) {
stream.readByte();
try {
const nbtReader = new _jsprismarine_nbt.NBTReader(stream, _jsprismarine_nbt.ByteOrder.LITTLE_ENDIAN);
nbtReader.setUseVarint(true);
nbtReader.parse();
} catch (error) {
throw new Error(`Failed to parse item stack nbt`, { cause: error });
}
}
const countPlaceOn = stream.readVarInt();
for (let i = 0; i < countPlaceOn; i++) stream.read(stream.readUnsignedShortLE());
const countCanBreak = stream.readVarInt();
for (let i = 0; i < countCanBreak; i++) stream.read(stream.readUnsignedShortLE());
return new Item({
id,
name: "minecraft:unknown",
meta: data
});
}
};
//#endregion
exports.Item = Item;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXRlbS5janMuY2pzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pdGVtL0l0ZW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnl0ZU9yZGVyLCBOQlRSZWFkZXIgfSBmcm9tICdAanNwcmlzbWFyaW5lL25idCc7XG5cbmltcG9ydCB7IGl0ZW1faWRfbWFwIGFzIEl0ZW1JZE1hcCB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvYmVkcm9jay1kYXRhJztcbmltcG9ydCBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcbmltcG9ydCB7IEJsb2NrTWFwcGluZ3MgfSBmcm9tICcuLi9ibG9jay9CbG9ja01hcHBpbmdzJztcbmltcG9ydCB7IEJsb2NrVG9vbFR5cGUgfSBmcm9tICcuLi9ibG9jay9CbG9ja1Rvb2xUeXBlJztcbmltcG9ydCB0eXBlIHsgSXRlbUVuY2hhbnRtZW50VHlwZSB9IGZyb20gJy4vSXRlbUVuY2hhbnRtZW50VHlwZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVByb3BzIHtcbiAgICBpZDogbnVtYmVyO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBtZXRhPzogbnVtYmVyO1xuICAgIG5idD86IGFueTtcbiAgICBjb3VudD86IG51bWJlcjtcbiAgICBkdXJhYmlsaXR5PzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgSXRlbSB7XG4gICAgcHJpdmF0ZSBpZDogbnVtYmVyO1xuICAgIHByaXZhdGUgbmV0d29ya0lkOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIG1ldGEgPSAwO1xuICAgIHB1YmxpYyBkdXJhYmlsaXR5OiBudW1iZXIgPSB0aGlzLmdldE1heER1cmFiaWxpdHkoKTtcblxuICAgIC8vIFRPRE9cbiAgICBwdWJsaWMgbmJ0ID0gbnVsbDtcbiAgICBwdWJsaWMgY291bnQgPSAxO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHsgaWQsIG5hbWUsIG1ldGEgfTogSXRlbVByb3BzKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgaWYgKG1ldGEpIHRoaXMubWV0YSA9IG1ldGE7XG5cbiAgICAgICAgdGhpcy5uZXR3b3JrSWQgPSAoSXRlbUlkTWFwIGFzIGFueSlbbmFtZV0gYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldElkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgbmV0d29yayBudW1lcmljIGlkXG4gICAgICovXG4gICAgcHVibGljIGdldE5ldHdvcmtJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV0d29ya0lkIHx8IHRoaXMuZ2V0SWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNUb29sKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQXJtb3JQaWVjZSgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRCdXJuVGltZSgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRvb2xUeXBlKCkge1xuICAgICAgICByZXR1cm4gQmxvY2tUb29sVHlwZS5Ob25lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUb29sSGFydmVzdExldmVsKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QXJtb3JEZWZlbnNlUG9pbnRzKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QXJtb3JUb3VnaG5lc3MoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNFbmNoYW50bWVudChfZW5jaGFudG1lbnQ6IEl0ZW1FbmNoYW50bWVudFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFbmNoYW50YWJpbGl0eSgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1heER1cmFiaWxpdHkoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREdXJhYmlsaXR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kdXJhYmlsaXR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNYXhBbW91bnQoKSB7XG4gICAgICAgIHJldHVybiA2NDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QW1vdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb3VudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQYXJ0T2ZDcmVhdGl2ZUludmVudG9yeSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIG5ldHdvcmtTZXJpYWxpemUoXG4gICAgICAgIHN0cmVhbTogQmluYXJ5U3RyZWFtLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogbnVsbCB8ICgoc3RyZWFtOiBCaW5hcnlTdHJlYW0pID0+IHZvaWQpID0gbnVsbFxuICAgICk6IHZvaWQge1xuICAgICAgICBzdHJlYW0ud3JpdGVWYXJJbnQodGhpcy5nZXROZXR3b3JrSWQoKSk7XG4gICAgICAgIGlmICh0aGlzLmdldElkKCkgPT09IDAgfHwgdGhpcy5nZXROYW1lKCkgPT09ICdtaW5lY3JhZnQ6YWlyJykge1xuICAgICAgICAgICAgLy8gVGhlIGl0ZW0gaXMgQWlyIHNvIHRoZXJlJ3Mgbm8gYWRkaXRpb25hbCBkYXRhXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzdHJlYW0ud3JpdGVTaG9ydExFKHRoaXMuZ2V0QW1vdW50KCkpO1xuICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZFZhckludCh0aGlzLm1ldGEpO1xuXG4gICAgICAgIC8vIFVzZSBhIGNsb3N1cmUgdG8gYWRkIGFkZGl0aW9uYWwgZGF0YVxuICAgICAgICBpZiAoYWRkaXRpb25hbERhdGEpIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhKHN0cmVhbSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBQcm9wZXIgYmxvY2sgcnVudGltZSBJRFxuICAgICAgICBzdHJlYW0ud3JpdGVWYXJJbnQoQmxvY2tNYXBwaW5ncy5nZXRSdW50aW1lSWQodGhpcy5nZXROYW1lKCkpKTtcblxuICAgICAgICBjb25zdCBzdHIgPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAgICAgLyogaWYgKHRoaXMubmJ0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBXcml0ZSB0aGUgYW1vdW50IG9mIHRhZ3MgdG8gd3JpdGVcbiAgICAgICAgICAgIC8vICgxKSBhY2NvcmRpbmcgdG8gdmFuaWxsYVxuICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRTaG9ydExFKDB4ZmZmZik7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVCeXRlKDEpO1xuXG4gICAgICAgICAgICAvLyBXcml0ZSBoYXJkY29kZWQgTkJUIHRhZ1xuICAgICAgICAgICAgLy8gVE9ETzogdW5pbXBsZW1lbnRlZCBOQlQud3JpdGUobmJ0LCB0cnVlLCB0cnVlKVxuICAgICAgICB9ICovXG5cbiAgICAgICAgLy8gVE9ETzogcHJvcGVyIE5CVFxuICAgICAgICBzdHIud3JpdGVTaG9ydExFKDApO1xuXG4gICAgICAgIC8vIENhblBsYWNlIGFuZCBjYW5CcmVha1xuICAgICAgICBzdHIud3JpdGVJbnRMRSgwKTtcbiAgICAgICAgc3RyLndyaXRlSW50TEUoMCk7XG5cbiAgICAgICAgLy8gVE9ETzogY2hlY2sgZm9yIGFkZGl0aW9uYWwgZGF0YVxuICAgICAgICBpZiAodGhpcy5nZXROYW1lKCkgPT09ICdtaW5lY3JhZnQ6c2hpZWxkJykge1xuICAgICAgICAgICAgc3RyLndyaXRlTG9uZ0xFKEJpZ0ludCgwKSk7XG4gICAgICAgIH1cblxuICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZFZhckludChzdHIuZ2V0QnVmZmVyKCkuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHN0cmVhbS53cml0ZShuZXcgVWludDhBcnJheShzdHIuZ2V0QnVmZmVyKCkpKTtcblxuICAgICAgICAvLyBUT0RPOiBjaGVjayBmb3IgYWRkaXRpb25hbCBkYXRhXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBuZXR3b3JrRGVzZXJpYWxpemUoc3RyZWFtOiBCaW5hcnlTdHJlYW0sIGV4dHJhID0gZmFsc2UpOiBJdGVtIHtcbiAgICAgICAgY29uc3QgaWQgPSBzdHJlYW0ucmVhZFZhckludCgpO1xuICAgICAgICBpZiAoaWQgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRPRE86IGl0ZW1zXG4gICAgICAgICAgICByZXR1cm4gbmV3IEl0ZW0oeyBpZDogMCwgbmFtZTogJ21pbmVjcmFmdDphaXInIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgX2NvdW50ID0gc3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0TEUoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSB1bnVzZWQtaW1wb3J0cy9uby11bnVzZWQtdmFyc1xuICAgICAgICBjb25zdCBfbmV0RGF0YSA9IHN0cmVhbS5yZWFkVW5zaWduZWRWYXJJbnQoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSB1bnVzZWQtaW1wb3J0cy9uby11bnVzZWQtdmFyc1xuXG4gICAgICAgIC8vIFRPRE86IHJlZmFjdG9yIGV2ZXJ5dGhpbmcgYmFzaWNhbGx5Li4uXG4gICAgICAgIGlmIChleHRyYSAmJiBzdHJlYW0ucmVhZEJvb2xlYW4oKSkge1xuICAgICAgICAgICAgc3RyZWFtLnJlYWRWYXJJbnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRlbXAgPSBzdHJlYW0ucmVhZFZhckludCgpO1xuICAgICAgICAvLyBjb25zdCBhbW91bnQgPSB0ZW1wICYgMHhmZjtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRlbXAgPj4gODtcblxuICAgICAgICBsZXQgX25idCA9IG51bGw7XG4gICAgICAgIGNvbnN0IGV4dHJhTGVuID0gc3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0TEUoKTtcbiAgICAgICAgaWYgKGV4dHJhTGVuID09PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgdmVyc2lvbiA9IHN0cmVhbS5yZWFkQnl0ZSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVudXNlZC1pbXBvcnRzL25vLXVudXNlZC12YXJzXG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmJ0UmVhZGVyID0gbmV3IE5CVFJlYWRlcihzdHJlYW0sIEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTtcbiAgICAgICAgICAgICAgICBuYnRSZWFkZXIuc2V0VXNlVmFyaW50KHRydWUpO1xuICAgICAgICAgICAgICAgIF9uYnQgPSBuYnRSZWFkZXIucGFyc2UoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgaXRlbSBzdGFjayBuYnRgLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBKdXN0IGxvZyBhbmQgcmV0dXJuIEFJUlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY291bnRQbGFjZU9uID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudFBsYWNlT247IGkrKykge1xuICAgICAgICAgICAgc3RyZWFtLnJlYWQoc3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0TEUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb3VudENhbkJyZWFrID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudENhbkJyZWFrOyBpKyspIHtcbiAgICAgICAgICAgIHN0cmVhbS5yZWFkKHN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydExFKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogY2hlY2sgaWYgaGFzIGFkZGl0aW9uYWwgZGF0YVxuXG4gICAgICAgIC8vIFRPRE86IHJ1bnRpbWVJZFxuICAgICAgICAvLyBUT0RPOiBodHRwczovL2dpdGh1Yi5jb20vSlNQcmlzbWFyaW5lL0pTUHJpc21hcmluZS9pc3N1ZXMvMTA2bmV3XG4gICAgICAgIHJldHVybiBuZXcgSXRlbSh7IGlkLCBuYW1lOiAnbWluZWNyYWZ0OnVua25vd24nLCBtZXRhOiBkYXRhIH0pO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQWlCQSxJQUFhLE9BQWIsTUFBYSxLQUFLO0NBQ2Q7Q0FDQTtDQUNBO0NBQ0EsT0FBYztDQUNkLGFBQTRCLEtBQUssaUJBQWlCO0NBR2xELE1BQWE7Q0FDYixRQUFlO0NBRWYsWUFBbUIsRUFBRSxJQUFJLE1BQU0sUUFBbUI7RUFDOUMsS0FBSyxLQUFLO0VBQ1YsS0FBSyxPQUFPO0VBQ1osSUFBSSxNQUFNLEtBQUssT0FBTztFQUV0QixLQUFLLFlBQWEsMkJBQUEsWUFBa0I7Q0FDeEM7Q0FFQSxVQUF5QjtFQUNyQixPQUFPLEtBQUs7Q0FDaEI7Q0FFQSxRQUFlO0VBQ1gsT0FBTyxLQUFLO0NBQ2hCOzs7O0NBS0EsZUFBc0I7RUFDbEIsT0FBTyxLQUFLLGFBQWEsS0FBSyxNQUFNO0NBQ3hDO0NBRUEsU0FBZ0I7RUFDWixPQUFPO0NBQ1g7Q0FFQSxlQUFzQjtFQUNsQixPQUFPO0NBQ1g7Q0FFQSxjQUFxQjtFQUNqQixPQUFPO0NBQ1g7Q0FFQSxjQUFxQjtFQUNqQixPQUFPLDRCQUFBLGNBQWM7Q0FDekI7Q0FFQSxzQkFBNkI7RUFDekIsT0FBTztDQUNYO0NBRUEsd0JBQStCO0VBQzNCLE9BQU87Q0FDWDtDQUVBLG9CQUEyQjtFQUN2QixPQUFPO0NBQ1g7Q0FFQSxlQUFzQixjQUFtQztFQUNyRCxPQUFPO0NBQ1g7Q0FFQSxvQkFBMkI7RUFDdkIsT0FBTztDQUNYO0NBRUEsbUJBQTBCO0VBQ3RCLE9BQU87Q0FDWDtDQUVBLGdCQUF1QjtFQUNuQixPQUFPLEtBQUs7Q0FDaEI7Q0FFQSxlQUFzQjtFQUNsQixPQUFPO0NBQ1g7Q0FFQSxZQUFtQjtFQUNmLE9BQU8sS0FBSztDQUNoQjtDQUVBLDRCQUFtQztFQUMvQixPQUFPO0NBQ1g7Q0FFQSxpQkFDSSxRQUNBLGlCQUEwRCxNQUN0RDtFQUNKLE9BQU8sWUFBWSxLQUFLLGFBQWEsQ0FBQztFQUN0QyxJQUFJLEtBQUssTUFBTSxNQUFNLEtBQUssS0FBSyxRQUFRLE1BQU0saUJBRXpDO0VBR0osT0FBTyxhQUFhLEtBQUssVUFBVSxDQUFDO0VBQ3BDLE9BQU8sb0JBQW9CLEtBQUssSUFBSTtFQUdwQyxJQUFJLGdCQUNBLGVBQWUsTUFBTTtFQUl6QixPQUFPLFlBQVksNEJBQUEsY0FBYyxhQUFhLEtBQUssUUFBUSxDQUFDLENBQUM7RUFFN0QsTUFBTSxNQUFNLElBQUksNEJBQUEsUUFBYTtFQWE3QixJQUFJLGFBQWEsQ0FBQztFQUdsQixJQUFJLFdBQVcsQ0FBQztFQUNoQixJQUFJLFdBQVcsQ0FBQztFQUdoQixJQUFJLEtBQUssUUFBUSxNQUFNLG9CQUNuQixJQUFJLFlBQVksT0FBTyxDQUFDLENBQUM7RUFHN0IsT0FBTyxvQkFBb0IsSUFBSSxVQUFVLEVBQUUsVUFBVTtFQUNyRCxPQUFPLE1BQU0sSUFBSSxXQUFXLElBQUksVUFBVSxDQUFDLENBQUM7Q0FHaEQ7Q0FFQSxPQUFjLG1CQUFtQixRQUFzQixRQUFRLE9BQWE7RUFDeEUsTUFBTSxLQUFLLE9BQU8sV0FBVztFQUM3QixJQUFJLE9BQU8sR0FFUCxPQUFPLElBQUksS0FBSztHQUFFLElBQUk7R0FBRyxNQUFNO0VBQWdCLENBQUM7RUFHckMsT0FBTyxvQkFBb0I7RUFDekIsT0FBTyxtQkFBbUI7RUFHM0MsSUFBSSxTQUFTLE9BQU8sWUFBWSxHQUM1QixPQUFPLFdBQVc7RUFLdEIsTUFBTSxPQUZPLE9BQU8sV0FFUCxLQUFRO0VBSXJCLElBRGlCLE9BQU8sb0JBQ3BCLE1BQWEsSUFBSTtHQUNELE9BQU8sU0FBUztHQUVoQyxJQUFJO0lBQ0EsTUFBTSxZQUFZLElBQUksa0JBQUEsVUFBVSxRQUFRLGtCQUFBLFVBQVUsYUFBYTtJQUMvRCxVQUFVLGFBQWEsSUFBSTtJQUMzQixVQUFpQixNQUFNO0dBQzNCLFNBQVMsT0FBZ0I7SUFDckIsTUFBTSxJQUFJLE1BQU0sa0NBQWtDLEVBQUUsT0FBTyxNQUFNLENBQUM7R0FFdEU7RUFDSjtFQUVBLE1BQU0sZUFBZSxPQUFPLFdBQVc7RUFDdkMsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLGNBQWMsS0FDOUIsT0FBTyxLQUFLLE9BQU8sb0JBQW9CLENBQUM7RUFHNUMsTUFBTSxnQkFBZ0IsT0FBTyxXQUFXO0VBQ3hDLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxlQUFlLEtBQy9CLE9BQU8sS0FBSyxPQUFPLG9CQUFvQixDQUFDO0VBTzVDLE9BQU8sSUFBSSxLQUFLO0dBQUU7R0FBSSxNQUFNO0dBQXFCLE1BQU07RUFBSyxDQUFDO0NBQ2pFO0FBQ0oifQ==