@jsprismarine/nbt
Version:
Minecraft: Bedrock Edition NBT parser/writer
160 lines (157 loc) • 24.5 kB
JavaScript
import { Allocation } from './Allocation.es.js';
import { NBTDefinitions } from './NBTDefinitions.es.js';
import NBTStreamReader from './NBTStreamReader.es.js';
import NBTTagCompound from './NBTTagCompound.es.js';
class NBTReader extends NBTStreamReader {
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() !== 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() !== 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(Allocation.COMPOUND);
const compound = new NBTTagCompound();
this.expectInput(1, "Invalid NBT Data: Expected Tag ID in compound tag", false);
let tagID = this.readByteValue().getValue();
while (tagID !== NBTDefinitions.TAG_END) {
switch (tagID) {
case NBTDefinitions.TAG_BYTE:
compound.addValue(this.readStringValue().getValue(), this.readByteValue());
break;
case NBTDefinitions.TAG_SHORT:
compound.addValue(this.readStringValue().getValue(), this.readShortValue());
break;
case NBTDefinitions.TAG_INT:
compound.addValue(this.readStringValue().getValue(), this.readIntValue());
break;
case NBTDefinitions.TAG_LONG:
compound.addValue(this.readStringValue().getValue(), this.readLongValue());
break;
case NBTDefinitions.TAG_FLOAT:
compound.addValue(this.readStringValue().getValue(), this.readFloatValue());
break;
case NBTDefinitions.TAG_DOUBLE:
compound.addValue(this.readStringValue().getValue(), this.readDoubleValue());
break;
case NBTDefinitions.TAG_BYTE_ARRAY:
compound.addValue(this.readStringValue().getValue(), this.readByteArrayValue());
break;
case NBTDefinitions.TAG_STRING:
compound.addValue(this.readStringValue().getValue(), this.readStringValue());
break;
case NBTDefinitions.TAG_LIST:
compound.addValue(this.readStringValue().getValue(), this.readTagListValue());
break;
case NBTDefinitions.TAG_COMPOUND:
const name = this.readStringValue().getValue();
const child = this.readTagCompoundValue();
child.setName(name);
compound.addChild(child);
break;
case 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(Allocation.ARRAY_LIST);
this.alterAllocationLimit(Allocation.REFERENCE);
const backingList = /* @__PURE__ */ new Set();
switch (listType) {
case NBTDefinitions.TAG_END:
listLength = 0;
break;
case 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 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 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 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 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 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 NBTDefinitions.TAG_BYTE_ARRAY:
for (let i = 0; i < listLength; i++) {
backingList.add(this.readByteArrayValue());
}
break;
case NBTDefinitions.TAG_STRING:
for (let i = 0; i < listLength; i++) {
backingList.add(this.readStringValue());
}
break;
case NBTDefinitions.TAG_LIST:
for (let i = 0; i < listLength; i++) {
backingList.add(this.readTagListValue());
}
break;
case NBTDefinitions.TAG_COMPOUND:
for (let i = 0; i < listLength; i++) {
backingList.add(this.readTagCompoundValue());
}
break;
case 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;
}
}
export { NBTReader as default };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUUmVhZGVyLmVzLmpzIiwic291cmNlcyI6WyIuLi9zcmMvTkJUUmVhZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNvbXBsZXhpdHkgKi9cbmltcG9ydCB7IEFsbG9jYXRpb24gfSBmcm9tICcuL0FsbG9jYXRpb24nO1xuaW1wb3J0IHR5cGUgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5pbXBvcnQgdHlwZSB7IEJ5dGVPcmRlciB9IGZyb20gJy4vQnl0ZU9yZGVyJztcbmltcG9ydCB7IE5CVERlZmluaXRpb25zIH0gZnJvbSAnLi9OQlREZWZpbml0aW9ucyc7XG5pbXBvcnQgTkJUU3RyZWFtUmVhZGVyIGZyb20gJy4vTkJUU3RyZWFtUmVhZGVyJztcbmltcG9ydCBOQlRUYWdDb21wb3VuZCBmcm9tICcuL05CVFRhZ0NvbXBvdW5kJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTkJUUmVhZGVyIGV4dGVuZHMgTkJUU3RyZWFtUmVhZGVyIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoaW5wdXQ6IEJpbmFyeVN0cmVhbSwgYnl0ZU9yZGVyOiBCeXRlT3JkZXIpIHtcbiAgICAgICAgc3VwZXIoaW5wdXQsIGJ5dGVPcmRlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlTGlzdDxUYWdUeXBlPigpOiBTZXQ8VGFnVHlwZT4ge1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KHRoaXMuaXNVc2luZ1ZhcmludCgpID8gMiA6IDMsICdJbnZhbGlkIE5CVCBEYXRhOiBOb3QgZW5vdWdoIGRhdGEgdG8gcmVhZCBuZXcgdGFnJywgZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5yZWFkQnl0ZVZhbHVlKCkuZ2V0VmFsdWUoKSAhPT0gTkJURGVmaW5pdGlvbnMuVEFHX0xJU1QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBOQlQgRGF0YTogTm90IGxpc3QgdGFnIGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkVGFnTGlzdFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKCk6IE5CVFRhZ0NvbXBvdW5kIHtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCh0aGlzLmlzVXNpbmdWYXJpbnQoKSA/IDIgOiAzLCAnSW52YWxpZCBOQlQgRGF0YTogTm90IGVub3VnaCBkYXRhIHRvIHJlYWQgbmV3IHRhZycsIGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMucmVhZEJ5dGVWYWx1ZSgpLmdldFZhbHVlKCkgIT09IE5CVERlZmluaXRpb25zLlRBR19DT01QT1VORCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIE5CVCBEYXRhOiBObyByb290IHRhZyBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gdGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCByb290OiBOQlRUYWdDb21wb3VuZCA9IHRoaXMucmVhZFRhZ0NvbXBvdW5kVmFsdWUoKTtcbiAgICAgICAgcm9vdC5zZXROYW1lKG5hbWUpO1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRUYWdDb21wb3VuZFZhbHVlKCk6IE5CVFRhZ0NvbXBvdW5kIHtcbiAgICAgICAgdGhpcy5hbHRlckFsbG9jYXRpb25MaW1pdChBbGxvY2F0aW9uLkNPTVBPVU5EKTtcbiAgICAgICAgY29uc3QgY29tcG91bmQ6IE5CVFRhZ0NvbXBvdW5kID0gbmV3IE5CVFRhZ0NvbXBvdW5kKCk7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoMSwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIFRhZyBJRCBpbiBjb21wb3VuZCB0YWcnLCBmYWxzZSk7XG5cbiAgICAgICAgbGV0IHRhZ0lEID0gdGhpcy5yZWFkQnl0ZVZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgd2hpbGUgKHRhZ0lEICE9PSBOQlREZWZpbml0aW9ucy5UQUdfRU5EKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZ0lEKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURTpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRCeXRlVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NIT1JUOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZFNob3J0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVDpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRJbnRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTE9ORzpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRMb25nVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0ZMT0FUOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZEZsb2F0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0RPVUJMRTpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWREb3VibGVWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURV9BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRCeXRlQXJyYXlWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU1RSSU5HOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MSVNUOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZFRhZ0xpc3RWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQ6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQ6IE5CVFRhZ0NvbXBvdW5kID0gdGhpcy5yZWFkVGFnQ29tcG91bmRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5zZXROYW1lKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVF9BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRJbnRBcnJheVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgTkJUIERhdGE6IFVua25vd24gdGFnIDwke3RhZ0lEfT5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCgxLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgdGFnIElEIGluIHRhZyBjb21wb3VuZCcsIGZhbHNlKTtcbiAgICAgICAgICAgIHRhZ0lEID0gdGhpcy5yZWFkQnl0ZVZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21wb3VuZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRUYWdMaXN0VmFsdWUoKTogU2V0PGFueT4ge1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KHRoaXMuaXNVc2luZ1ZhcmludCgpID8gMiA6IDUsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBUQUdMaXN0IGhlYWRlcicsIGZhbHNlKTtcbiAgICAgICAgY29uc3QgbGlzdFR5cGU6IG51bWJlciA9IHRoaXMucmVhZEJ5dGVWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgIGxldCBsaXN0TGVuZ3RoOiBudW1iZXIgPSB0aGlzLnJlYWRJbnRWYWx1ZSgpLmdldFZhbHVlKCk7XG5cbiAgICAgICAgdGhpcy5hbHRlckFsbG9jYXRpb25MaW1pdChBbGxvY2F0aW9uLkFSUkFZX0xJU1QpO1xuICAgICAgICB0aGlzLmFsdGVyQWxsb2NhdGlvbkxpbWl0KEFsbG9jYXRpb24uUkVGRVJFTkNFKTtcblxuICAgICAgICBjb25zdCBiYWNraW5nTGlzdDogU2V0PGFueT4gPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgc3dpdGNoIChsaXN0VHlwZSkge1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRU5EOlxuICAgICAgICAgICAgICAgIGxpc3RMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURTpcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBieXRlcyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRTaG9ydFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU0hPUlQ6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCgyICogbGlzdExlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIHNob3J0cyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRTaG9ydFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoNCAqIGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBpbnRzIGZvciBsaXN0Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZEludFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTE9ORzpcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KDggKiBsaXN0TGVuZ3RoLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgbG9uZ3MgZm9yIGxpc3QnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkTG9uZ1ZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRkxPQVQ6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCg0ICogbGlzdExlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGZsb2F0cyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRGbG9hdFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRE9VQkxFOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoOCAqIGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBkb3VibGVzIGZvciBsaXN0Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZERvdWJsZVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURV9BUlJBWTpcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkQnl0ZUFycmF5VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TVFJJTkc6XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTElTVDpcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkVGFnTGlzdFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQ6XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZFRhZ0NvbXBvdW5kVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlRfQVJSQVk6XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZEludEFycmF5VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBOQlQgRGF0YTogVW5rbm93biB0YWcgPCR7bGlzdFR5cGV9PmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJhY2tpbmdMaXN0O1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVFBLE1BQXFCLGtCQUFrQixlQUFnQixDQUFBO0FBQUEsRUFDNUMsV0FBQSxDQUFZLE9BQXFCLFNBQXNCLEVBQUE7QUFDMUQsSUFBQSxLQUFBLENBQU0sT0FBTyxTQUFTLENBQUE7QUFBQTtBQUMxQixFQUVPLFNBQW1DLEdBQUE7QUFDdEMsSUFBQSxJQUFB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