UNPKG

@jsprismarine/nbt

Version:
137 lines (136 loc) • 21.7 kB
"use strict"; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } }); const require_NBTDefinitions = require("./NBTDefinitions.cjs.cjs"); const require_Allocation = require("./Allocation.cjs.cjs"); const require_NBTStreamReader = require("./NBTStreamReader.cjs.cjs"); const require_NBTTagCompound = require("./NBTTagCompound.cjs.cjs"); //#region src/NBTReader.ts var NBTReader = class extends require_NBTStreamReader.default { constructor(input, byteOrder) { super(input, byteOrder); } parseList() { this.expectInput(this.isUsingVarint() ? 2 : 3, "Invalid NBT Data: Not enough data to read new tag", false); if (this.readByteValue().getValue() !== require_NBTDefinitions.NBTDefinitions.TAG_LIST) throw new Error("Invalid NBT Data: Not list tag found"); this.readStringValue(); return this.readTagListValue(); } parse() { this.expectInput(this.isUsingVarint() ? 2 : 3, "Invalid NBT Data: Not enough data to read new tag", false); if (this.readByteValue().getValue() !== require_NBTDefinitions.NBTDefinitions.TAG_COMPOUND) throw new Error("Invalid NBT Data: No root tag found"); const name = this.readStringValue().getValue(); const root = this.readTagCompoundValue(); root.setName(name); return root; } readTagCompoundValue() { this.alterAllocationLimit(require_Allocation.Allocation.COMPOUND); const compound = new require_NBTTagCompound.default(); this.expectInput(1, "Invalid NBT Data: Expected Tag ID in compound tag", false); let tagID = this.readByteValue().getValue(); while (tagID !== require_NBTDefinitions.NBTDefinitions.TAG_END) { switch (tagID) { case require_NBTDefinitions.NBTDefinitions.TAG_BYTE: compound.addValue(this.readStringValue().getValue(), this.readByteValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_SHORT: compound.addValue(this.readStringValue().getValue(), this.readShortValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_INT: compound.addValue(this.readStringValue().getValue(), this.readIntValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_LONG: compound.addValue(this.readStringValue().getValue(), this.readLongValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_FLOAT: compound.addValue(this.readStringValue().getValue(), this.readFloatValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_DOUBLE: compound.addValue(this.readStringValue().getValue(), this.readDoubleValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_BYTE_ARRAY: compound.addValue(this.readStringValue().getValue(), this.readByteArrayValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_STRING: compound.addValue(this.readStringValue().getValue(), this.readStringValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_LIST: compound.addValue(this.readStringValue().getValue(), this.readTagListValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_COMPOUND: const name = this.readStringValue().getValue(); const child = this.readTagCompoundValue(); child.setName(name); compound.addChild(child); break; case require_NBTDefinitions.NBTDefinitions.TAG_INT_ARRAY: compound.addValue(this.readStringValue().getValue(), this.readIntArrayValue()); break; default: throw new Error(`Invalid NBT Data: Unknown tag <${tagID}>`); } this.expectInput(1, "Invalid NBT Data: Expected tag ID in tag compound", false); tagID = this.readByteValue().getValue(); } return compound; } readTagListValue() { this.expectInput(this.isUsingVarint() ? 2 : 5, "Invalid NBT Data: Expected TAGList header", false); const listType = this.readByteValue().getValue(); let listLength = this.readIntValue().getValue(); this.alterAllocationLimit(require_Allocation.Allocation.ARRAY_LIST); this.alterAllocationLimit(require_Allocation.Allocation.REFERENCE); const backingList = /* @__PURE__ */ new Set(); switch (listType) { case require_NBTDefinitions.NBTDefinitions.TAG_END: listLength = 0; break; case require_NBTDefinitions.NBTDefinitions.TAG_BYTE: this.expectInput(listLength, "Invalid NBT Data: Expected bytes for list"); for (let i = 0; i < listLength; i++) backingList.add(this.readShortValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_SHORT: this.expectInput(2 * listLength, "Invalid NBT Data: Expected shorts for list"); for (let i = 0; i < listLength; i++) backingList.add(this.readShortValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_INT: this.expectInput(4 * listLength, "Invalid NBT Data: Expected ints for list"); for (let i = 0; i < listLength; i++) backingList.add(this.readIntValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_LONG: this.expectInput(8 * listLength, "Invalid NBT Data: Expected longs for list"); for (let i = 0; i < listLength; i++) backingList.add(this.readLongValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_FLOAT: this.expectInput(4 * listLength, "Invalid NBT Data: Expected floats for list"); for (let i = 0; i < listLength; i++) backingList.add(this.readFloatValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_DOUBLE: this.expectInput(8 * listLength, "Invalid NBT Data: Expected doubles for list"); for (let i = 0; i < listLength; i++) backingList.add(this.readDoubleValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_BYTE_ARRAY: for (let i = 0; i < listLength; i++) backingList.add(this.readByteArrayValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_STRING: for (let i = 0; i < listLength; i++) backingList.add(this.readStringValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_LIST: for (let i = 0; i < listLength; i++) backingList.add(this.readTagListValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_COMPOUND: for (let i = 0; i < listLength; i++) backingList.add(this.readTagCompoundValue()); break; case require_NBTDefinitions.NBTDefinitions.TAG_INT_ARRAY: for (let i = 0; i < listLength; i++) backingList.add(this.readIntArrayValue()); break; default: throw new Error(`Invalid NBT Data: Unknown tag <${listType}>`); } return backingList; } }; //#endregion exports.default = NBTReader; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUUmVhZGVyLmNqcy5janMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL05CVFJlYWRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG5pbXBvcnQgeyBBbGxvY2F0aW9uIH0gZnJvbSAnLi9BbGxvY2F0aW9uJztcbmltcG9ydCB0eXBlIEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBCeXRlT3JkZXIgfSBmcm9tICcuL0J5dGVPcmRlcic7XG5pbXBvcnQgeyBOQlREZWZpbml0aW9ucyB9IGZyb20gJy4vTkJURGVmaW5pdGlvbnMnO1xuaW1wb3J0IE5CVFN0cmVhbVJlYWRlciBmcm9tICcuL05CVFN0cmVhbVJlYWRlcic7XG5pbXBvcnQgTkJUVGFnQ29tcG91bmQgZnJvbSAnLi9OQlRUYWdDb21wb3VuZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5CVFJlYWRlciBleHRlbmRzIE5CVFN0cmVhbVJlYWRlciB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGlucHV0OiBCaW5hcnlTdHJlYW0sIGJ5dGVPcmRlcjogQnl0ZU9yZGVyKSB7XG4gICAgICAgIHN1cGVyKGlucHV0LCBieXRlT3JkZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZUxpc3Q8VGFnVHlwZT4oKTogU2V0PFRhZ1R5cGU+IHtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCh0aGlzLmlzVXNpbmdWYXJpbnQoKSA/IDIgOiAzLCAnSW52YWxpZCBOQlQgRGF0YTogTm90IGVub3VnaCBkYXRhIHRvIHJlYWQgbmV3IHRhZycsIGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMucmVhZEJ5dGVWYWx1ZSgpLmdldFZhbHVlKCkgIT09IE5CVERlZmluaXRpb25zLlRBR19MSVNUKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgTkJUIERhdGE6IE5vdCBsaXN0IHRhZyBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWFkU3RyaW5nVmFsdWUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFRhZ0xpc3RWYWx1ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZSgpOiBOQlRUYWdDb21wb3VuZCB7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQodGhpcy5pc1VzaW5nVmFyaW50KCkgPyAyIDogMywgJ0ludmFsaWQgTkJUIERhdGE6IE5vdCBlbm91Z2ggZGF0YSB0byByZWFkIG5ldyB0YWcnLCBmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLnJlYWRCeXRlVmFsdWUoKS5nZXRWYWx1ZSgpICE9PSBOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBOQlQgRGF0YTogTm8gcm9vdCB0YWcgZm91bmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgcm9vdDogTkJUVGFnQ29tcG91bmQgPSB0aGlzLnJlYWRUYWdDb21wb3VuZFZhbHVlKCk7XG4gICAgICAgIHJvb3Quc2V0TmFtZShuYW1lKTtcbiAgICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWFkVGFnQ29tcG91bmRWYWx1ZSgpOiBOQlRUYWdDb21wb3VuZCB7XG4gICAgICAgIHRoaXMuYWx0ZXJBbGxvY2F0aW9uTGltaXQoQWxsb2NhdGlvbi5DT01QT1VORCk7XG4gICAgICAgIGNvbnN0IGNvbXBvdW5kOiBOQlRUYWdDb21wb3VuZCA9IG5ldyBOQlRUYWdDb21wb3VuZCgpO1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KDEsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBUYWcgSUQgaW4gY29tcG91bmQgdGFnJywgZmFsc2UpO1xuXG4gICAgICAgIGxldCB0YWdJRCA9IHRoaXMucmVhZEJ5dGVWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgIHdoaWxlICh0YWdJRCAhPT0gTkJURGVmaW5pdGlvbnMuVEFHX0VORCkge1xuICAgICAgICAgICAgc3dpdGNoICh0YWdJRCkge1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEU6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkQnl0ZVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TSE9SVDpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRTaG9ydFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlQ6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkSW50VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0xPTkc6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkTG9uZ1ZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19GTE9BVDpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRGbG9hdFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19ET1VCTEU6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkRG91YmxlVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEVfQVJSQVk6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkQnl0ZUFycmF5VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NUUklORzpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTElTVDpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRUYWdMaXN0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0NPTVBPVU5EOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSB0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkOiBOQlRUYWdDb21wb3VuZCA9IHRoaXMucmVhZFRhZ0NvbXBvdW5kVmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc2V0TmFtZShuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlRfQVJSQVk6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkSW50QXJyYXlWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIE5CVCBEYXRhOiBVbmtub3duIHRhZyA8JHt0YWdJRH0+YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoMSwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIHRhZyBJRCBpbiB0YWcgY29tcG91bmQnLCBmYWxzZSk7XG4gICAgICAgICAgICB0YWdJRCA9IHRoaXMucmVhZEJ5dGVWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tcG91bmQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWFkVGFnTGlzdFZhbHVlKCk6IFNldDxhbnk+IHtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCh0aGlzLmlzVXNpbmdWYXJpbnQoKSA/IDIgOiA1LCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgVEFHTGlzdCBoZWFkZXInLCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IGxpc3RUeXBlOiBudW1iZXIgPSB0aGlzLnJlYWRCeXRlVmFsdWUoKS5nZXRWYWx1ZSgpO1xuICAgICAgICBsZXQgbGlzdExlbmd0aDogbnVtYmVyID0gdGhpcy5yZWFkSW50VmFsdWUoKS5nZXRWYWx1ZSgpO1xuXG4gICAgICAgIHRoaXMuYWx0ZXJBbGxvY2F0aW9uTGltaXQoQWxsb2NhdGlvbi5BUlJBWV9MSVNUKTtcbiAgICAgICAgdGhpcy5hbHRlckFsbG9jYXRpb25MaW1pdChBbGxvY2F0aW9uLlJFRkVSRU5DRSk7XG5cbiAgICAgICAgY29uc3QgYmFja2luZ0xpc3Q6IFNldDxhbnk+ID0gbmV3IFNldCgpO1xuXG4gICAgICAgIHN3aXRjaCAobGlzdFR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0VORDpcbiAgICAgICAgICAgICAgICBsaXN0TGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEU6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dChsaXN0TGVuZ3RoLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgYnl0ZXMgZm9yIGxpc3QnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkU2hvcnRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NIT1JUOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoMiAqIGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBzaG9ydHMgZm9yIGxpc3QnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkU2hvcnRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVDpcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KDQgKiBsaXN0TGVuZ3RoLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgaW50cyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRJbnRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0xPTkc6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCg4ICogbGlzdExlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGxvbmdzIGZvciBsaXN0Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZExvbmdWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0ZMT0FUOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoNCAqIGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBmbG9hdHMgZm9yIGxpc3QnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkRmxvYXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0RPVUJMRTpcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KDggKiBsaXN0TGVuZ3RoLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgZG91YmxlcyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWREb3VibGVWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEVfQVJSQVk6XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZEJ5dGVBcnJheVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU1RSSU5HOlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0xJU1Q6XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZFRhZ0xpc3RWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0NPTVBPVU5EOlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRUYWdDb21wb3VuZFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UX0FSUkFZOlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRJbnRBcnJheVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgTkJUIERhdGE6IFVua25vd24gdGFnIDwke2xpc3RUeXBlfT5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBiYWNraW5nTGlzdDtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFRQSxJQUFxQixZQUFyQixjQUF1Qyx3QkFBQSxRQUFnQjtDQUNuRCxZQUFtQixPQUFxQixXQUFzQjtFQUMxRCxNQUFNLE9BQU8sU0FBUztDQUMxQjtDQUVBLFlBQTBDO0VBQ3RDLEtBQUssWUFBWSxLQUFLLGNBQWMsSUFBSSxJQUFJLEdBQUcs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