UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

124 lines (123 loc) 13.3 kB
import { BlockToolType } from "../block/BlockToolType.es.js"; import { BlockMappings } from "../block/BlockMappings.es.js"; import BinaryStream from "@jsprismarine/jsbinaryutils"; import { item_id_map } from "@jsprismarine/bedrock-data"; import { ByteOrder, NBTReader } from "@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 = 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 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(BlockMappings.getRuntimeId(this.getName())); const str = new BinaryStream(); 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 NBTReader(stream, 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 export { Item }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXRlbS5lcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvaXRlbS9JdGVtLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ5dGVPcmRlciwgTkJUUmVhZGVyIH0gZnJvbSAnQGpzcHJpc21hcmluZS9uYnQnO1xuXG5pbXBvcnQgeyBpdGVtX2lkX21hcCBhcyBJdGVtSWRNYXAgfSBmcm9tICdAanNwcmlzbWFyaW5lL2JlZHJvY2stZGF0YSc7XG5pbXBvcnQgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5pbXBvcnQgeyBCbG9ja01hcHBpbmdzIH0gZnJvbSAnLi4vYmxvY2svQmxvY2tNYXBwaW5ncyc7XG5pbXBvcnQgeyBCbG9ja1Rvb2xUeXBlIH0gZnJvbSAnLi4vYmxvY2svQmxvY2tUb29sVHlwZSc7XG5pbXBvcnQgdHlwZSB7IEl0ZW1FbmNoYW50bWVudFR5cGUgfSBmcm9tICcuL0l0ZW1FbmNoYW50bWVudFR5cGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Qcm9wcyB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbWV0YT86IG51bWJlcjtcbiAgICBuYnQ/OiBhbnk7XG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgZHVyYWJpbGl0eT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEl0ZW0ge1xuICAgIHByaXZhdGUgaWQ6IG51bWJlcjtcbiAgICBwcml2YXRlIG5ldHdvcmtJZDogbnVtYmVyO1xuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyBtZXRhID0gMDtcbiAgICBwdWJsaWMgZHVyYWJpbGl0eTogbnVtYmVyID0gdGhpcy5nZXRNYXhEdXJhYmlsaXR5KCk7XG5cbiAgICAvLyBUT0RPXG4gICAgcHVibGljIG5idCA9IG51bGw7XG4gICAgcHVibGljIGNvdW50ID0gMTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih7IGlkLCBuYW1lLCBtZXRhIH06IEl0ZW1Qcm9wcykge1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIGlmIChtZXRhKSB0aGlzLm1ldGEgPSBtZXRhO1xuXG4gICAgICAgIHRoaXMubmV0d29ya0lkID0gKEl0ZW1JZE1hcCBhcyBhbnkpW25hbWVdIGFzIG51bWJlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIG5ldHdvcmsgbnVtZXJpYyBpZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROZXR3b3JrSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ldHdvcmtJZCB8fCB0aGlzLmdldElkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzVG9vbCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0FybW9yUGllY2UoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QnVyblRpbWUoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUb29sVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIEJsb2NrVG9vbFR5cGUuTm9uZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VG9vbEhhcnZlc3RMZXZlbCgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFybW9yRGVmZW5zZVBvaW50cygpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFybW9yVG91Z2huZXNzKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzRW5jaGFudG1lbnQoX2VuY2hhbnRtZW50OiBJdGVtRW5jaGFudG1lbnRUeXBlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RW5jaGFudGFiaWxpdHkoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNYXhEdXJhYmlsaXR5KCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RHVyYWJpbGl0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHVyYWJpbGl0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TWF4QW1vdW50KCkge1xuICAgICAgICByZXR1cm4gNjQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFtb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY291bnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUGFydE9mQ3JlYXRpdmVJbnZlbnRvcnkoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXR3b3JrU2VyaWFsaXplKFxuICAgICAgICBzdHJlYW06IEJpbmFyeVN0cmVhbSxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IG51bGwgfCAoKHN0cmVhbTogQmluYXJ5U3RyZWFtKSA9PiB2b2lkKSA9IG51bGxcbiAgICApOiB2b2lkIHtcbiAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KHRoaXMuZ2V0TmV0d29ya0lkKCkpO1xuICAgICAgICBpZiAodGhpcy5nZXRJZCgpID09PSAwIHx8IHRoaXMuZ2V0TmFtZSgpID09PSAnbWluZWNyYWZ0OmFpcicpIHtcbiAgICAgICAgICAgIC8vIFRoZSBpdGVtIGlzIEFpciBzbyB0aGVyZSdzIG5vIGFkZGl0aW9uYWwgZGF0YVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyZWFtLndyaXRlU2hvcnRMRSh0aGlzLmdldEFtb3VudCgpKTtcbiAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRWYXJJbnQodGhpcy5tZXRhKTtcblxuICAgICAgICAvLyBVc2UgYSBjbG9zdXJlIHRvIGFkZCBhZGRpdGlvbmFsIGRhdGFcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxEYXRhKSB7XG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YShzdHJlYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogUHJvcGVyIGJsb2NrIHJ1bnRpbWUgSURcbiAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KEJsb2NrTWFwcGluZ3MuZ2V0UnVudGltZUlkKHRoaXMuZ2V0TmFtZSgpKSk7XG5cbiAgICAgICAgY29uc3Qgc3RyID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgICAgIC8qIGlmICh0aGlzLm5idCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gV3JpdGUgdGhlIGFtb3VudCBvZiB0YWdzIHRvIHdyaXRlXG4gICAgICAgICAgICAvLyAoMSkgYWNjb3JkaW5nIHRvIHZhbmlsbGFcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkU2hvcnRMRSgweGZmZmYpO1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlQnl0ZSgxKTtcblxuICAgICAgICAgICAgLy8gV3JpdGUgaGFyZGNvZGVkIE5CVCB0YWdcbiAgICAgICAgICAgIC8vIFRPRE86IHVuaW1wbGVtZW50ZWQgTkJULndyaXRlKG5idCwgdHJ1ZSwgdHJ1ZSlcbiAgICAgICAgfSAqL1xuXG4gICAgICAgIC8vIFRPRE86IHByb3BlciBOQlRcbiAgICAgICAgc3RyLndyaXRlU2hvcnRMRSgwKTtcblxuICAgICAgICAvLyBDYW5QbGFjZSBhbmQgY2FuQnJlYWtcbiAgICAgICAgc3RyLndyaXRlSW50TEUoMCk7XG4gICAgICAgIHN0ci53cml0ZUludExFKDApO1xuXG4gICAgICAgIC8vIFRPRE86IGNoZWNrIGZvciBhZGRpdGlvbmFsIGRhdGFcbiAgICAgICAgaWYgKHRoaXMuZ2V0TmFtZSgpID09PSAnbWluZWNyYWZ0OnNoaWVsZCcpIHtcbiAgICAgICAgICAgIHN0ci53cml0ZUxvbmdMRShCaWdJbnQoMCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRWYXJJbnQoc3RyLmdldEJ1ZmZlcigpLmJ5dGVMZW5ndGgpO1xuICAgICAgICBzdHJlYW0ud3JpdGUobmV3IFVpbnQ4QXJyYXkoc3RyLmdldEJ1ZmZlcigpKSk7XG5cbiAgICAgICAgLy8gVE9ETzogY2hlY2sgZm9yIGFkZGl0aW9uYWwgZGF0YVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbmV0d29ya0Rlc2VyaWFsaXplKHN0cmVhbTogQmluYXJ5U3RyZWFtLCBleHRyYSA9IGZhbHNlKTogSXRlbSB7XG4gICAgICAgIGNvbnN0IGlkID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcbiAgICAgICAgaWYgKGlkID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBpdGVtc1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJdGVtKHsgaWQ6IDAsIG5hbWU6ICdtaW5lY3JhZnQ6YWlyJyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IF9jb3VudCA9IHN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydExFKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdW51c2VkLWltcG9ydHMvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgY29uc3QgX25ldERhdGEgPSBzdHJlYW0ucmVhZFVuc2lnbmVkVmFySW50KCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdW51c2VkLWltcG9ydHMvbm8tdW51c2VkLXZhcnNcblxuICAgICAgICAvLyBUT0RPOiByZWZhY3RvciBldmVyeXRoaW5nIGJhc2ljYWxseS4uLlxuICAgICAgICBpZiAoZXh0cmEgJiYgc3RyZWFtLnJlYWRCb29sZWFuKCkpIHtcbiAgICAgICAgICAgIHN0cmVhbS5yZWFkVmFySW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZW1wID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcbiAgICAgICAgLy8gY29uc3QgYW1vdW50ID0gdGVtcCAmIDB4ZmY7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0ZW1wID4+IDg7XG5cbiAgICAgICAgbGV0IF9uYnQgPSBudWxsO1xuICAgICAgICBjb25zdCBleHRyYUxlbiA9IHN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydExFKCk7XG4gICAgICAgIGlmIChleHRyYUxlbiA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSBzdHJlYW0ucmVhZEJ5dGUoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSB1bnVzZWQtaW1wb3J0cy9uby11bnVzZWQtdmFyc1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5idFJlYWRlciA9IG5ldyBOQlRSZWFkZXIoc3RyZWFtLCBCeXRlT3JkZXIuTElUVExFX0VORElBTik7XG4gICAgICAgICAgICAgICAgbmJ0UmVhZGVyLnNldFVzZVZhcmludCh0cnVlKTtcbiAgICAgICAgICAgICAgICBfbmJ0ID0gbmJ0UmVhZGVyLnBhcnNlKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIGl0ZW0gc3RhY2sgbmJ0YCwgeyBjYXVzZTogZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogSnVzdCBsb2cgYW5kIHJldHVybiBBSVJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvdW50UGxhY2VPbiA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnRQbGFjZU9uOyBpKyspIHtcbiAgICAgICAgICAgIHN0cmVhbS5yZWFkKHN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydExFKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY291bnRDYW5CcmVhayA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnRDYW5CcmVhazsgaSsrKSB7XG4gICAgICAgICAgICBzdHJlYW0ucmVhZChzdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnRMRSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IGNoZWNrIGlmIGhhcyBhZGRpdGlvbmFsIGRhdGFcblxuICAgICAgICAvLyBUT0RPOiBydW50aW1lSWRcbiAgICAgICAgLy8gVE9ETzogaHR0cHM6Ly9naXRodWIuY29tL0pTUHJpc21hcmluZS9KU1ByaXNtYXJpbmUvaXNzdWVzLzEwNm5ld1xuICAgICAgICByZXR1cm4gbmV3IEl0ZW0oeyBpZCwgbmFtZTogJ21pbmVjcmFmdDp1bmtub3duJywgbWV0YTogZGF0YSB9KTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQWlCQSxJQUFhLE9BQWIsTUFBYSxLQUFLO0NBQ2Q7Q0FDQTtDQUNBO0NBQ0EsT0FBYztDQUNkLGFBQTRCLEtBQUssaUJBQWlCO0NBR2xELE1BQWE7Q0FDYixRQUFlO0NBRWYsWUFBbUIsRUFBRSxJQUFJLE1BQU0sUUFBbUI7RUFDOUMsS0FBSyxLQUFLO0VBQ1YsS0FBSyxPQUFPO0VBQ1osSUFBSSxNQUFNLEtBQUssT0FBTztFQUV0QixLQUFLLFlBQWEsWUFBa0I7Q0FDeEM7Q0FFQSxVQUF5QjtFQUNyQixPQUFPLEtBQUs7Q0FDaEI7Q0FFQSxRQUFlO0VBQ1gsT0FBTyxLQUFLO0NBQ2hCOzs7O0NBS0EsZUFBc0I7RUFDbEIsT0FBTyxLQUFLLGFBQWEsS0FBSyxNQUFNO0NBQ3hDO0NBRUEsU0FBZ0I7RUFDWixPQUFPO0NBQ1g7Q0FFQSxlQUFzQjtFQUNsQixPQUFPO0NBQ1g7Q0FFQSxjQUFxQjtFQUNqQixPQUFPO0NBQ1g7Q0FFQSxjQUFxQjtFQUNqQixPQUFPLGNBQWM7Q0FDekI7Q0FFQSxzQkFBNkI7RUFDekIsT0FBTztDQUNYO0NBRUEsd0JBQStCO0VBQzNCLE9BQU87Q0FDWDtDQUVBLG9CQUEyQjtFQUN2QixPQUFPO0NBQ1g7Q0FFQSxlQUFzQixjQUFtQztFQUNyRCxPQUFPO0NBQ1g7Q0FFQSxvQkFBMkI7RUFDdkIsT0FBTztDQUNYO0NBRUEsbUJBQTBCO0VBQ3RCLE9BQU87Q0FDWDtDQUVBLGdCQUF1QjtFQUNuQixPQUFPLEtBQUs7Q0FDaEI7Q0FFQSxlQUFzQjtFQUNsQixPQUFPO0NBQ1g7Q0FFQSxZQUFtQjtFQUNmLE9BQU8sS0FBSztDQUNoQjtDQUVBLDRCQUFtQztFQUMvQixPQUFPO0NBQ1g7Q0FFQSxpQkFDSSxRQUNBLGlCQUEwRCxNQUN0RDtFQUNKLE9BQU8sWUFBWSxLQUFLLGFBQWEsQ0FBQztFQUN0QyxJQUFJLEtBQUssTUFBTSxNQUFNLEtBQUssS0FBSyxRQUFRLE1BQU0saUJBRXpDO0VBR0osT0FBTyxhQUFhLEtBQUssVUFBVSxDQUFDO0VBQ3BDLE9BQU8sb0JBQW9CLEtBQUssSUFBSTtFQUdwQyxJQUFJLGdCQUNBLGVBQWUsTUFBTTtFQUl6QixPQUFPLFlBQVksY0FBYyxhQUFhLEtBQUssUUFBUSxDQUFDLENBQUM7RUFFN0QsTUFBTSxNQUFNLElBQUksYUFBYTtFQWE3QixJQUFJLGFBQWEsQ0FBQztFQUdsQixJQUFJLFdBQVcsQ0FBQztFQUNoQixJQUFJLFdBQVcsQ0FBQztFQUdoQixJQUFJLEtBQUssUUFBUSxNQUFNLG9CQUNuQixJQUFJLFlBQVksT0FBTyxDQUFDLENBQUM7RUFHN0IsT0FBTyxvQkFBb0IsSUFBSSxVQUFVLEVBQUUsVUFBVTtFQUNyRCxPQUFPLE1BQU0sSUFBSSxXQUFXLElBQUksVUFBVSxDQUFDLENBQUM7Q0FHaEQ7Q0FFQSxPQUFjLG1CQUFtQixRQUFzQixRQUFRLE9BQWE7RUFDeEUsTUFBTSxLQUFLLE9BQU8sV0FBVztFQUM3QixJQUFJLE9BQU8sR0FFUCxPQUFPLElBQUksS0FBSztHQUFFLElBQUk7R0FBRyxNQUFNO0VBQWdCLENBQUM7RUFHckMsT0FBTyxvQkFBb0I7RUFDekIsT0FBTyxtQkFBbUI7RUFHM0MsSUFBSSxTQUFTLE9BQU8sWUFBWSxHQUM1QixPQUFPLFdBQVc7RUFLdEIsTUFBTSxPQUZPLE9BQU8sV0FFUCxLQUFRO0VBSXJCLElBRGlCLE9BQU8sb0JBQ3BCLE1BQWEsSUFBSTtHQUNELE9BQU8sU0FBUztHQUVoQyxJQUFJO0lBQ0EsTUFBTSxZQUFZLElBQUksVUFBVSxRQUFRLFVBQVUsYUFBYTtJQUMvRCxVQUFVLGFBQWEsSUFBSTtJQUMzQixVQUFpQixNQUFNO0dBQzNCLFNBQVMsT0FBZ0I7SUFDckIsTUFBTSxJQUFJLE1BQU0sa0NBQWtDLEVBQUUsT0FBTyxNQUFNLENBQUM7R0FFdEU7RUFDSjtFQUVBLE1BQU0sZUFBZSxPQUFPLFdBQVc7RUFDdkMsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLGNBQWMsS0FDOUIsT0FBTyxLQUFLLE9BQU8sb0JBQW9CLENBQUM7RUFHNUMsTUFBTSxnQkFBZ0IsT0FBTyxXQUFXO0VBQ3hDLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxlQUFlLEtBQy9CLE9BQU8sS0FBSyxPQUFPLG9CQUFvQixDQUFDO0VBTzVDLE9BQU8sSUFBSSxLQUFLO0dBQUU7R0FBSSxNQUFNO0dBQXFCLE1BQU07RUFBSyxDQUFDO0NBQ2pFO0FBQ0oifQ==