UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

133 lines (132 loc) • 19.4 kB
import { NetworkUtil } from "../NetworkUtil.es.js"; import Identifiers from "../Identifiers.es.js"; import DataPacket from "./DataPacket.es.js"; //#region src/network/packet/AvailableCommandsPacket.ts /** * AvailableCommandsPacket is sent by the server to the client to provide information about available commands. * @TODO: Argument types are not implemented. */ var AvailableCommandsPacket = class extends DataPacket { static NetID = Identifiers.AvailableCommandsPacket; ARG_FLAG_VALID = 1048576; ARG_FLAG_INT = 1; ARG_FLAG_FLOAT = 3; ARG_TYPE_WILDCARD_INT = 5; ARG_TYPE_STRING = 56; ARG_TYPE_INT_POSITION = 64; ARG_TYPE_POSITION = 65; ARG_FLAG_ENUM = 2097152; ARG_FLAG_POSTFIX = 16777216; ARG_FLAG_SOFT_ENUM = 67108864; commandData = []; hardcodedEnums = []; softEnums = []; enumConstraints = []; encodePayload() { const enumValueIndexes = /* @__PURE__ */ new Map(); const postfixIndexes = /* @__PURE__ */ new Map(); const enums = []; const enumIndexes = /* @__PURE__ */ new Map(); const softEnums = []; const softEnumIndexes = /* @__PURE__ */ new Map(); const appendEnum = (_enum) => { const { name, soft, values } = _enum; if (soft) { if (!softEnumIndexes.has(name)) { const index = softEnumIndexes.set(name, softEnumIndexes.size).get(name); softEnums[index] = _enum; } return; } values.forEach((value) => { if (!enumValueIndexes.has(value)) enumValueIndexes.set(value, enumValueIndexes.size); }); if (!enumIndexes.has(name)) { const index = enumIndexes.set(name, enumIndexes.size).get(name); enums[index] = _enum; } }; this.hardcodedEnums.forEach((e) => appendEnum(e)); this.softEnums.forEach((e) => appendEnum(e)); this.commandData.forEach((commandData) => { if (commandData.aliases) appendEnum(commandData.aliases); commandData.overloads.forEach((overload) => { overload.forEach((parameter) => { if (parameter.enum) appendEnum(parameter.enum); if (parameter.postfix) { if (!postfixIndexes.has(parameter.postfix)) postfixIndexes.set(parameter.postfix, postfixIndexes.size); } }); }); }); this.writeUnsignedVarInt(enumValueIndexes.size); enumValueIndexes.forEach((_index, enumValue) => { NetworkUtil.writeString(this, enumValue); }); this.writeUnsignedVarInt(0); this.writeUnsignedVarInt(postfixIndexes.size); postfixIndexes.forEach((_index, postfix) => { NetworkUtil.writeString(this, postfix); }); this.writeUnsignedVarInt(enums.length); enums.forEach((_enum) => { this.writeEnum(_enum, enumValueIndexes); }); this.writeUnsignedVarInt(0); this.writeUnsignedVarInt(this.commandData.length); this.commandData.forEach((data) => { this.writeCommandData(data, enumIndexes, postfixIndexes); }); this.writeUnsignedVarInt(this.softEnums.length); this.softEnums.forEach((_enum) => { this.writeSoftEnum(_enum); }); this.writeUnsignedVarInt(this.enumConstraints.length); this.enumConstraints.forEach((constraint) => { this.writeEnumConstraint(constraint, enumIndexes, enumValueIndexes); }); } writeEnum({ name, values }, enumValueMap) { NetworkUtil.writeString(this, name); this.writeUnsignedVarInt(values.length); const listSize = enumValueMap.size; values.forEach((value) => { const index = enumValueMap.get(value) ?? -1; if (index === -1) return; this.writeEnumValueIndex(index, listSize); }); } writeEnumValueIndex(index, valueCount) { if (valueCount < 256) this.writeByte(index); else if (valueCount < 65536) this.writeUnsignedShortLE(index); else this.writeUnsignedIntLE(index); } writeCommandData(data, enumIndexes, _postfixIndexes) { NetworkUtil.writeString(this, data.commandName); NetworkUtil.writeString(this, data.commandDescription); this.writeShortLE(data.flags); this.writeByte(data.permission); if (data.aliases !== null) this.writeIntLE(enumIndexes.get(data.aliases.name) ?? -1); else this.writeIntLE(-1); this.writeUnsignedVarInt(0); this.writeUnsignedVarInt(0); } writeSoftEnum(_enum) { NetworkUtil.writeString(this, _enum.name); this.writeUnsignedVarInt(_enum.values.length); _enum.values.forEach((value) => { NetworkUtil.writeString(this, value); }); } writeEnumConstraint(constraint, enumIndexes, enumValueIndexes) { this.writeIntLE(enumValueIndexes.get(constraint.getAffectedValue()) ?? 0); this.writeIntLE(enumIndexes.get(constraint.getEnum().name) ?? 0); this.writeUnsignedVarInt(constraint.getConstraints().length); constraint.getConstraints().forEach((v) => { this.writeByte(v); }); } }; //#endregion export { AvailableCommandsPacket as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZhaWxhYmxlQ29tbWFuZHNQYWNrZXQuZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25ldHdvcmsvcGFja2V0L0F2YWlsYWJsZUNvbW1hbmRzUGFja2V0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5ldHdvcmtVdGlsIH0gZnJvbSAnLi4vLi4vbmV0d29yay9OZXR3b3JrVXRpbCc7XG5pbXBvcnQgSWRlbnRpZmllcnMgZnJvbSAnLi4vSWRlbnRpZmllcnMnO1xuaW1wb3J0IHR5cGUgQ29tbWFuZERhdGEgZnJvbSAnLi4vdHlwZS9Db21tYW5kRGF0YSc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRFbnVtIH0gZnJvbSAnLi4vdHlwZS9Db21tYW5kRW51bSc7XG5pbXBvcnQgdHlwZSBDb21tYW5kRW51bUNvbnN0cmFpbnQgZnJvbSAnLi4vdHlwZS9Db21tYW5kRW51bUNvbnN0cmFpbnQnO1xuaW1wb3J0IERhdGFQYWNrZXQgZnJvbSAnLi9EYXRhUGFja2V0JztcblxuLyoqXG4gKiBBdmFpbGFibGVDb21tYW5kc1BhY2tldCBpcyBzZW50IGJ5IHRoZSBzZXJ2ZXIgdG8gdGhlIGNsaWVudCB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBjb21tYW5kcy5cbiAqIEBUT0RPOiBBcmd1bWVudCB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdmFpbGFibGVDb21tYW5kc1BhY2tldCBleHRlbmRzIERhdGFQYWNrZXQge1xuICAgIHB1YmxpYyBzdGF0aWMgTmV0SUQgPSBJZGVudGlmaWVycy5BdmFpbGFibGVDb21tYW5kc1BhY2tldDtcblxuICAgIHB1YmxpYyBBUkdfRkxBR19WQUxJRCA9IDB4MTAwMDAwO1xuICAgIHB1YmxpYyBBUkdfRkxBR19JTlQgPSAxO1xuICAgIHB1YmxpYyBBUkdfRkxBR19GTE9BVCA9IDM7XG4gICAgcHVibGljIEFSR19UWVBFX1dJTERDQVJEX0lOVCA9IDU7XG4gICAgcHVibGljIEFSR19UWVBFX1NUUklORyA9IDU2O1xuICAgIHB1YmxpYyBBUkdfVFlQRV9JTlRfUE9TSVRJT04gPSA2NDtcbiAgICBwdWJsaWMgQVJHX1RZUEVfUE9TSVRJT04gPSA2NTtcbiAgICBwdWJsaWMgQVJHX0ZMQUdfRU5VTSA9IDB4MjAwMDAwO1xuICAgIHB1YmxpYyBBUkdfRkxBR19QT1NURklYID0gMHgxMDAwMDAwO1xuICAgIHB1YmxpYyBBUkdfRkxBR19TT0ZUX0VOVU0gPSAweDQwMDAwMDA7XG5cbiAgICBwdWJsaWMgY29tbWFuZERhdGE6IENvbW1hbmREYXRhW10gPSBbXTtcbiAgICBwdWJsaWMgaGFyZGNvZGVkRW51bXM6IENvbW1hbmRFbnVtW10gPSBbXTtcbiAgICBwdWJsaWMgc29mdEVudW1zOiBDb21tYW5kRW51bVtdID0gW107XG4gICAgcHVibGljIGVudW1Db25zdHJhaW50czogQ29tbWFuZEVudW1Db25zdHJhaW50W10gPSBbXTtcblxuICAgIHB1YmxpYyBlbmNvZGVQYXlsb2FkKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbnVtVmFsdWVJbmRleGVzOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCBwb3N0Zml4SW5kZXhlczogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcbiAgICAgICAgY29uc3QgZW51bXM6IENvbW1hbmRFbnVtW10gPSBbXTtcbiAgICAgICAgY29uc3QgZW51bUluZGV4ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IHNvZnRFbnVtczogQ29tbWFuZEVudW1bXSA9IFtdO1xuICAgICAgICBjb25zdCBzb2Z0RW51bUluZGV4ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgY29uc3QgYXBwZW5kRW51bSA9IChfZW51bTogQ29tbWFuZEVudW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgc29mdCwgdmFsdWVzIH0gPSBfZW51bTtcblxuICAgICAgICAgICAgaWYgKHNvZnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNvZnRFbnVtSW5kZXhlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzb2Z0RW51bUluZGV4ZXMuc2V0KG5hbWUsIHNvZnRFbnVtSW5kZXhlcy5zaXplKS5nZXQobmFtZSkhO1xuICAgICAgICAgICAgICAgICAgICBzb2Z0RW51bXNbaW5kZXhdID0gX2VudW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnVtVmFsdWVJbmRleGVzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZW51bVZhbHVlSW5kZXhlcy5zZXQodmFsdWUsIGVudW1WYWx1ZUluZGV4ZXMuc2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWVudW1JbmRleGVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZW51bUluZGV4ZXMuc2V0KG5hbWUsIGVudW1JbmRleGVzLnNpemUpLmdldChuYW1lKSE7XG4gICAgICAgICAgICAgICAgZW51bXNbaW5kZXhdID0gX2VudW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5oYXJkY29kZWRFbnVtcy5mb3JFYWNoKChlKSA9PiBhcHBlbmRFbnVtKGUpKTtcbiAgICAgICAgdGhpcy5zb2Z0RW51bXMuZm9yRWFjaCgoZSkgPT4gYXBwZW5kRW51bShlKSk7XG5cbiAgICAgICAgdGhpcy5jb21tYW5kRGF0YS5mb3JFYWNoKChjb21tYW5kRGF0YSkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbW1hbmREYXRhLmFsaWFzZXMpIHtcbiAgICAgICAgICAgICAgICBhcHBlbmRFbnVtKGNvbW1hbmREYXRhLmFsaWFzZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb21tYW5kRGF0YS5vdmVybG9hZHMuZm9yRWFjaCgob3ZlcmxvYWQpID0+IHtcbiAgICAgICAgICAgICAgICBvdmVybG9hZC5mb3JFYWNoKChwYXJhbWV0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5lbnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRFbnVtKHBhcmFtZXRlci5lbnVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIucG9zdGZpeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3N0Zml4SW5kZXhlcy5oYXMocGFyYW1ldGVyLnBvc3RmaXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdGZpeEluZGV4ZXMuc2V0KHBhcmFtZXRlci5wb3N0Zml4LCBwb3N0Zml4SW5kZXhlcy5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludChlbnVtVmFsdWVJbmRleGVzLnNpemUpO1xuICAgICAgICBlbnVtVmFsdWVJbmRleGVzLmZvckVhY2goKF9pbmRleDogbnVtYmVyLCBlbnVtVmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgZW51bVZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KDApOyAvLyBjaGFpbmVkU3ViQ29tbWFuZFZhbHVlTmFtZUluZGV4ZXNcblxuICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRWYXJJbnQocG9zdGZpeEluZGV4ZXMuc2l6ZSk7XG4gICAgICAgIHBvc3RmaXhJbmRleGVzLmZvckVhY2goKF9pbmRleDogbnVtYmVyLCBwb3N0Zml4OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsIHBvc3RmaXgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRWYXJJbnQoZW51bXMubGVuZ3RoKTtcbiAgICAgICAgZW51bXMuZm9yRWFjaCgoX2VudW06IENvbW1hbmRFbnVtKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndyaXRlRW51bShfZW51bSwgZW51bVZhbHVlSW5kZXhlcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludCgwKTsgLy8gYWxsQ2hhaW5lZFN1YkNvbW1hbmREYXRhXG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KHRoaXMuY29tbWFuZERhdGEubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5jb21tYW5kRGF0YS5mb3JFYWNoKChkYXRhOiBDb21tYW5kRGF0YSkgPT4ge1xuICAgICAgICAgICAgdGhpcy53cml0ZUNvbW1hbmREYXRhKGRhdGEsIGVudW1JbmRleGVzLCBwb3N0Zml4SW5kZXhlcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludCh0aGlzLnNvZnRFbnVtcy5sZW5ndGgpO1xuICAgICAgICB0aGlzLnNvZnRFbnVtcy5mb3JFYWNoKChfZW51bTogQ29tbWFuZEVudW0pID0+IHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVTb2Z0RW51bShfZW51bSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludCh0aGlzLmVudW1Db25zdHJhaW50cy5sZW5ndGgpO1xuICAgICAgICB0aGlzLmVudW1Db25zdHJhaW50cy5mb3JFYWNoKChjb25zdHJhaW50OiBDb21tYW5kRW51bUNvbnN0cmFpbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVFbnVtQ29uc3RyYWludChjb25zdHJhaW50LCBlbnVtSW5kZXhlcywgZW51bVZhbHVlSW5kZXhlcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVFbnVtKHsgbmFtZSwgdmFsdWVzIH06IENvbW1hbmRFbnVtLCBlbnVtVmFsdWVNYXA6IE1hcDxzdHJpbmcsIG51bWJlcj4pOiB2b2lkIHtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgbmFtZSk7XG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludCh2YWx1ZXMubGVuZ3RoKTtcblxuICAgICAgICBjb25zdCBsaXN0U2l6ZSA9IGVudW1WYWx1ZU1hcC5zaXplO1xuICAgICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBlbnVtVmFsdWVNYXAuZ2V0KHZhbHVlKSA/PyAtMTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMud3JpdGVFbnVtVmFsdWVJbmRleChpbmRleCwgbGlzdFNpemUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlRW51bVZhbHVlSW5kZXgoaW5kZXg6IG51bWJlciwgdmFsdWVDb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZUNvdW50IDwgMjU2KSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlQnl0ZShpbmRleCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVDb3VudCA8IDY1NTM2KSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRTaG9ydExFKGluZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZEludExFKGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVDb21tYW5kRGF0YShcbiAgICAgICAgZGF0YTogQ29tbWFuZERhdGEsXG4gICAgICAgIGVudW1JbmRleGVzOiBNYXA8c3RyaW5nLCBudW1iZXI+LFxuICAgICAgICBfcG9zdGZpeEluZGV4ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj5cbiAgICApOiB2b2lkIHtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgZGF0YS5jb21tYW5kTmFtZSk7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsIGRhdGEuY29tbWFuZERlc2NyaXB0aW9uKTtcbiAgICAgICAgdGhpcy53cml0ZVNob3J0TEUoZGF0YS5mbGFncyk7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlKGRhdGEucGVybWlzc2lvbik7XG5cbiAgICAgICAgaWYgKGRhdGEuYWxpYXNlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy53cml0ZUludExFKGVudW1JbmRleGVzLmdldChkYXRhLmFsaWFzZXMubmFtZSkgPz8gLTEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53cml0ZUludExFKC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludCgwKTsgLy8gY2hhaW5lZFN1YkNvbW1hbmREYXRhXG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KDApO1xuICAgICAgICAvKnRoaXMud3JpdGVVbnNpZ25lZFZhckludChkYXRhLm92ZXJsb2Fkcy5sZW5ndGgpO1xuICAgICAgICBkYXRhLm92ZXJsb2Fkcy5mb3JFYWNoKChvdmVybG9hZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KG92ZXJsb2FkLmxlbmd0aCk7XG4gICAgICAgICAgICBvdmVybG9hZC5mb3JFYWNoKChwYXJhbWV0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCBwYXJhbWV0ZXIucGFyYW1OYW1lKTtcblxuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gcGFyYW1ldGVyLnBhcmFtVHlwZTtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmVudW0gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5lbnVtLnNvZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQVJHX0ZMQUdfU09GVF9FTlVNIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFSR19GTEFHX1ZBTElEIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW51bUluZGV4ZXMuZ2V0KHBhcmFtZXRlci5lbnVtLm5hbWUpID8/IC0xKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0aGlzLkFSR19GTEFHX0VOVU0gfCB0aGlzLkFSR19GTEFHX1ZBTElEIHwgKGVudW1JbmRleGVzLmdldChwYXJhbWV0ZXIuZW51bS5uYW1lKSA/PyAtMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlci5wb3N0Zml4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHBvc3RmaXhJbmRleGVzLmdldChwYXJhbWV0ZXIucG9zdGZpeCkgPz8gLTE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IC0xKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0aGlzLkFSR19GTEFHX1BPU1RGSVggfCBrZXk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZUludExFKHR5cGUpO1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVCb29sZWFuKHBhcmFtZXRlci5pc09wdGlvbmFsKTtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlQnl0ZShwYXJhbWV0ZXIuZmxhZ3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pOyovXG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZVNvZnRFbnVtKF9lbnVtOiBDb21tYW5kRW51bSk6IHZvaWQge1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCBfZW51bS5uYW1lKTtcbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KF9lbnVtLnZhbHVlcy5sZW5ndGgpO1xuICAgICAgICBfZW51bS52YWx1ZXMuZm9yRWFjaCgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlRW51bUNvbnN0cmFpbnQoXG4gICAgICAgIGNvbnN0cmFpbnQ6IENvbW1hbmRFbnVtQ29uc3RyYWludCxcbiAgICAgICAgZW51bUluZGV4ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4sXG4gICAgICAgIGVudW1WYWx1ZUluZGV4ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj5cbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cml0ZUludExFKGVudW1WYWx1ZUluZGV4ZXMuZ2V0KGNvbnN0cmFpbnQuZ2V0QWZmZWN0ZWRWYWx1ZSgpKSA/PyAwKTtcbiAgICAgICAgdGhpcy53cml0ZUludExFKGVudW1JbmRleGVzLmdldChjb25zdHJhaW50LmdldEVudW0oKS5uYW1lKSA/PyAwKTtcbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KGNvbnN0cmFpbnQuZ2V0Q29uc3RyYWludHMoKS5sZW5ndGgpO1xuICAgICAgICBjb25zdHJhaW50LmdldENvbnN0cmFpbnRzKCkuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgICAgdGhpcy53cml0ZUJ5dGUodik7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFXQSxJQUFxQiwwQkFBckIsY0FBcUQsV0FBVztDQUM1RCxPQUFjLFFBQVEsWUFBWTtDQUVsQyxpQkFBd0I7Q0FDeEIsZUFBc0I7Q0FDdEIsaUJBQXdCO0NBQ3hCLHdCQUErQjtDQUMvQixrQkFBeUI7Q0FDekIsd0JBQStCO0NBQy9CLG9CQUEyQjtDQUMzQixnQkFBdUI7Q0FDdkIsbUJBQTBCO0NBQzFCLHFCQUE0QjtDQUU1QixjQUFvQyxDQUFDO0NBQ3JDLGlCQUF1QyxDQUFDO0NBQ3hDLFlBQWtDLENBQUM7Q0FDbkMsa0JBQWtELENBQUM7Q0FFbkQsZ0JBQTZCO0VBQ3pCLE1BQU0sbUNBQXdDLElBQUksSUFBSTtFQUN0RCxNQUFNLGlDQUFzQyxJQUFJLElBQUk7RUFDcEQsTUFBTSxRQUF1QixDQUFDO0VBQzlCLE1BQU0sOEJBQW1DLElBQUksSUFBSTtFQUNqRCxNQUFNLFlBQTJCLENBQUM7RUFDbEMsTUFBTSxrQ0FBdUMsSUFBSSxJQUFJO0VBRXJELE1BQU0sY0FBYyxVQUF1QjtHQUN2QyxNQUFNLEVBQUUsTUFBTSxNQUFNLFdBQVc7R0FFL0IsSUFBSSxNQUFNO0lBQ04sSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksR0FBRztLQUM1QixNQUFNLFFBQVEsZ0JBQWdCLElBQUksTUFBTSxnQkFBZ0IsSUFBSSxFQUFFLElBQUksSUFBSTtLQUN0RSxVQUFVLFNBQVM7SUFDdkI7SUFDQTtHQUNKO0dBRUEsT0FBTyxTQUFTLFVBQVU7SUFDdEIsSUFBSSxDQUFDLGlCQUFpQixJQUFJLEtBQUssR0FDM0IsaUJBQWlCLElBQUksT0FBTyxpQkFBaUIsSUFBSTtHQUV6RCxDQUFDO0dBQ0QsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLEdBQUc7SUFDeEIsTUFBTSxRQUFRLFlBQVksSUFBSSxNQUFNLFlBQVksSUFBSSxFQUFFLElBQUksSUFBSTtJQUM5RCxN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