UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

287 lines (284 loc) • 33.1 kB
import { NetworkUtil } from '../network/NetworkUtil.es.js'; var MetadataFlag = /* @__PURE__ */ ((MetadataFlag2) => { MetadataFlag2[MetadataFlag2["INDEX"] = 0] = "INDEX"; MetadataFlag2[MetadataFlag2["HEALTH"] = 1] = "HEALTH"; MetadataFlag2[MetadataFlag2["VARIANT"] = 2] = "VARIANT"; MetadataFlag2[MetadataFlag2["COLOR"] = 3] = "COLOR"; MetadataFlag2[MetadataFlag2["NAMETAG"] = 4] = "NAMETAG"; MetadataFlag2[MetadataFlag2["OWNER_ENTITY_ID"] = 5] = "OWNER_ENTITY_ID"; MetadataFlag2[MetadataFlag2["TARGET_ENTITY_ID"] = 6] = "TARGET_ENTITY_ID"; MetadataFlag2[MetadataFlag2["AIR"] = 7] = "AIR"; MetadataFlag2[MetadataFlag2["POTION_COLOR"] = 8] = "POTION_COLOR"; MetadataFlag2[MetadataFlag2["AMBIENT"] = 9] = "AMBIENT"; MetadataFlag2[MetadataFlag2["HURT_TIME"] = 10] = "HURT_TIME"; MetadataFlag2[MetadataFlag2["HURT_DIRECTION"] = 11] = "HURT_DIRECTION"; MetadataFlag2[MetadataFlag2["PADDLE_TIME_LEFT"] = 12] = "PADDLE_TIME_LEFT"; MetadataFlag2[MetadataFlag2["PADDLE_TIME_RIGHT"] = 13] = "PADDLE_TIME_RIGHT"; MetadataFlag2[MetadataFlag2["EXPERIENCE_VALUE"] = 14] = "EXPERIENCE_VALUE"; MetadataFlag2[MetadataFlag2["PLAYER_INDEX"] = 27] = "PLAYER_INDEX"; MetadataFlag2[MetadataFlag2["ENTITY_LEAD_HOLDER_ID"] = 37] = "ENTITY_LEAD_HOLDER_ID"; MetadataFlag2[MetadataFlag2["SCALE"] = 38] = "SCALE"; MetadataFlag2[MetadataFlag2["MAX_AIR"] = 42] = "MAX_AIR"; MetadataFlag2[MetadataFlag2["SPRINTING"] = 3] = "SPRINTING"; MetadataFlag2[MetadataFlag2["CAN_CLIMB"] = 19] = "CAN_CLIMB"; MetadataFlag2[MetadataFlag2["CAN_FLY"] = 21] = "CAN_FLY"; MetadataFlag2[MetadataFlag2["HAS_COLLISION"] = 48] = "HAS_COLLISION"; MetadataFlag2[MetadataFlag2["AFFECTED_BY_GRAVITY"] = 49] = "AFFECTED_BY_GRAVITY"; MetadataFlag2[MetadataFlag2["BOUNDINGBOX_WIDTH"] = 53] = "BOUNDINGBOX_WIDTH"; MetadataFlag2[MetadataFlag2["BOUNDINGBOX_HEIGHT"] = 54] = "BOUNDINGBOX_HEIGHT"; return MetadataFlag2; })(MetadataFlag || {}); var FlagType = /* @__PURE__ */ ((FlagType2) => { FlagType2[FlagType2["BYTE"] = 0] = "BYTE"; FlagType2[FlagType2["SHORT"] = 1] = "SHORT"; FlagType2[FlagType2["INT"] = 2] = "INT"; FlagType2[FlagType2["FLOAT"] = 3] = "FLOAT"; FlagType2[FlagType2["STRING"] = 4] = "STRING"; FlagType2[FlagType2["ITEM"] = 5] = "ITEM"; FlagType2[FlagType2["POSITION"] = 6] = "POSITION"; FlagType2[FlagType2["LONG"] = 7] = "LONG"; FlagType2[FlagType2["VECTOR"] = 8] = "VECTOR"; return FlagType2; })(FlagType || {}); class MetadataWriter { metadata = /* @__PURE__ */ new Map(); getPropertyValue(key) { return this.metadata.has(key) ? this.metadata.get(key)[1] : null; } setPropertyValue(key, type, value) { this.metadata.set(key, [type, value]); } setLong(key, value) { this.setPropertyValue(key, 7 /* LONG */, value); } setShort(key, value) { this.setPropertyValue(key, 1 /* SHORT */, value); } /** * Set the property value as a string. * @param {number} key - The property id. * @param {string} value - The property value. */ setString(key, value) { this.setPropertyValue(key, 4 /* STRING */, value); } /** * Get the property value as a string. * @param {number} key - The property id. * @returns {string} The property value. */ getString(key) { return this.metadata.get(key); } /** * Set the property value as a float. * @param {number} key - The property id. * @param {number} value - The property value. */ setFloat(key, value) { this.setPropertyValue(key, 3 /* FLOAT */, value); } /** * Get the property value as a float. * @param {number} key - The property id. * @returns {number} */ getFloat(key) { return this.metadata.get(key); } /** * Set a flag value. * @param {number} propertyId - The property id. * @param {number} flagId - The flag id. * @param {boolean} [value=true] - The flag value. * @param {FlagType} [propertyType=FlagType.LONG] - The property type. */ setDataFlag(propertyId, flagId, value = true, propertyType = 7 /* LONG */) { const flagId64 = BigInt(flagId); if (this.getDataFlag(propertyId, flagId64) !== value) { const flags = this.getPropertyValue(propertyId); this.setPropertyValue(propertyId, propertyType, flags ^ 1n << flagId64); } } /** * Get the property value as a boolean. * @param {number} propertyId - The property id. * @param {bigint} flagId - The flag id. * @returns {boolean} The flag value. */ getDataFlag(propertyId, flagId) { return (this.getPropertyValue(propertyId) & 1n << flagId) > 0; } /** * @param {number} flagId - The flag id. * @param {boolean} [value=true] - The flag value. */ setGenericFlag(flagId, value = true) { this.setDataFlag(flagId >= 64 ? 94 : 0 /* INDEX */, flagId % 64, value, 7 /* LONG */); } /** * Get the property value as a boolean. * @returns {typeof metadata} The metadata object. */ getData() { return this.metadata; } networkSerialize(stream) { stream.writeUnsignedVarInt(this.getData().size); for (const [index, value] of this.getData()) { stream.writeUnsignedVarInt(index); stream.writeSignedByte(value[0]); switch (value[0]) { case 0 /* BYTE */: stream.writeByte(Number(value[1])); break; case 3 /* FLOAT */: stream.writeFloatLE(value[1]); break; case 7 /* LONG */: stream.writeVarLong(value[1]); break; case 4 /* STRING */: NetworkUtil.writeString(stream, value[1]); break; case 1 /* SHORT */: stream.writeUnsignedShortLE(value[1]); break; default: throw new Error(`Metadata type ${value[0]} not supported`); } } } } class Metadata extends MetadataWriter { /** * Create a new metadata object. * @param {boolean} [setDefaults=true] * @returns {Metadata} the metadata object. */ constructor(setDefaults = true) { super(); if (!setDefaults) return; this.setDefaults(); } /** * Set the default metadata values. * @remarks This method is called when the metadata object is created. * @TODO: Add missing functions. */ setDefaults() { this.setLong(0 /* INDEX */, 0n); this.setShort(42 /* MAX_AIR */, 300); this.setLong(37 /* ENTITY_LEAD_HOLDER_ID */, -1n); this.setFloat(53 /* BOUNDINGBOX_WIDTH */, 0.6); this.setFloat(54 /* BOUNDINGBOX_HEIGHT */, 1.8); this.setShort(7 /* AIR */, 0); this.setScale(); this.setAffectedByGravity(); this.setCollidable(); } /** * Set the entity's name tag. * @param {string} name - The name tag. * @example * ```typescript * entity.setNameTag('Steve'); * ``` */ setNameTag(name) { this.setString(4 /* NAMETAG */, name); } /** * Get the entity's name tag. * @returns {string} The entity's name tag. */ get nameTag() { return this.getString(4 /* NAMETAG */); } /** * Set the entity's scale. * @param {number} [scale=1] - The entity's scale. */ setScale(scale = 1) { this.setFloat(38 /* SCALE */, scale); } /** * Get the entity's scale. * @returns {number} The entity's scale. */ getScale() { return this.getPropertyValue(38 /* SCALE */); } /** * Set if the entity should be affected by gravity. * @param {boolean} [affected=true] - if the entity should be affected by gravity. */ setAffectedByGravity(affected = true) { this.setGenericFlag(49 /* AFFECTED_BY_GRAVITY */, affected); } /** * Get if the entity is affected by gravity. * @returns {boolean} if the entity is affected by gravity. */ get affectedByGravity() { return this.getDataFlag(0 /* INDEX */, BigInt(49 /* AFFECTED_BY_GRAVITY */)); } /** * Set if the entity should be collidable. * @param {boolean} [collidable=true] - if the entity should be collidable. */ setCollidable(collidable = true) { this.setGenericFlag(48 /* HAS_COLLISION */, collidable); } /** * Get entity's collidable state. * @returns {boolean} if the entity is collidable. */ get collidable() { return this.getDataFlag(0 /* INDEX */, BigInt(48 /* HAS_COLLISION */)); } /** * Set the entity's sprinting state. * @param {boolean} [sprinting=true] - if the entity is sprinting. */ setSprinting(sprinting = true) { this.setDataFlag(0 /* INDEX */, 3 /* SPRINTING */, sprinting, 0 /* BYTE */); } /** * Get entity's sprinting state. * @returns {boolean} if the entity is sprinting. */ get sprinting() { return this.getDataFlag(0 /* INDEX */, BigInt(3 /* SPRINTING */)); } /** * Set the entity's can fly state. * @param {boolean} [canFly=true] - if the entity can fly. */ setCanFly(canFly = true) { this.setDataFlag(0 /* INDEX */, 21 /* CAN_FLY */, canFly, 0 /* BYTE */); } /** * Get entity's can fly state. * @returns {boolean} if the entity can fly. */ get canFly() { return this.getDataFlag(0 /* INDEX */, BigInt(21 /* CAN_FLY */)); } /** * Set the entity's can climb state. * @param {boolean} [canClimb=true] - if the entity can climb. */ setCanClimb(canClimb = true) { this.setDataFlag(0 /* INDEX */, 19 /* CAN_CLIMB */, canClimb, 0 /* BYTE */); } /** * Get entity's can climb state. * @returns {boolean} if the entity can climb. */ get canClimb() { return this.getDataFlag(0 /* INDEX */, BigInt(19 /* CAN_CLIMB */)); } } export { FlagType, Metadata, MetadataFlag, MetadataWriter }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWV0YWRhdGEuZXMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvTWV0YWRhdGEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5pbXBvcnQgeyBOZXR3b3JrVXRpbCB9IGZyb20gJy4uL25ldHdvcmsvTmV0d29ya1V0aWwnO1xuXG4vLyBUT0RPOiBTdGlsbCBtaXNzaW5nIGZsYWdzXG5leHBvcnQgZW51bSBNZXRhZGF0YUZsYWcge1xuICAgIElOREVYLFxuICAgIEhFQUxUSCxcbiAgICBWQVJJQU5ULFxuICAgIENPTE9SLFxuICAgIE5BTUVUQUcsXG4gICAgT1dORVJfRU5USVRZX0lELFxuICAgIFRBUkdFVF9FTlRJVFlfSUQsXG4gICAgQUlSLFxuICAgIFBPVElPTl9DT0xPUixcbiAgICBBTUJJRU5ULFxuICAgIEhVUlRfVElNRSxcbiAgICBIVVJUX0RJUkVDVElPTixcbiAgICBQQURETEVfVElNRV9MRUZULFxuICAgIFBBRERMRV9USU1FX1JJR0hULFxuICAgIEVYUEVSSUVOQ0VfVkFMVUUsXG4gICAgUExBWUVSX0lOREVYID0gMjcsXG4gICAgRU5USVRZX0xFQURfSE9MREVSX0lEID0gMzcsXG4gICAgU0NBTEUsXG4gICAgTUFYX0FJUiA9IDQyLFxuXG4gICAgLy8gZmxhZ3NcbiAgICBTUFJJTlRJTkcgPSAzLFxuICAgIENBTl9DTElNQiA9IDE5LFxuICAgIENBTl9GTFkgPSAyMSxcbiAgICBIQVNfQ09MTElTSU9OID0gNDgsXG4gICAgQUZGRUNURURfQllfR1JBVklUWSA9IDQ5LFxuICAgIEJPVU5ESU5HQk9YX1dJRFRIID0gNTMsXG4gICAgQk9VTkRJTkdCT1hfSEVJR0hUXG59XG5cbmV4cG9ydCBlbnVtIEZsYWdUeXBlIHtcbiAgICBCWVRFLFxuICAgIFNIT1JULFxuICAgIElOVCxcbiAgICBGTE9BVCxcbiAgICBTVFJJTkcsXG4gICAgSVRFTSxcbiAgICBQT1NJVElPTixcbiAgICBMT05HLFxuICAgIFZFQ1RPUlxufVxuXG5leHBvcnQgdHlwZSBNZXRhZGF0YUNvbnRhaW5lciA9IE1hcDxudW1iZXIsIFtudW1iZXIsIGJpZ2ludCB8IG51bWJlciB8IGJvb2xlYW4gfCBzdHJpbmddPjtcbmV4cG9ydCBjbGFzcyBNZXRhZGF0YVdyaXRlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXRhZGF0YTogTWV0YWRhdGFDb250YWluZXIgPSBuZXcgTWFwKCk7XG5cbiAgICBwdWJsaWMgZ2V0UHJvcGVydHlWYWx1ZShrZXk6IG51bWJlcik6IGJpZ2ludCB8IG51bWJlciB8IGJvb2xlYW4gfCBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGEuaGFzKGtleSkgPyB0aGlzLm1ldGFkYXRhLmdldChrZXkpIVsxXSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFByb3BlcnR5VmFsdWUoa2V5OiBudW1iZXIsIHR5cGU6IG51bWJlciwgdmFsdWU6IGJpZ2ludCB8IG51bWJlciB8IGJvb2xlYW4gfCBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZXRhZGF0YS5zZXQoa2V5LCBbdHlwZSwgdmFsdWVdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TG9uZyhrZXk6IG51bWJlciwgdmFsdWU6IGJpZ2ludCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoa2V5LCBGbGFnVHlwZS5MT05HLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFNob3J0KGtleTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShrZXksIEZsYWdUeXBlLlNIT1JULCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBhcyBhIHN0cmluZy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga2V5IC0gVGhlIHByb3BlcnR5IGlkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U3RyaW5nKGtleTogbnVtYmVyLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShrZXksIEZsYWdUeXBlLlNUUklORywgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHByb3BlcnR5IHZhbHVlIGFzIGEgc3RyaW5nLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrZXkgLSBUaGUgcHJvcGVydHkgaWQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHByb3BlcnR5IHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTdHJpbmcoa2V5OiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YS5nZXQoa2V5KSEgYXMgYW55O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgcHJvcGVydHkgdmFsdWUgYXMgYSBmbG9hdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga2V5IC0gVGhlIHByb3BlcnR5IGlkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmxvYXQoa2V5OiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKGtleSwgRmxhZ1R5cGUuRkxPQVQsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBhcyBhIGZsb2F0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrZXkgLSBUaGUgcHJvcGVydHkgaWQuXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmxvYXQoa2V5OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YS5nZXQoa2V5KSEgYXMgYW55O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBhIGZsYWcgdmFsdWUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHByb3BlcnR5SWQgLSBUaGUgcHJvcGVydHkgaWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGZsYWdJZCAtIFRoZSBmbGFnIGlkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlPXRydWVdIC0gVGhlIGZsYWcgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGbGFnVHlwZX0gW3Byb3BlcnR5VHlwZT1GbGFnVHlwZS5MT05HXSAtIFRoZSBwcm9wZXJ0eSB0eXBlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXREYXRhRmxhZyhwcm9wZXJ0eUlkOiBudW1iZXIsIGZsYWdJZDogbnVtYmVyLCB2YWx1ZSA9IHRydWUsIHByb3BlcnR5VHlwZSA9IEZsYWdUeXBlLkxPTkcpOiB2b2lkIHtcbiAgICAgICAgLy8gQWxsIGdlbmVyaWMgZmxhZ3MgYXJlIHdyaXR0ZW4gYXMgTG9uZ3MgKGJpZ2ludHMpIDY0Yml0XG4gICAgICAgIGNvbnN0IGZsYWdJZDY0ID0gQmlnSW50KGZsYWdJZCk7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBzYW1lIHZhbHVlIGlzIGFscmVhZHkgc2V0XG4gICAgICAgIGlmICh0aGlzLmdldERhdGFGbGFnKHByb3BlcnR5SWQsIGZsYWdJZDY0KSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsYWdzID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5SWQpIGFzIGJpZ2ludDtcbiAgICAgICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eUlkLCBwcm9wZXJ0eVR5cGUsIGZsYWdzIF4gKDFuIDw8IGZsYWdJZDY0KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBhcyBhIGJvb2xlYW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHByb3BlcnR5SWQgLSBUaGUgcHJvcGVydHkgaWQuXG4gICAgICogQHBhcmFtIHtiaWdpbnR9IGZsYWdJZCAtIFRoZSBmbGFnIGlkLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUaGUgZmxhZyB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGF0YUZsYWcocHJvcGVydHlJZDogbnVtYmVyLCBmbGFnSWQ6IGJpZ2ludCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKCh0aGlzLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHlJZCkgYXMgYmlnaW50KSAmICgxbiA8PCBmbGFnSWQpKSA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGZsYWdJZCAtIFRoZSBmbGFnIGlkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlPXRydWVdIC0gVGhlIGZsYWcgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIHNldEdlbmVyaWNGbGFnKGZsYWdJZDogbnVtYmVyLCB2YWx1ZSA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXREYXRhRmxhZyhmbGFnSWQgPj0gNjQgPyA5NCA6IE1ldGFkYXRhRmxhZy5JTkRFWCwgZmxhZ0lkICUgNjQsIHZhbHVlLCBGbGFnVHlwZS5MT05HKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHByb3BlcnR5IHZhbHVlIGFzIGEgYm9vbGVhbi5cbiAgICAgKiBAcmV0dXJucyB7dHlwZW9mIG1ldGFkYXRhfSBUaGUgbWV0YWRhdGEgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmV0d29ya1NlcmlhbGl6ZShzdHJlYW06IEJpbmFyeVN0cmVhbSk6IHZvaWQge1xuICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZFZhckludCh0aGlzLmdldERhdGEoKS5zaXplKTtcbiAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHZhbHVlXSBvZiB0aGlzLmdldERhdGEoKSBhcyBhbnkpIHtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkVmFySW50KGluZGV4KTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVNpZ25lZEJ5dGUodmFsdWVbMF0pO1xuICAgICAgICAgICAgc3dpdGNoICh2YWx1ZVswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgRmxhZ1R5cGUuQllURTpcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlQnl0ZShOdW1iZXIodmFsdWVbMV0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBGbGFnVHlwZS5GTE9BVDpcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlRmxvYXRMRSh2YWx1ZVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRmxhZ1R5cGUuTE9ORzpcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlVmFyTG9uZyh2YWx1ZVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRmxhZ1R5cGUuU1RSSU5HOlxuICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIHZhbHVlWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBGbGFnVHlwZS5TSE9SVDpcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRTaG9ydExFKHZhbHVlWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXRhZGF0YSB0eXBlICR7dmFsdWVbMF19IG5vdCBzdXBwb3J0ZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBtZXRhZGF0YSBvZiBhbiBlbnRpdHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZXRhZGF0YSBleHRlbmRzIE1ldGFkYXRhV3JpdGVyIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgbWV0YWRhdGEgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NldERlZmF1bHRzPXRydWVdXG4gICAgICogQHJldHVybnMge01ldGFkYXRhfSB0aGUgbWV0YWRhdGEgb2JqZWN0LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNldERlZmF1bHRzID0gdHJ1ZSkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmICghc2V0RGVmYXVsdHMpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZGVmYXVsdCBtZXRhZGF0YSB2YWx1ZXMuXG4gICAgICogQHJlbWFya3MgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9iamVjdCBpcyBjcmVhdGVkLlxuICAgICAqIEBUT0RPOiBBZGQgbWlzc2luZyBmdW5jdGlvbnMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNldERlZmF1bHRzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldExvbmcoTWV0YWRhdGFGbGFnLklOREVYLCAwbik7XG5cbiAgICAgICAgdGhpcy5zZXRTaG9ydChNZXRhZGF0YUZsYWcuTUFYX0FJUiwgMzAwKTtcbiAgICAgICAgdGhpcy5zZXRMb25nKE1ldGFkYXRhRmxhZy5FTlRJVFlfTEVBRF9IT0xERVJfSUQsIC0xbik7XG4gICAgICAgIHRoaXMuc2V0RmxvYXQoTWV0YWRhdGFGbGFnLkJPVU5ESU5HQk9YX1dJRFRILCAwLjYpO1xuICAgICAgICB0aGlzLnNldEZsb2F0KE1ldGFkYXRhRmxhZy5CT1VORElOR0JPWF9IRUlHSFQsIDEuOCk7XG4gICAgICAgIHRoaXMuc2V0U2hvcnQoTWV0YWRhdGFGbGFnLkFJUiwgMCk7XG5cbiAgICAgICAgdGhpcy5zZXRTY2FsZSgpO1xuICAgICAgICB0aGlzLnNldEFmZmVjdGVkQnlHcmF2aXR5KCk7XG4gICAgICAgIHRoaXMuc2V0Q29sbGlkYWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZW50aXR5J3MgbmFtZSB0YWcuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSB0YWcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZW50aXR5LnNldE5hbWVUYWcoJ1N0ZXZlJyk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldE5hbWVUYWcobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0U3RyaW5nKE1ldGFkYXRhRmxhZy5OQU1FVEFHLCBuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBlbnRpdHkncyBuYW1lIHRhZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZW50aXR5J3MgbmFtZSB0YWcuXG4gICAgICovXG4gICAgcHVibGljIGdldCBuYW1lVGFnKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFN0cmluZyhNZXRhZGF0YUZsYWcuTkFNRVRBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBlbnRpdHkncyBzY2FsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NjYWxlPTFdIC0gVGhlIGVudGl0eSdzIHNjYWxlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTY2FsZShzY2FsZTogbnVtYmVyID0gMSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldEZsb2F0KE1ldGFkYXRhRmxhZy5TQ0FMRSwgc2NhbGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGVudGl0eSdzIHNjYWxlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBlbnRpdHkncyBzY2FsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2NhbGUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShNZXRhZGF0YUZsYWcuU0NBTEUpIGFzIG51bWJlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgaWYgdGhlIGVudGl0eSBzaG91bGQgYmUgYWZmZWN0ZWQgYnkgZ3Jhdml0eS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthZmZlY3RlZD10cnVlXSAtIGlmIHRoZSBlbnRpdHkgc2hvdWxkIGJlIGFmZmVjdGVkIGJ5IGdyYXZpdHkuXG4gICAgICovXG4gICAgcHVibGljIHNldEFmZmVjdGVkQnlHcmF2aXR5KGFmZmVjdGVkOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldEdlbmVyaWNGbGFnKE1ldGFkYXRhRmxhZy5BRkZFQ1RFRF9CWV9HUkFWSVRZLCBhZmZlY3RlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBpZiB0aGUgZW50aXR5IGlzIGFmZmVjdGVkIGJ5IGdyYXZpdHkuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGlmIHRoZSBlbnRpdHkgaXMgYWZmZWN0ZWQgYnkgZ3Jhdml0eS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGFmZmVjdGVkQnlHcmF2aXR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXREYXRhRmxhZyhNZXRhZGF0YUZsYWcuSU5ERVgsIEJpZ0ludChNZXRhZGF0YUZsYWcuQUZGRUNURURfQllfR1JBVklUWSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBpZiB0aGUgZW50aXR5IHNob3VsZCBiZSBjb2xsaWRhYmxlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbGxpZGFibGU9dHJ1ZV0gLSBpZiB0aGUgZW50aXR5IHNob3VsZCBiZSBjb2xsaWRhYmxlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRDb2xsaWRhYmxlKGNvbGxpZGFibGU6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0R2VuZXJpY0ZsYWcoTWV0YWRhdGFGbGFnLkhBU19DT0xMSVNJT04sIGNvbGxpZGFibGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgZW50aXR5J3MgY29sbGlkYWJsZSBzdGF0ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gaWYgdGhlIGVudGl0eSBpcyBjb2xsaWRhYmxlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29sbGlkYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YUZsYWcoTWV0YWRhdGFGbGFnLklOREVYLCBCaWdJbnQoTWV0YWRhdGFGbGFnLkhBU19DT0xMSVNJT04pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGVudGl0eSdzIHNwcmludGluZyBzdGF0ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzcHJpbnRpbmc9dHJ1ZV0gLSBpZiB0aGUgZW50aXR5IGlzIHNwcmludGluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U3ByaW50aW5nKHNwcmludGluZzogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXREYXRhRmxhZyhNZXRhZGF0YUZsYWcuSU5ERVgsIE1ldGFkYXRhRmxhZy5TUFJJTlRJTkcsIHNwcmludGluZywgRmxhZ1R5cGUuQllURSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBlbnRpdHkncyBzcHJpbnRpbmcgc3RhdGUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGlmIHRoZSBlbnRpdHkgaXMgc3ByaW50aW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3ByaW50aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXREYXRhRmxhZyhNZXRhZGF0YUZsYWcuSU5ERVgsIEJpZ0ludChNZXRhZGF0YUZsYWcuU1BSSU5USU5HKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBlbnRpdHkncyBjYW4gZmx5IHN0YXRlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NhbkZseT10cnVlXSAtIGlmIHRoZSBlbnRpdHkgY2FuIGZseS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Q2FuRmx5KGNhbkZseTogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXREYXRhRmxhZyhNZXRhZGF0YUZsYWcuSU5ERVgsIE1ldGFkYXRhRmxhZy5DQU5fRkxZLCBjYW5GbHksIEZsYWdUeXBlLkJZVEUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgZW50aXR5J3MgY2FuIGZseSBzdGF0ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gaWYgdGhlIGVudGl0eSBjYW4gZmx5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2FuRmx5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXREYXRhRmxhZyhNZXRhZGF0YUZsYWcuSU5ERVgsIEJpZ0ludChNZXRhZGF0YUZsYWcuQ0FOX0ZMWSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZW50aXR5J3MgY2FuIGNsaW1iIHN0YXRlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NhbkNsaW1iPXRydWVdIC0gaWYgdGhlIGVudGl0eSBjYW4gY2xpbWIuXG4gICAgICovXG4gICAgcHVibGljIHNldENhbkNsaW1iKGNhbkNsaW1iOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldERhdGFGbGFnKE1ldGFkYXRhRmxhZy5JTkRFWCwgTWV0YWRhdGFGbGFnLkNBTl9DTElNQiwgY2FuQ2xpbWIsIEZsYWdUeXBlLkJZVEUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgZW50aXR5J3MgY2FuIGNsaW1iIHN0YXRlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBpZiB0aGUgZW50aXR5IGNhbiBjbGltYi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNhbkNsaW1iKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXREYXRhRmxhZyhNZXRhZGF0YUZsYWcuSU5ERVgsIEJpZ0ludChNZXRhZGF0YUZsYWcuQ0FOX0NMSU1CKSk7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIk1ldGFkYXRhRmxhZyIsIkZsYWdUeXBlIl0sIm1hcHBpbmdzIjoiOztBQUlZLElBQUEsWUFBQSxxQkFBQUEsYUFBTCxLQUFBO0FBQ0gsRUFBQUEsYUFBQSxDQUFBLGFBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxPQUFBO0FBQ0EsRUFBQUEsYUFBQSxDQUFBLGFBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxRQUFBO0FBQ0EsRUFBQUEsYUFBQSxDQUFBLGFBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxTQUFBO0FBQ0EsRUFBQUEsYUFBQSxDQUFBLGFBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxPQUFBO0FBQ0EsRUFBQUEsYUFBQSxDQUFBLGFBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxTQUFBO0FBQ0EsRUFBQUEsYUFBQSxDQUFBLGFBQUEsQ0FBQSxpQkFBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLEdBQUEsaUJBQUE7QUFDQSxFQUFBQSxhQUFBLENBQUEsYUFBQSxDQUFBLGtCQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxrQkFBQTtBQUNBLEVBQUFBLGFBQUEsQ0FBQSxhQUFBLENBQUEsS0FBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLEdBQUEsS0FBQTtBQUNBLEVBQUFBLGFBQUEsQ0FBQSxhQUFBLENBQUEsY0FBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLEdBQUEsY0FBQTtBQUNBLEVBQUFBLGFBQUEsQ0FBQSxhQUFBLENBQUEsU0FBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLEdBQUEsU0FBQTtBQUNBLEVBQUFBLGFBQUEsQ0FBQSxhQUFBLENBQUEsV0FBQSxDQUFBLEdBQUEsRUFBQSxDQUFBLEdBQUEsV0FBQTtBQUNBLEVBQUFBLGFBQUEsQ0FBQSxhQUFBLENBQUEsZ0JBQUEsQ0FBQSxHQUFBLEVBQUEsQ0FBQSxHQUFBLGdCQUFBO0FBQ0EsRUFBQUEsYUFBQSxDQUFBLGFBQUEsQ0FBQSxrQkFBQSxDQUFBLEdBQUEsRUFBQSxDQUFBLEdBQUEsa0JBQUE7QUFDQSxFQUFBQSxhQUFBLENBQUEsYUFBQSxDQUFBLG1CQUFBLENBQUEsR0FBQSxFQUFBLENBQUEsR0FBQSxtQkFBQTtBQUNBLEVBQUFBLGFBQUEsQ0FBQSxhQUFBLENBQUEsa0JBQUEsQ0FBQSxHQUFBLEVBQUEsQ0FBQSxHQUFBLGtCQUFBO0FBQ0EsRUFBQUEsYUFBQUEsQ0FBQUEsYUFBQUEsQ0FBQSxrQkFBZSxFQUFmLENBQUEsR0FBQSxjQUFBO0FBQ0EsRUFBQUEsYUFBQUEsQ0FBQUEsYUFBQUEsQ0FBQSwyQkFBd0IsRUFBeEIsQ0FBQSxHQUFBLHVCQUFBO0FBQ0EsRUFBQUEsYUFBQSxDQUFBLGFBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxFQUFBLENBQUEsR0FBQSxPQUFBO0FBQ0EsRUFBQUEsYUFBQUEsQ0FBQUEsYUFBQUEsQ0FBQSxhQUFVLEVBQVYsQ0FBQSxHQUFBLFNBQUE7QUFHQSxFQUFBQSxhQUFBQSxDQUFBQSxhQUFBQSxDQUFBLGVBQVksQ0FBWixDQUFBLEdBQUEsV0FBQTtBQUNBLEVBQUFBLGFBQUFBLENBQUFBLGFBQUFBLENBQUEsZUFBWSxFQUFaLENBQUEsR0FBQSxXQUFBO0FBQ0EsRUFBQUEsYUFBQUEsQ0FBQUEsYUFBQUEsQ0FBQSxhQUFVLEVBQVYsQ0FBQSxHQUFBLFNBQUE7QUFDQSxFQUFBQSxhQUFBQSxDQUFBQSxhQUFBQSxDQUFBLG1CQUFnQixFQUFoQixDQUFBLEdBQUEsZUFBQTtBQUNBLEVBQUFBLGFBQUFBLENBQUFBLGFBQUFBLENBQUEseUJBQXNCLEVBQXRCLENBQUEsR0FBQSxxQkFBQTtBQUNBLEVBQUFBLGFBQUFBLENBQUFBLGFBQUFBLENBQUEsdUJBQW9CLEVBQXBCLENBQUEsR0FBQSxtQkFBQTtBQUNBLEVBQUFBLGFBQUEsQ0FBQSxhQUFBLENBQUEsb0JBQUEsQ0FBQSxHQUFBLEVBQUEsQ0FBQSxHQUFBLG9CQUFBO0FBNUJRLEVBQUFBLE9BQUFBLGFBQUFBO0FBQUEsQ0FBQSxFQUFBLFlBQUEsSUFBQSxFQUFBO0FBK0JBLElBQUEsUUFBQSxxQkFBQUMsU0FBTCxLQUFBO0FBQ0gsRUFBQUEsU0FBQSxDQUFBLFNBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxNQUFBO0FBQ0EsRUFBQUEsU0FBQSxDQUFBLFNBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxPQUFBO0FBQ0EsRUFBQUEsU0FBQSxDQUFBLFNBQUEsQ0FBQSxLQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxLQUFBO0FBQ0EsRUFBQUEsU0FBQSxDQUFBLFNBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxPQUFBO0FBQ0EsRUFBQUEsU0FBQSxDQUFBLFNBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxRQUFBO0FBQ0EsRUFBQUEsU0FBQSxDQUFBLFNBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxNQUFBO0FBQ0EsRUFBQUEsU0FBQSxDQUFBLFNBQUEsQ0FBQSxVQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxVQUFBO0FBQ0EsRUFBQUEsU0FBQSxDQUFBLFNBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxNQUFBO0FBQ0EsRUFBQUEsU0FBQSxDQUFBLFNBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxRQUFBO0FB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