UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

225 lines 16.8 kB
import { mat4, quat } from "gl-matrix"; import { TgdMat4 } from "./mat4.js"; import { TgdQuat } from "./quat.js"; import { TgdVec3 } from "./vec3.js"; export class TgdTransfo { constructor(source) { var _a, _b, _c, _d; // prettier-ignore this._matrix = new TgdMat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); this._position = new TgdVec3(0, 0, 0); this._orientation = new TgdQuat(0, 0, 0, 1); this._scale = new TgdVec3(1, 1, 1); this._distance = 0; this.tmpVec3 = new TgdVec3(); this._axisX = new TgdVec3(); this._axisY = new TgdVec3(); this._axisZ = new TgdVec3(); this.dirty = false; if (!source) return; if (source instanceof TgdTransfo) this.from(source); else { this.distance = (_a = source.distance) !== null && _a !== void 0 ? _a : this.distance; this.position = (_b = source.position) !== null && _b !== void 0 ? _b : this.position; this.orientation = (_c = source.orientation) !== null && _c !== void 0 ? _c : this.orientation; this.scale = (_d = source.scale) !== null && _d !== void 0 ? _d : this.scale; } this.updateMatrix(); } clone() { return new TgdTransfo(this); } from(transfo) { var _a, _b, _c, _d; this.position = (_a = transfo.position) !== null && _a !== void 0 ? _a : this.position; this.orientation = (_b = transfo.orientation) !== null && _b !== void 0 ? _b : this.orientation; this.scale = (_c = transfo.scale) !== null && _c !== void 0 ? _c : this.scale; this.distance = (_d = transfo.distance) !== null && _d !== void 0 ? _d : this.distance; this.updateMatrix(); return this; } fromMatrix(mat) { this.matrix.from(mat); this.dirty = false; return this; } get matrix() { this.updateIfNeeded(); return this._matrix; } set matrix(value) { this._matrix.from(value); this.dirty = false; } get axisX() { this.updateIfNeeded(); return this._axisX; } get axisY() { this.updateIfNeeded(); return this._axisY; } get axisZ() { this.updateIfNeeded(); return this._axisZ; } // fromZupToYup(): this { // this.dirty = true // this._orientation.multiply(TgdQuat.fromFace("+X+Z-Y")) // return this // } updateIfNeeded() { if (!this.dirty) return; const m = this._matrix; mat4.fromRotationTranslationScale(m, this._orientation, this._position, this._scale); const X = this._axisX; const Y = this._axisY; const Z = this._axisZ; X.x = m.m00; X.y = m.m10; X.z = m.m20; Y.x = m.m01; Y.y = m.m11; Y.z = m.m21; Z.x = m.m02; Z.y = m.m12; Z.z = m.m22; const d = this._distance; if (d !== 0) { this.tmpVec3.reset(0, 0, d).applyQuaternion(this._orientation); m.m03 += this.tmpVec3.x; m.m13 += this.tmpVec3.y; m.m23 += this.tmpVec3.z; } this.dirty = false; } reset() { this.orientation.reset(); this.position.reset(); this.scale.reset(); this.dirty = true; return this; } get distance() { return this._distance; } set distance(value) { this._distance = value; this.updateMatrix(); } setDistance(value) { this.distance = value; return this; } get position() { this.updateMatrix(); return this._position; } set position(value) { this.updateMatrix(); this._position.from(value); } setPosition(x, y, z) { this.updateMatrix(); if (typeof x === "number") { this._position.reset(x, y, z); } else { this._position.reset(x[0], x[1], x[2]); } return this; } /** * When `this.distance` is not null, we are orbitiong around the `position`. * Then, the `actualPosition` is different. */ get actualPosition() { const d = this.distance; if (d === 0) return this.position; return this.tmpVec3.from(this.position).addWithScale(this.axisZ, d); } get scale() { return this._scale; } set scale(value) { this.updateMatrix(); this._scale.from(value); } setScale(x, y, z) { var _a; this.updateMatrix(); if (typeof x === "number") { this._scale.reset(x, y !== null && y !== void 0 ? y : x, (_a = z !== null && z !== void 0 ? z : y) !== null && _a !== void 0 ? _a : x); } else { this._scale.reset(x[0], x[1], x[2]); } return this; } get orientation() { this.updateMatrix(); return this._orientation; } set orientation(quat) { this._orientation.from(quat); this.updateMatrix(); } setOrientation(x, y, z, w) { if (typeof x === "number") { this._orientation.reset(x, y, z, w); } else { this._orientation.reset(x[0], x[1], x[2], x[3]); } this.updateMatrix(); return this; } /** * Reset the orientation by applying an Euler rotation * based on angles expressed in __degrees__. */ setEulerRotation(degreesAroundX, degreesAroundY, degreesAroundZ) { quat.fromEuler(this._orientation, degreesAroundX, degreesAroundY, degreesAroundZ); this.updateMatrix(); return this; } orbitAroundX(angleInRadians) { this._orientation.rotateAround(TgdVec3.X, angleInRadians); this.updateMatrix(); return this; } orbitAroundY(angleInRadians) { this._orientation.rotateAround(TgdVec3.Y, angleInRadians); this.updateMatrix(); return this; } orbitAroundZ(angleInRadians) { this._orientation.rotateAround(TgdVec3.Z, angleInRadians); this.updateMatrix(); return this; } moveAlongAxes(dx, dy, dz) { this.position .addWithScale(this.axisX, dx) .addWithScale(this.axisY, dy) .addWithScale(this.axisZ, dz); this.updateMatrix(); return this; } debug(caption = "Transfo") { console.log(caption); console.log("Distance:", this.distance); this.orientation.debug("Orientation"); this.scale.debug("Scale"); this.position.debug("Position"); this.matrix.debug("Matrix"); } updateMatrix() { this.dirty = true; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXRoL3RyYW5zZm8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFdEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFVaEMsTUFBTSxPQUFPLFVBQVU7SUFvQm5CLFlBQVksTUFBZ0Q7O1FBbkI1RCxrQkFBa0I7UUFDRCxZQUFPLEdBQUcsSUFBSSxPQUFPLENBQ2xDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFDVixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQ1YsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUNWLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FDYixDQUFBO1FBQ2dCLGNBQVMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ2hDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDdEMsV0FBTSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDdEMsY0FBUyxHQUFHLENBQUMsQ0FBQTtRQUVKLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO1FBQ3ZCLFdBQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO1FBQ3RCLFdBQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO1FBQ3RCLFdBQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO1FBRS9CLFVBQUssR0FBRyxLQUFLLENBQUE7UUFHakIsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFNO1FBQ25CLElBQUksTUFBTSxZQUFZLFVBQVU7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO2FBQzlDLENBQUM7WUFDRixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQUEsTUFBTSxDQUFDLFFBQVEsbUNBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQTtZQUNoRCxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQUEsTUFBTSxDQUFDLFFBQVEsbUNBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQTtZQUNoRCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQUEsTUFBTSxDQUFDLFdBQVcsbUNBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQTtZQUN6RCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQUEsTUFBTSxDQUFDLEtBQUssbUNBQUksSUFBSSxDQUFDLEtBQUssQ0FBQTtRQUMzQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO0lBQ3ZCLENBQUM7SUFFRCxLQUFLO1FBQ0QsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUMvQixDQUFDO0lBRUQsSUFBSSxDQUNBLE9BQW9FOztRQUVwRSxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQUEsT0FBTyxDQUFDLFFBQVEsbUNBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQTtRQUNqRCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQUEsT0FBTyxDQUFDLFdBQVcsbUNBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQTtRQUMxRCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQUEsT0FBTyxDQUFDLEtBQUssbUNBQUksSUFBSSxDQUFDLEtBQUssQ0FBQTtRQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQUEsT0FBTyxDQUFDLFFBQVEsbUNBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQTtRQUNqRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDbkIsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsVUFBVSxDQUFDLEdBQTRCO1FBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVELElBQUksTUFBTTtRQUNOLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUNyQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDdkIsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLEtBQXdDO1FBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ3RCLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDTCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUE7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBO0lBQ3RCLENBQUM7SUFDRCxJQUFJLEtBQUs7UUFDTCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUE7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBO0lBQ3RCLENBQUM7SUFDRCxJQUFJLEtBQUs7UUFDTCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUE7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBO0lBQ3RCLENBQUM7SUFFRCx5QkFBeUI7SUFDekIsd0JBQXdCO0lBQ3hCLDZEQUE2RDtJQUM3RCxrQkFBa0I7SUFDbEIsSUFBSTtJQUVJLGNBQWM7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTTtRQUV2QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFBO1FBQ3RCLElBQUksQ0FBQyw0QkFBNEIsQ0FDN0IsQ0FBQyxFQUNELElBQUksQ0FBQyxZQUFZLEVBQ2pCLElBQUksQ0FBQyxTQUFTLEVBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FDZCxDQUFBO1FBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQTtRQUNyQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFBO1FBQ3JCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUE7UUFDckIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFBO1FBQ1gsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFBO1FBQ1gsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFBO1FBQ1gsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFBO1FBQ1gsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFBO1FBQ1gsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFBO1FBQ1gsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFBO1FBQ1gsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFBO1FBQ1gsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFBO1FBQ1gsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQTtRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUM5RCxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO1lBQ3ZCLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7WUFDdkIsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUMzQixDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUE7SUFDdEIsQ0FBQztJQUVELEtBQUs7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNsQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQTtRQUNqQixPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUE7SUFDekIsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUE7UUFDdEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO0lBQ3ZCLENBQUM7SUFDRCxXQUFXLENBQUMsS0FBYTtRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQTtRQUNyQixPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDbkIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFBO0lBQ3pCLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxLQUFpRDtRQUMxRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUNELFdBQVcsQ0FDUCxDQUEyRCxFQUMzRCxDQUFTLEVBQ1QsQ0FBUztRQUVULElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUNuQixJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDakMsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzFDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLGNBQWM7UUFDZCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUE7UUFFakMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDdkUsQ0FBQztJQUVELElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQTtJQUN0QixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBdUM7UUFDN0MsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzNCLENBQUM7SUFDRCxRQUFRLENBQ0osQ0FBMkQsRUFDM0QsQ0FBVSxFQUNWLENBQVU7O1FBRVYsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ25CLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBRCxDQUFDLGNBQUQsQ0FBQyxHQUFJLENBQUMsRUFBRSxNQUFBLENBQUMsYUFBRCxDQUFDLGNBQUQsQ0FBQyxHQUFJLENBQUMsbUNBQUksQ0FBQyxDQUFDLENBQUE7UUFDN0MsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDWCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDbkIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFBO0lBQzVCLENBQUM7SUFDRCxJQUFJLFdBQVcsQ0FBQyxJQUFzQztRQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM1QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7SUFDdkIsQ0FBQztJQUdELGNBQWMsQ0FDVixDQUE0QyxFQUM1QyxDQUFVLEVBQ1YsQ0FBVSxFQUNWLENBQVU7UUFFVixJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDbkQsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUNuQixPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0IsQ0FDWixjQUFzQixFQUN0QixjQUFzQixFQUN0QixjQUFzQjtRQUV0QixJQUFJLENBQUMsU0FBUyxDQUNWLElBQUksQ0FBQyxZQUFZLEVBQ2pCLGNBQWMsRUFDZCxjQUFjLEVBQ2QsY0FBYyxDQUNqQixDQUFBO1FBQ0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ25CLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVELFlBQVksQ0FBQyxjQUFzQjtRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFBO1FBQ3pELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUNuQixPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRCxZQUFZLENBQUMsY0FBc0I7UUFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQTtRQUN6RCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDbkIsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsWUFBWSxDQUFDLGNBQXNCO1FBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUE7UUFDekQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ25CLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVELGFBQWEsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVU7UUFDNUMsSUFBSSxDQUFDLFFBQVE7YUFDUixZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7YUFDNUIsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO2FBQzVCLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUNuQixPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxHQUFHLFNBQVM7UUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDL0IsQ0FBQztJQUVELFlBQVk7UUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQTtJQUNyQixDQUFDO0NBQ0oifQ==