{"version":3,"file":"index.cjs","sources":["../src/Utils/flatbuffers-json-converter.ts","../src/Utils/ifc-category-map.ts","../src/Utils/event.ts","../src/Utils/async-event.ts","../src/Utils/data-map.ts","../src/Utils/data-set.ts","../../../node_modules/flatbuffers/mjs/constants.js","../../../node_modules/flatbuffers/mjs/utils.js","../../../node_modules/flatbuffers/mjs/encoding.js","../../../node_modules/flatbuffers/mjs/byte-buffer.js","../../../node_modules/flatbuffers/mjs/builder.js","../../../node_modules/pako/dist/pako.esm.mjs","../src/Schema/attribute.ts","../src/Schema/float-vector.ts","../src/Schema/circle-curve.ts","../src/Schema/wire.ts","../src/Schema/wire-set.ts","../src/Schema/axis.ts","../src/Schema/axis-part-class.ts","../src/Schema/big-shell-hole.ts","../src/Schema/big-shell-profile.ts","../src/Schema/bounding-box.ts","../src/Schema/circle-extrusion.ts","../src/Schema/double-vector.ts","../src/Schema/material.ts","../src/Schema/representation.ts","../src/Schema/sample.ts","../src/Schema/shell-hole.ts","../src/Schema/shell-profile.ts","../src/Schema/shell-type.ts","../src/Schema/shell.ts","../src/Schema/transform.ts","../src/Schema/meshes.ts","../src/Schema/relation.ts","../src/Schema/spatial-structure.ts","../src/Schema/model.ts","../src/Schema/rendered-faces.ts","../src/Schema/representation-class.ts","../src/Schema/stroke.ts","../src/Utils/edit/edit-types.ts","../src/Utils/edit/transfom-functions.ts","../src/Utils/edit/misc-functions.ts","../src/Utils/edit/shell-functions.ts","../src/Utils/edit/circle-extrusion-functions.ts","../src/Utils/edit/spatial-structure-functions.ts","../src/Utils/edit/sample-functions.ts","../src/Utils/edit/id-delta-getter.ts","../src/Utils/edit/new-model-function.ts","../src/Utils/edit/edit-function.ts","../src/Utils/edit/fetch-functions.ts","../src/Utils/edit/temp-id-solvers.ts","../src/Utils/edit/id-solver.ts","../src/Utils/edit/request-filterer.ts","../src/Utils/edit/edit-utils.ts","../src/Utils/shells/point.ts","../src/Utils/shells/points.ts","../src/Utils/shells/face.ts","../src/Utils/shells/faces.ts","../src/Utils/shells/edge.ts","../src/Utils/shells/profile.ts","../src/Utils/shells/profiles.ts","../src/Utils/shells/plane.ts","../src/Utils/shells/index.ts","../src/Utils/ifc-utils.ts","../src/Utils/ifc-geometries-map.ts","../src/Utils/ifc-relations-map.ts","../src/Utils/worker-utils.ts","../src/Utils/ifc-splitter/index.ts","../src/FragmentsModels/src/model/model-types.ts","../src/FragmentsModels/src/utils/geometry/planes-utils.ts","../src/FragmentsModels/src/utils/geometry/camera-utils.ts","../../../node_modules/earcut/src/earcut.js","../src/FragmentsModels/src/utils/geometry/section-generator.ts","../src/FragmentsModels/src/utils/misc/crc-data.ts","../src/FragmentsModels/src/utils/misc/int-helper.ts","../src/FragmentsModels/src/utils/misc/crc.ts","../src/FragmentsModels/src/utils/misc/multi-buffer-data.ts","../src/FragmentsModels/src/utils/misc/misc-helper.ts","../src/FragmentsModels/src/utils/misc/gpu.ts","../src/FragmentsModels/src/utils/misc/bit-utils.ts","../src/FragmentsModels/src/utils/geometry/parser-helper.ts","../src/FragmentsModels/src/utils/geometry/transform-helper.ts","../src/FragmentsModels/src/utils/geometry/box-utils.ts","../src/FragmentsModels/src/utils/geometry/face-utils.ts","../src/FragmentsModels/src/model/alignments-manager.ts","../src/FragmentsModels/src/model/setup-manager.ts","../src/FragmentsModels/src/model/box-manager.ts","../src/FragmentsModels/src/model/coordinates-manager.ts","../src/FragmentsModels/src/model/item-attributes.ts","../src/FragmentsModels/src/model/item-relations.ts","../src/FragmentsModels/src/model/item-geometry.ts","../src/FragmentsModels/src/model/item.ts","../src/FragmentsModels/src/model/items-manager.ts","../src/FragmentsModels/src/model/view-manager.ts","../src/FragmentsModels/src/model/raycast-manager.ts","../src/FragmentsModels/src/model/visibility-manager.ts","../src/FragmentsModels/src/lod/lod-shaders.ts","../src/FragmentsModels/src/lod/lod-helper.ts","../src/FragmentsModels/src/lod/lod-mesh.ts","../src/FragmentsModels/src/lod/lod-geometry.ts","../src/FragmentsModels/src/lod/lod-material.ts","../src/FragmentsModels/src/model/material-manager.ts","../src/FragmentsModels/src/model/highlight-manager.ts","../src/FragmentsModels/src/model/section-manager.ts","../src/FragmentsModels/src/model/data-manager.ts","../src/FragmentsModels/src/model/sequence-manager.ts","../src/FragmentsModels/src/edit/edit-helper.ts","../src/FragmentsModels/src/edit/elements-helper.ts","../src/FragmentsModels/src/edit/editor.ts","../src/FragmentsModels/src/edit/element.ts","../src/FragmentsModels/src/model/edit-manager.ts","../src/FragmentsModels/src/model/grids-manager.ts","../src/FragmentsModels/src/model/fragments-model.ts","../src/FragmentsModels/src/model/requests-manager.ts","../src/FragmentsModels/src/model/lod-manager.ts","../src/FragmentsModels/src/model/mesh-manager.ts","../../../node_modules/three-mesh-bvh/src/core/Constants.js","../../../node_modules/three-mesh-bvh/src/utils/ArrayBoxUtilities.js","../../../node_modules/three-mesh-bvh/src/core/utils/nodeBufferUtils.js","../../../node_modules/three-mesh-bvh/src/core/build/computeBoundsUtils.js","../../../node_modules/three-mesh-bvh/src/core/build/splitUtils.js","../../../node_modules/three-mesh-bvh/src/core/BVHNode.js","../../../node_modules/three-mesh-bvh/src/core/build/sortUtils.js","../../../node_modules/three-mesh-bvh/src/core/build/buildUtils.js","../../../node_modules/three-mesh-bvh/src/core/build/buildTree.js","../../../node_modules/three-mesh-bvh/src/utils/PrimitivePool.js","../../../node_modules/three-mesh-bvh/src/core/utils/BufferStack.js","../../../node_modules/three-mesh-bvh/src/core/cast/shapecast.js","../../../node_modules/three-mesh-bvh/src/core/cast/bvhcast.js","../../../node_modules/three-mesh-bvh/src/core/BVH.js","../../../node_modules/three-mesh-bvh/src/utils/BufferUtils.js","../../../node_modules/three-mesh-bvh/src/core/build/geometryUtils.js","../../../node_modules/three-mesh-bvh/src/core/GeometryBVH.js","../../../node_modules/three-mesh-bvh/src/math/SeparatingAxisBounds.js","../../../node_modules/three-mesh-bvh/src/math/MathUtilities.js","../../../node_modules/three-mesh-bvh/src/math/ExtendedTriangle.js","../../../node_modules/three-mesh-bvh/src/math/OrientedBox.js","../../../node_modules/three-mesh-bvh/src/utils/ExtendedTrianglePool.js","../../../node_modules/three-mesh-bvh/src/core/cast/closestPointToPoint.js","../../../node_modules/three-mesh-bvh/src/utils/ThreeRayIntersectUtilities.js","../../../node_modules/three-mesh-bvh/src/utils/TriangleUtilities.js","../../../node_modules/three-mesh-bvh/src/core/utils/iterationUtils.generated.js","../../../node_modules/three-mesh-bvh/src/core/cast/refit.generated.js","../../../node_modules/three-mesh-bvh/src/core/utils/intersectUtils.js","../../../node_modules/three-mesh-bvh/src/core/utils/iterationUtils_indirect.generated.js","../../../node_modules/three-mesh-bvh/src/core/cast/raycast.generated.js","../../../node_modules/three-mesh-bvh/src/core/cast/raycastFirst.generated.js","../../../node_modules/three-mesh-bvh/src/core/cast/intersectsGeometry.generated.js","../../../node_modules/three-mesh-bvh/src/core/cast/closestPointToGeometry.generated.js","../../../node_modules/three-mesh-bvh/src/core/cast/refit_indirect.generated.js","../../../node_modules/three-mesh-bvh/src/core/cast/raycast_indirect.generated.js","../../../node_modules/three-mesh-bvh/src/core/cast/raycastFirst_indirect.generated.js","../../../node_modules/three-mesh-bvh/src/core/cast/intersectsGeometry_indirect.generated.js","../../../node_modules/three-mesh-bvh/src/core/cast/closestPointToGeometry_indirect.generated.js","../../../node_modules/three-mesh-bvh/src/utils/GeometryRayIntersectUtilities.js","../../../node_modules/three-mesh-bvh/src/core/MeshBVH.js","../../../node_modules/three-mesh-bvh/src/utils/ExtensionUtilities.js","../src/FragmentsModels/src/virtual-model/virtual-meshes/virtual-mesh-manager.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/types.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/shell/shell-utils.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/shell/shell-template-constructor.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/shell/types.ts","../src/FragmentsModels/src/utils/geometry/earcut.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/shell/shell-face-x.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/shell/shell-face-4.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/shell/shell-face-3.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/shell/shell-constructor.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/shell/shell-face-raycaster.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/shell/shell-line-raycaster.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/shell/shell-point-raycaster.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/virtual-shell-manager.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/circle-extrusion/vce-caster-utils.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/circle-extrusion/vce-utils.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/circle-extrusion/vce-constructor.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/circle-extrusion/vce-raycaster.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/circle-extrusion/vce-line-raycaster.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/circle-extrusion/vce-point-raycaster.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/circle-extrusion/vce-lod-constructor.ts","../src/FragmentsModels/src/virtual-model/virtual-meshes/virtual-circle-extrusion-manager.ts","../src/FragmentsModels/src/virtual-model/virtual-controllers/item-config-controller.ts","../src/FragmentsModels/src/multithreading/multithreading-helper.ts","../src/FragmentsModels/src/multithreading/mesh-connection.ts","../src/FragmentsModels/src/virtual-model/virtual-controllers/raycast-controller.ts","../../../node_modules/lru-cache/dist/esm/index.js","../src/FragmentsModels/src/virtual-model/virtual-controllers/virtual-memory-controller.ts","../src/FragmentsModels/src/virtual-model/virtual-controllers/virtual-tiles-controller.ts","../src/FragmentsModels/src/utils/geometry/material-utils.ts","../src/FragmentsModels/src/virtual-model/virtual-controllers/virtual-material-controller.ts","../src/FragmentsModels/src/virtual-model/virtual-controllers/virtual-properties-controller.ts","../src/FragmentsModels/src/virtual-model/virtual-controllers/alignments-controller.ts","../src/FragmentsModels/src/virtual-model/virtual-controllers/virtual-template-controller.ts","../src/FragmentsModels/src/bounding-boxes/virtual-box.ts","../src/FragmentsModels/src/bounding-boxes/virtual-spatial-point.ts","../src/FragmentsModels/src/bounding-boxes/virtual-box-compressor.ts","../src/FragmentsModels/src/bounding-boxes/virtual-box-collider.ts","../src/FragmentsModels/src/bounding-boxes/virtual-box-sorter.ts","../src/FragmentsModels/src/bounding-boxes/virtual-box-maker.ts","../src/FragmentsModels/src/bounding-boxes/virtual-box-structure.ts","../src/FragmentsModels/src/bounding-boxes/virtual-box-controller.ts","../src/FragmentsModels/src/virtual-model/virtual-helpers/raycast-helper.ts","../src/FragmentsModels/src/virtual-model/virtual-helpers/coordinates-helper.ts","../src/FragmentsModels/src/virtual-model/virtual-helpers/highlight-helper.ts","../src/FragmentsModels/src/virtual-model/virtual-helpers/visibility-helper.ts","../src/FragmentsModels/src/virtual-model/virtual-helpers/geometry-helper.ts","../src/FragmentsModels/src/virtual-model/virtual-helpers/section-helper.ts","../src/FragmentsModels/src/virtual-model/virtual-helpers/sequence-helper.ts","../src/FragmentsModels/src/virtual-model/virtual-helpers/items-helper.ts","../src/FragmentsModels/src/virtual-model/virtual-controllers/grids-controller.ts","../src/FragmentsModels/src/virtual-model/virtual-fragments-model.ts","../src/FragmentsModels/src/single-threading/index.ts","../src/FragmentsModels/src/multithreading/connection-handlers.ts","../src/FragmentsModels/src/multithreading/connection.ts","../src/FragmentsModels/src/multithreading/threads-data.ts","../src/FragmentsModels/src/multithreading/fragments-connection.ts","../src/FragmentsModels/index.ts","../src/Importers/IfcImporter/src/properties/property-processor.ts","../src/Importers/IfcImporter/src/geometry/ifc/civil-reader.ts","../src/Importers/IfcImporter/src/geometry/grid-reader.ts","../src/Importers/IfcImporter/src/geometry/space-boundary-reader.ts","../src/Importers/IfcImporter/src/geometry/ifc-file-reader.ts","../src/Importers/IfcImporter/src/geometry/index.ts","../src/Importers/IfcImporter/src/classes.ts","../src/Importers/IfcImporter/index.ts","../src/GeometryEngine/src/extrusion.ts","../src/GeometryEngine/src/profile.ts","../src/GeometryEngine/src/boolean-operation.ts","../src/GeometryEngine/src/arc.ts","../src/GeometryEngine/src/bbox.ts","../src/GeometryEngine/src/circular-sweep.ts","../src/GeometryEngine/src/cylindrical-revolve.ts","../src/GeometryEngine/src/parabola.ts","../src/GeometryEngine/src/revolve.ts","../src/GeometryEngine/src/sweep.ts","../src/GeometryEngine/src/wall.ts","../src/GeometryEngine/src/clothoid.ts","../src/GeometryEngine/index.ts"],"sourcesContent":["/**\r\n * Recursively converts a Flatbuffers object into a plain JavaScript object. This function traverses the prototype chain of the Flatbuffers object and extracts all properties and their values, handling both primitive values and nested objects/arrays.\r\n */\r\nexport function getObject(obj: any, result: any) {\r\n  const proto = Object.getPrototypeOf(obj);\r\n  const propNames = Object.getOwnPropertyNames(proto);\r\n\r\n  for (const name of propNames) {\r\n    if (name === \"constructor\" || name === \"__init\") continue;\r\n\r\n    if (name.includes(\"mutate_\")) continue;\r\n    if (name.match(/.*Array$/)) continue;\r\n\r\n    const value = proto[name];\r\n\r\n    if (typeof value === \"function\") {\r\n      const isArray =\r\n        obj[`${name}Length`] !== undefined && obj[`${name}Array`] !== undefined;\r\n      if (value.length === 2 || isArray) {\r\n        // This is an array\r\n        const lengthName = `${name}Length`;\r\n        const length = obj[lengthName]();\r\n        const array: any[] = [];\r\n        result[name] = array;\r\n        for (let i = 0; i < length; i++) {\r\n          const found = obj[name](i);\r\n          if (typeof found === \"object\" && found !== null && \"bb\" in found) {\r\n            const object: any = {};\r\n            getObject(found, object);\r\n            array.push(object);\r\n          } else {\r\n            array.push(found);\r\n          }\r\n        }\r\n        continue;\r\n      }\r\n\r\n      const found = obj[name]();\r\n\r\n      if (typeof found !== \"object\" || found === null) {\r\n        // console.log(name, found);\r\n        result[name] = found;\r\n        continue;\r\n      }\r\n\r\n      result[name] = {};\r\n      getObject(found, result[name]);\r\n    } else {\r\n      // console.log(name, value);\r\n      result[name] = value;\r\n    }\r\n  }\r\n}\r\n","/**\r\n * A map that associates each unique integer identifier (IFC Entity ID) with its corresponding category name. This map is used to map IFC entities to their respective categories for easier identification and processing.\r\n */\r\nexport const ifcCategoryMap: { [key: number]: string } = {\r\n  950732822: \"IFCURIREFERENCE\",\r\n  4075327185: \"IFCTIME\",\r\n  1209108979: \"IFCTEMPERATURERATEOFCHANGEMEASURE\",\r\n  3457685358: \"IFCSOUNDPRESSURELEVELMEASURE\",\r\n  4157543285: \"IFCSOUNDPOWERLEVELMEASURE\",\r\n  2798247006: \"IFCPROPERTYSETDEFINITIONSET\",\r\n  1790229001: \"IFCPOSITIVEINTEGER\",\r\n  525895558: \"IFCNONNEGATIVELENGTHMEASURE\",\r\n  1774176899: \"IFCLINEINDEX\",\r\n  1275358634: \"IFCLANGUAGEID\",\r\n  2541165894: \"IFCDURATION\",\r\n  3701338814: \"IFCDAYINWEEKNUMBER\",\r\n  2195413836: \"IFCDATETIME\",\r\n  937566702: \"IFCDATE\",\r\n  1683019596: \"IFCCARDINALPOINTREFERENCE\",\r\n  2314439260: \"IFCBINARY\",\r\n  1500781891: \"IFCAREADENSITYMEASURE\",\r\n  3683503648: \"IFCARCINDEX\",\r\n  4065007721: \"IFCYEARNUMBER\",\r\n  1718600412: \"IFCWARPINGMOMENTMEASURE\",\r\n  51269191: \"IFCWARPINGCONSTANTMEASURE\",\r\n  2593997549: \"IFCVOLUMETRICFLOWRATEMEASURE\",\r\n  3458127941: \"IFCVOLUMEMEASURE\",\r\n  3345633955: \"IFCVAPORPERMEABILITYMEASURE\",\r\n  1278329552: \"IFCTORQUEMEASURE\",\r\n  2591213694: \"IFCTIMESTAMP\",\r\n  2726807636: \"IFCTIMEMEASURE\",\r\n  743184107: \"IFCTHERMODYNAMICTEMPERATUREMEASURE\",\r\n  2016195849: \"IFCTHERMALTRANSMITTANCEMEASURE\",\r\n  857959152: \"IFCTHERMALRESISTANCEMEASURE\",\r\n  2281867870: \"IFCTHERMALEXPANSIONCOEFFICIENTMEASURE\",\r\n  2645777649: \"IFCTHERMALCONDUCTIVITYMEASURE\",\r\n  232962298: \"IFCTHERMALADMITTANCEMEASURE\",\r\n  296282323: \"IFCTEXTTRANSFORMATION\",\r\n  603696268: \"IFCTEXTFONTNAME\",\r\n  3490877962: \"IFCTEXTDECORATION\",\r\n  1460886941: \"IFCTEXTALIGNMENT\",\r\n  2801250643: \"IFCTEXT\",\r\n  58845555: \"IFCTEMPERATUREGRADIENTMEASURE\",\r\n  361837227: \"IFCSPECULARROUGHNESS\",\r\n  2757832317: \"IFCSPECULAREXPONENT\",\r\n  3477203348: \"IFCSPECIFICHEATCAPACITYMEASURE\",\r\n  993287707: \"IFCSOUNDPRESSUREMEASURE\",\r\n  846465480: \"IFCSOUNDPOWERMEASURE\",\r\n  3471399674: \"IFCSOLIDANGLEMEASURE\",\r\n  408310005: \"IFCSHEARMODULUSMEASURE\",\r\n  2190458107: \"IFCSECTIONALAREAINTEGRALMEASURE\",\r\n  3467162246: \"IFCSECTIONMODULUSMEASURE\",\r\n  2766185779: \"IFCSECONDINMINUTE\",\r\n  3211557302: \"IFCROTATIONALSTIFFNESSMEASURE\",\r\n  1755127002: \"IFCROTATIONALMASSMEASURE\",\r\n  2133746277: \"IFCROTATIONALFREQUENCYMEASURE\",\r\n  200335297: \"IFCREAL\",\r\n  96294661: \"IFCRATIOMEASURE\",\r\n  3972513137: \"IFCRADIOACTIVITYMEASURE\",\r\n  3665567075: \"IFCPRESSUREMEASURE\",\r\n  2169031380: \"IFCPRESENTABLETEXT\",\r\n  1364037233: \"IFCPOWERMEASURE\",\r\n  1245737093: \"IFCPOSITIVERATIOMEASURE\",\r\n  3054510233: \"IFCPOSITIVEPLANEANGLEMEASURE\",\r\n  2815919920: \"IFCPOSITIVELENGTHMEASURE\",\r\n  4042175685: \"IFCPLANEANGLEMEASURE\",\r\n  2642773653: \"IFCPLANARFORCEMEASURE\",\r\n  2260317790: \"IFCPARAMETERVALUE\",\r\n  929793134: \"IFCPHMEASURE\",\r\n  2395907400: \"IFCNUMERICMEASURE\",\r\n  2095195183: \"IFCNORMALISEDRATIOMEASURE\",\r\n  765770214: \"IFCMONTHINYEARNUMBER\",\r\n  2615040989: \"IFCMONETARYMEASURE\",\r\n  3114022597: \"IFCMOMENTOFINERTIAMEASURE\",\r\n  1648970520: \"IFCMOLECULARWEIGHTMEASURE\",\r\n  3177669450: \"IFCMOISTUREDIFFUSIVITYMEASURE\",\r\n  1753493141: \"IFCMODULUSOFSUBGRADEREACTIONMEASURE\",\r\n  1052454078: \"IFCMODULUSOFROTATIONALSUBGRADEREACTIONMEASURE\",\r\n  2173214787: \"IFCMODULUSOFLINEARSUBGRADEREACTIONMEASURE\",\r\n  3341486342: \"IFCMODULUSOFELASTICITYMEASURE\",\r\n  102610177: \"IFCMINUTEINHOUR\",\r\n  3531705166: \"IFCMASSPERLENGTHMEASURE\",\r\n  3124614049: \"IFCMASSMEASURE\",\r\n  4017473158: \"IFCMASSFLOWRATEMEASURE\",\r\n  1477762836: \"IFCMASSDENSITYMEASURE\",\r\n  2486716878: \"IFCMAGNETICFLUXMEASURE\",\r\n  286949696: \"IFCMAGNETICFLUXDENSITYMEASURE\",\r\n  151039812: \"IFCLUMINOUSINTENSITYMEASURE\",\r\n  2755797622: \"IFCLUMINOUSINTENSITYDISTRIBUTIONMEASURE\",\r\n  2095003142: \"IFCLUMINOUSFLUXMEASURE\",\r\n  503418787: \"IFCLOGICAL\",\r\n  3086160713: \"IFCLINEARVELOCITYMEASURE\",\r\n  1307019551: \"IFCLINEARSTIFFNESSMEASURE\",\r\n  2128979029: \"IFCLINEARMOMENTMEASURE\",\r\n  191860431: \"IFCLINEARFORCEMEASURE\",\r\n  1243674935: \"IFCLENGTHMEASURE\",\r\n  3258342251: \"IFCLABEL\",\r\n  2054016361: \"IFCKINEMATICVISCOSITYMEASURE\",\r\n  3192672207: \"IFCISOTHERMALMOISTURECAPACITYMEASURE\",\r\n  3686016028: \"IFCIONCONCENTRATIONMEASURE\",\r\n  3809634241: \"IFCINTEGERCOUNTRATEMEASURE\",\r\n  1939436016: \"IFCINTEGER\",\r\n  2679005408: \"IFCINDUCTANCEMEASURE\",\r\n  3358199106: \"IFCILLUMINANCEMEASURE\",\r\n  983778844: \"IFCIDENTIFIER\",\r\n  2589826445: \"IFCHOURINDAY\",\r\n  1158859006: \"IFCHEATINGVALUEMEASURE\",\r\n  3113092358: \"IFCHEATFLUXDENSITYMEASURE\",\r\n  3064340077: \"IFCGLOBALLYUNIQUEID\",\r\n  3044325142: \"IFCFREQUENCYMEASURE\",\r\n  1361398929: \"IFCFORCEMEASURE\",\r\n  2590844177: \"IFCFONTWEIGHT\",\r\n  2715512545: \"IFCFONTVARIANT\",\r\n  1102727119: \"IFCFONTSTYLE\",\r\n  2078135608: \"IFCENERGYMEASURE\",\r\n  2506197118: \"IFCELECTRICVOLTAGEMEASURE\",\r\n  2951915441: \"IFCELECTRICRESISTANCEMEASURE\",\r\n  3790457270: \"IFCELECTRICCURRENTMEASURE\",\r\n  2093906313: \"IFCELECTRICCONDUCTANCEMEASURE\",\r\n  3818826038: \"IFCELECTRICCHARGEMEASURE\",\r\n  1827137117: \"IFCELECTRICCAPACITANCEMEASURE\",\r\n  69416015: \"IFCDYNAMICVISCOSITYMEASURE\",\r\n  524656162: \"IFCDOSEEQUIVALENTMEASURE\",\r\n  4134073009: \"IFCDIMENSIONCOUNT\",\r\n  1514641115: \"IFCDESCRIPTIVEMEASURE\",\r\n  300323983: \"IFCDAYLIGHTSAVINGHOUR\",\r\n  86635668: \"IFCDAYINMONTHNUMBER\",\r\n  94842927: \"IFCCURVATUREMEASURE\",\r\n  1778710042: \"IFCCOUNTMEASURE\",\r\n  3238673880: \"IFCCONTEXTDEPENDENTMEASURE\",\r\n  3812528620: \"IFCCOMPOUNDPLANEANGLEMEASURE\",\r\n  2991860651: \"IFCCOMPLEXNUMBER\",\r\n  1867003952: \"IFCBOXALIGNMENT\",\r\n  2735952531: \"IFCBOOLEAN\",\r\n  2650437152: \"IFCAREAMEASURE\",\r\n  632304761: \"IFCANGULARVELOCITYMEASURE\",\r\n  360377573: \"IFCAMOUNTOFSUBSTANCEMEASURE\",\r\n  4182062534: \"IFCACCELERATIONMEASURE\",\r\n  3699917729: \"IFCABSORBEDDOSEMEASURE\",\r\n  1971632696: \"IFCGEOSLICE\",\r\n  2680139844: \"IFCGEOMODEL\",\r\n  24726584: \"IFCELECTRICFLOWTREATMENTDEVICE\",\r\n  3693000487: \"IFCDISTRIBUTIONBOARD\",\r\n  3460952963: \"IFCCONVEYORSEGMENT\",\r\n  3999819293: \"IFCCAISSONFOUNDATION\",\r\n  3314249567: \"IFCBOREHOLE\",\r\n  4196446775: \"IFCBEARING\",\r\n  325726236: \"IFCALIGNMENT\",\r\n  3425753595: \"IFCTRACKELEMENT\",\r\n  991950508: \"IFCSIGNAL\",\r\n  3798194928: \"IFCREINFORCEDSOIL\",\r\n  3290496277: \"IFCRAIL\",\r\n  1383356374: \"IFCPAVEMENT\",\r\n  2182337498: \"IFCNAVIGATIONELEMENT\",\r\n  234836483: \"IFCMOORINGDEVICE\",\r\n  2078563270: \"IFCMOBILETELECOMMUNICATIONSAPPLIANCE\",\r\n  1638804497: \"IFCLIQUIDTERMINAL\",\r\n  1154579445: \"IFCLINEARPOSITIONINGELEMENT\",\r\n  2696325953: \"IFCKERB\",\r\n  2713699986: \"IFCGEOTECHNICALASSEMBLY\",\r\n  2142170206: \"IFCELECTRICFLOWTREATMENTDEVICETYPE\",\r\n  3376911765: \"IFCEARTHWORKSFILL\",\r\n  1077100507: \"IFCEARTHWORKSELEMENT\",\r\n  3071239417: \"IFCEARTHWORKSCUT\",\r\n  479945903: \"IFCDISTRIBUTIONBOARDTYPE\",\r\n  3426335179: \"IFCDEEPFOUNDATION\",\r\n  1502416096: \"IFCCOURSE\",\r\n  2940368186: \"IFCCONVEYORSEGMENTTYPE\",\r\n  3203706013: \"IFCCAISSONFOUNDATIONTYPE\",\r\n  3862327254: \"IFCBUILTSYSTEM\",\r\n  1876633798: \"IFCBUILTELEMENT\",\r\n  963979645: \"IFCBRIDGEPART\",\r\n  644574406: \"IFCBRIDGE\",\r\n  3649138523: \"IFCBEARINGTYPE\",\r\n  1662888072: \"IFCALIGNMENTVERTICAL\",\r\n  317615605: \"IFCALIGNMENTSEGMENT\",\r\n  1545765605: \"IFCALIGNMENTHORIZONTAL\",\r\n  4266260250: \"IFCALIGNMENTCANT\",\r\n  3956297820: \"IFCVIBRATIONDAMPERTYPE\",\r\n  1530820697: \"IFCVIBRATIONDAMPER\",\r\n  840318589: \"IFCVEHICLE\",\r\n  1953115116: \"IFCTRANSPORTATIONDEVICE\",\r\n  618700268: \"IFCTRACKELEMENTTYPE\",\r\n  2281632017: \"IFCTENDONCONDUITTYPE\",\r\n  3663046924: \"IFCTENDONCONDUIT\",\r\n  42703149: \"IFCSINESPIRAL\",\r\n  1894708472: \"IFCSIGNALTYPE\",\r\n  3599934289: \"IFCSIGNTYPE\",\r\n  33720170: \"IFCSIGN\",\r\n  1027922057: \"IFCSEVENTHORDERPOLYNOMIALSPIRAL\",\r\n  544395925: \"IFCSEGMENTEDREFERENCECURVE\",\r\n  3649235739: \"IFCSECONDORDERPOLYNOMIALSPIRAL\",\r\n  550521510: \"IFCROADPART\",\r\n  146592293: \"IFCROAD\",\r\n  3818125796: \"IFCRELADHERESTOELEMENT\",\r\n  4021432810: \"IFCREFERENT\",\r\n  1891881377: \"IFCRAILWAYPART\",\r\n  3992365140: \"IFCRAILWAY\",\r\n  1763565496: \"IFCRAILTYPE\",\r\n  1946335990: \"IFCPOSITIONINGELEMENT\",\r\n  514975943: \"IFCPAVEMENTTYPE\",\r\n  506776471: \"IFCNAVIGATIONELEMENTTYPE\",\r\n  710110818: \"IFCMOORINGDEVICETYPE\",\r\n  1950438474: \"IFCMOBILETELECOMMUNICATIONSAPPLIANCETYPE\",\r\n  976884017: \"IFCMARINEPART\",\r\n  525669439: \"IFCMARINEFACILITY\",\r\n  1770583370: \"IFCLIQUIDTERMINALTYPE\",\r\n  2176059722: \"IFCLINEARELEMENT\",\r\n  679976338: \"IFCKERBTYPE\",\r\n  3948183225: \"IFCIMPACTPROTECTIONDEVICETYPE\",\r\n  2568555532: \"IFCIMPACTPROTECTIONDEVICE\",\r\n  2898700619: \"IFCGRADIENTCURVE\",\r\n  1594536857: \"IFCGEOTECHNICALSTRATUM\",\r\n  4230923436: \"IFCGEOTECHNICALELEMENT\",\r\n  4228831410: \"IFCFACILITYPARTCOMMON\",\r\n  1310830890: \"IFCFACILITYPART\",\r\n  24185140: \"IFCFACILITY\",\r\n  4234616927: \"IFCDIRECTRIXDERIVEDREFERENCESWEPTAREASOLID\",\r\n  1306400036: \"IFCDEEPFOUNDATIONTYPE\",\r\n  4189326743: \"IFCCOURSETYPE\",\r\n  2000195564: \"IFCCOSINESPIRAL\",\r\n  3497074424: \"IFCCLOTHOID\",\r\n  1626504194: \"IFCBUILTELEMENTTYPE\",\r\n  3651464721: \"IFCVEHICLETYPE\",\r\n  1229763772: \"IFCTRIANGULATEDIRREGULARNETWORK\",\r\n  3665877780: \"IFCTRANSPORTATIONDEVICETYPE\",\r\n  782932809: \"IFCTHIRDORDERPOLYNOMIALSPIRAL\",\r\n  2735484536: \"IFCSPIRAL\",\r\n  1356537516: \"IFCSECTIONEDSURFACE\",\r\n  1290935644: \"IFCSECTIONEDSOLIDHORIZONTAL\",\r\n  1862484736: \"IFCSECTIONEDSOLID\",\r\n  1441486842: \"IFCRELPOSITIONS\",\r\n  1033248425: \"IFCRELASSOCIATESPROFILEDEF\",\r\n  3381221214: \"IFCPOLYNOMIALCURVE\",\r\n  2485787929: \"IFCOFFSETCURVEBYDISTANCES\",\r\n  590820931: \"IFCOFFSETCURVE\",\r\n  3465909080: \"IFCINDEXEDPOLYGONALTEXTUREMAP\",\r\n  593015953: \"IFCDIRECTRIXCURVESWEPTAREASOLID\",\r\n  4212018352: \"IFCCURVESEGMENT\",\r\n  3425423356: \"IFCAXIS2PLACEMENTLINEAR\",\r\n  823603102: \"IFCSEGMENT\",\r\n  2165702409: \"IFCPOINTBYDISTANCEEXPRESSION\",\r\n  182550632: \"IFCOPENCROSSPROFILEDEF\",\r\n  388784114: \"IFCLINEARPLACEMENT\",\r\n  536804194: \"IFCALIGNMENTHORIZONTALSEGMENT\",\r\n  3752311538: \"IFCALIGNMENTCANTSEGMENT\",\r\n  1010789467: \"IFCTEXTURECOORDINATEINDICESWITHVOIDS\",\r\n  222769930: \"IFCTEXTURECOORDINATEINDICES\",\r\n  2691318326: \"IFCQUANTITYNUMBER\",\r\n  3633395639: \"IFCALIGNMENTVERTICALSEGMENT\",\r\n  2879124712: \"IFCALIGNMENTPARAMETERSEGMENT\",\r\n  25142252: \"IFCCONTROLLER\",\r\n  3087945054: \"IFCALARM\",\r\n  4288193352: \"IFCACTUATOR\",\r\n  630975310: \"IFCUNITARYCONTROLELEMENT\",\r\n  4086658281: \"IFCSENSOR\",\r\n  2295281155: \"IFCPROTECTIVEDEVICETRIPPINGUNIT\",\r\n  182646315: \"IFCFLOWINSTRUMENT\",\r\n  1426591983: \"IFCFIRESUPPRESSIONTERMINAL\",\r\n  819412036: \"IFCFILTER\",\r\n  3415622556: \"IFCFAN\",\r\n  1003880860: \"IFCELECTRICTIMECONTROL\",\r\n  402227799: \"IFCELECTRICMOTOR\",\r\n  264262732: \"IFCELECTRICGENERATOR\",\r\n  3310460725: \"IFCELECTRICFLOWSTORAGEDEVICE\",\r\n  862014818: \"IFCELECTRICDISTRIBUTIONBOARD\",\r\n  1904799276: \"IFCELECTRICAPPLIANCE\",\r\n  1360408905: \"IFCDUCTSILENCER\",\r\n  3518393246: \"IFCDUCTSEGMENT\",\r\n  342316401: \"IFCDUCTFITTING\",\r\n  562808652: \"IFCDISTRIBUTIONCIRCUIT\",\r\n  4074379575: \"IFCDAMPER\",\r\n  3640358203: \"IFCCOOLINGTOWER\",\r\n  4136498852: \"IFCCOOLEDBEAM\",\r\n  2272882330: \"IFCCONDENSER\",\r\n  3571504051: \"IFCCOMPRESSOR\",\r\n  3221913625: \"IFCCOMMUNICATIONSAPPLIANCE\",\r\n  639361253: \"IFCCOIL\",\r\n  3902619387: \"IFCCHILLER\",\r\n  4217484030: \"IFCCABLESEGMENT\",\r\n  1051757585: \"IFCCABLEFITTING\",\r\n  3758799889: \"IFCCABLECARRIERSEGMENT\",\r\n  635142910: \"IFCCABLECARRIERFITTING\",\r\n  2938176219: \"IFCBURNER\",\r\n  32344328: \"IFCBOILER\",\r\n  2906023776: \"IFCBEAMSTANDARDCASE\",\r\n  277319702: \"IFCAUDIOVISUALAPPLIANCE\",\r\n  2056796094: \"IFCAIRTOAIRHEATRECOVERY\",\r\n  177149247: \"IFCAIRTERMINALBOX\",\r\n  1634111441: \"IFCAIRTERMINAL\",\r\n  486154966: \"IFCWINDOWSTANDARDCASE\",\r\n  4237592921: \"IFCWASTETERMINAL\",\r\n  4156078855: \"IFCWALLELEMENTEDCASE\",\r\n  4207607924: \"IFCVALVE\",\r\n  4292641817: \"IFCUNITARYEQUIPMENT\",\r\n  3179687236: \"IFCUNITARYCONTROLELEMENTTYPE\",\r\n  3026737570: \"IFCTUBEBUNDLE\",\r\n  3825984169: \"IFCTRANSFORMER\",\r\n  812556717: \"IFCTANK\",\r\n  1162798199: \"IFCSWITCHINGDEVICE\",\r\n  385403989: \"IFCSTRUCTURALLOADCASE\",\r\n  1404847402: \"IFCSTACKTERMINAL\",\r\n  1999602285: \"IFCSPACEHEATER\",\r\n  3420628829: \"IFCSOLARDEVICE\",\r\n  3027962421: \"IFCSLABSTANDARDCASE\",\r\n  3127900445: \"IFCSLABELEMENTEDCASE\",\r\n  1329646415: \"IFCSHADINGDEVICE\",\r\n  3053780830: \"IFCSANITARYTERMINAL\",\r\n  2572171363: \"IFCREINFORCINGBARTYPE\",\r\n  1232101972: \"IFCRATIONALBSPLINECURVEWITHKNOTS\",\r\n  90941305: \"IFCPUMP\",\r\n  655969474: \"IFCPROTECTIVEDEVICETRIPPINGUNITTYPE\",\r\n  738039164: \"IFCPROTECTIVEDEVICE\",\r\n  1156407060: \"IFCPLATESTANDARDCASE\",\r\n  3612865200: \"IFCPIPESEGMENT\",\r\n  310824031: \"IFCPIPEFITTING\",\r\n  3694346114: \"IFCOUTLET\",\r\n  144952367: \"IFCOUTERBOUNDARYCURVE\",\r\n  2474470126: \"IFCMOTORCONNECTION\",\r\n  1911478936: \"IFCMEMBERSTANDARDCASE\",\r\n  1437502449: \"IFCMEDICALDEVICE\",\r\n  629592764: \"IFCLIGHTFIXTURE\",\r\n  76236018: \"IFCLAMP\",\r\n  2176052936: \"IFCJUNCTIONBOX\",\r\n  4175244083: \"IFCINTERCEPTOR\",\r\n  2068733104: \"IFCHUMIDIFIER\",\r\n  3319311131: \"IFCHEATEXCHANGER\",\r\n  2188021234: \"IFCFLOWMETER\",\r\n  1209101575: \"IFCEXTERNALSPATIALELEMENT\",\r\n  484807127: \"IFCEVAPORATOR\",\r\n  3747195512: \"IFCEVAPORATIVECOOLER\",\r\n  2814081492: \"IFCENGINE\",\r\n  2417008758: \"IFCELECTRICDISTRIBUTIONBOARDTYPE\",\r\n  3242481149: \"IFCDOORSTANDARDCASE\",\r\n  3205830791: \"IFCDISTRIBUTIONSYSTEM\",\r\n  400855858: \"IFCCOMMUNICATIONSAPPLIANCETYPE\",\r\n  905975707: \"IFCCOLUMNSTANDARDCASE\",\r\n  1677625105: \"IFCCIVILELEMENT\",\r\n  3296154744: \"IFCCHIMNEY\",\r\n  2674252688: \"IFCCABLEFITTINGTYPE\",\r\n  2188180465: \"IFCBURNERTYPE\",\r\n  1177604601: \"IFCBUILDINGSYSTEM\",\r\n  39481116: \"IFCBUILDINGELEMENTPARTTYPE\",\r\n  1136057603: \"IFCBOUNDARYCURVE\",\r\n  2461110595: \"IFCBSPLINECURVEWITHKNOTS\",\r\n  1532957894: \"IFCAUDIOVISUALAPPLIANCETYPE\",\r\n  4088093105: \"IFCWORKCALENDAR\",\r\n  4009809668: \"IFCWINDOWTYPE\",\r\n  926996030: \"IFCVOIDINGFEATURE\",\r\n  2391383451: \"IFCVIBRATIONISOLATOR\",\r\n  2415094496: \"IFCTENDONTYPE\",\r\n  3081323446: \"IFCTENDONANCHORTYPE\",\r\n  413509423: \"IFCSYSTEMFURNITUREELEMENT\",\r\n  3101698114: \"IFCSURFACEFEATURE\",\r\n  3657597509: \"IFCSTRUCTURALSURFACEACTION\",\r\n  2757150158: \"IFCSTRUCTURALCURVEREACTION\",\r\n  1004757350: \"IFCSTRUCTURALCURVEACTION\",\r\n  338393293: \"IFCSTAIRTYPE\",\r\n  1072016465: \"IFCSOLARDEVICETYPE\",\r\n  4074543187: \"IFCSHADINGDEVICETYPE\",\r\n  2157484638: \"IFCSEAMCURVE\",\r\n  2781568857: \"IFCROOFTYPE\",\r\n  2310774935: \"IFCREINFORCINGMESHTYPE\",\r\n  964333572: \"IFCREINFORCINGELEMENTTYPE\",\r\n  683857671: \"IFCRATIONALBSPLINESURFACEWITHKNOTS\",\r\n  1469900589: \"IFCRAMPTYPE\",\r\n  2839578677: \"IFCPOLYGONALFACESET\",\r\n  1158309216: \"IFCPILETYPE\",\r\n  3079942009: \"IFCOPENINGSTANDARDCASE\",\r\n  1114901282: \"IFCMEDICALDEVICETYPE\",\r\n  3113134337: \"IFCINTERSECTIONCURVE\",\r\n  3946677679: \"IFCINTERCEPTORTYPE\",\r\n  2571569899: \"IFCINDEXEDPOLYCURVE\",\r\n  3493046030: \"IFCGEOGRAPHICELEMENT\",\r\n  1509553395: \"IFCFURNITURE\",\r\n  1893162501: \"IFCFOOTINGTYPE\",\r\n  2853485674: \"IFCEXTERNALSPATIALSTRUCTUREELEMENT\",\r\n  4148101412: \"IFCEVENT\",\r\n  132023988: \"IFCENGINETYPE\",\r\n  2397081782: \"IFCELEMENTASSEMBLYTYPE\",\r\n  2323601079: \"IFCDOORTYPE\",\r\n  1213902940: \"IFCCYLINDRICALSURFACE\",\r\n  1525564444: \"IFCCONSTRUCTIONPRODUCTRESOURCETYPE\",\r\n  4105962743: \"IFCCONSTRUCTIONMATERIALRESOURCETYPE\",\r\n  2185764099: \"IFCCONSTRUCTIONEQUIPMENTRESOURCETYPE\",\r\n  15328376: \"IFCCOMPOSITECURVEONSURFACE\",\r\n  3875453745: \"IFCCOMPLEXPROPERTYTEMPLATE\",\r\n  3893394355: \"IFCCIVILELEMENTTYPE\",\r\n  2197970202: \"IFCCHIMNEYTYPE\",\r\n  167062518: \"IFCBSPLINESURFACEWITHKNOTS\",\r\n  2887950389: \"IFCBSPLINESURFACE\",\r\n  2603310189: \"IFCADVANCEDBREPWITHVOIDS\",\r\n  1635779807: \"IFCADVANCEDBREP\",\r\n  2916149573: \"IFCTRIANGULATEDFACESET\",\r\n  1935646853: \"IFCTOROIDALSURFACE\",\r\n  2387106220: \"IFCTESSELLATEDFACESET\",\r\n  3206491090: \"IFCTASKTYPE\",\r\n  699246055: \"IFCSURFACECURVE\",\r\n  4095615324: \"IFCSUBCONTRACTRESOURCETYPE\",\r\n  603775116: \"IFCSTRUCTURALSURFACEREACTION\",\r\n  4015995234: \"IFCSPHERICALSURFACE\",\r\n  2481509218: \"IFCSPATIALZONETYPE\",\r\n  463610769: \"IFCSPATIALZONE\",\r\n  710998568: \"IFCSPATIALELEMENTTYPE\",\r\n  1412071761: \"IFCSPATIALELEMENT\",\r\n  3663146110: \"IFCSIMPLEPROPERTYTEMPLATE\",\r\n  3243963512: \"IFCREVOLVEDAREASOLIDTAPERED\",\r\n  816062949: \"IFCREPARAMETRISEDCOMPOSITECURVESEGMENT\",\r\n  1521410863: \"IFCRELSPACEBOUNDARY2NDLEVEL\",\r\n  3523091289: \"IFCRELSPACEBOUNDARY1STLEVEL\",\r\n  427948657: \"IFCRELINTERFERESELEMENTS\",\r\n  307848117: \"IFCRELDEFINESBYTEMPLATE\",\r\n  1462361463: \"IFCRELDEFINESBYOBJECT\",\r\n  2565941209: \"IFCRELDECLARES\",\r\n  1027710054: \"IFCRELASSIGNSTOGROUPBYFACTOR\",\r\n  3521284610: \"IFCPROPERTYTEMPLATE\",\r\n  492091185: \"IFCPROPERTYSETTEMPLATE\",\r\n  653396225: \"IFCPROJECTLIBRARY\",\r\n  569719735: \"IFCPROCEDURETYPE\",\r\n  3967405729: \"IFCPREDEFINEDPROPERTYSET\",\r\n  1682466193: \"IFCPCURVE\",\r\n  428585644: \"IFCLABORRESOURCETYPE\",\r\n  2294589976: \"IFCINDEXEDPOLYGONALFACEWITHVOIDS\",\r\n  178912537: \"IFCINDEXEDPOLYGONALFACE\",\r\n  4095422895: \"IFCGEOGRAPHICELEMENTTYPE\",\r\n  2652556860: \"IFCFIXEDREFERENCESWEPTAREASOLID\",\r\n  2804161546: \"IFCEXTRUDEDAREASOLIDTAPERED\",\r\n  4024345920: \"IFCEVENTTYPE\",\r\n  2629017746: \"IFCCURVEBOUNDEDSURFACE\",\r\n  1815067380: \"IFCCREWRESOURCETYPE\",\r\n  3419103109: \"IFCCONTEXT\",\r\n  2574617495: \"IFCCONSTRUCTIONRESOURCETYPE\",\r\n  2059837836: \"IFCCARTESIANPOINTLIST3D\",\r\n  1675464909: \"IFCCARTESIANPOINTLIST2D\",\r\n  574549367: \"IFCCARTESIANPOINTLIST\",\r\n  3406155212: \"IFCADVANCEDFACE\",\r\n  3698973494: \"IFCTYPERESOURCE\",\r\n  3736923433: \"IFCTYPEPROCESS\",\r\n  901063453: \"IFCTESSELLATEDITEM\",\r\n  1096409881: \"IFCSWEPTDISKSOLIDPOLYGONAL\",\r\n  1042787934: \"IFCRESOURCETIME\",\r\n  1608871552: \"IFCRESOURCECONSTRAINTRELATIONSHIP\",\r\n  2943643501: \"IFCRESOURCEAPPROVALRELATIONSHIP\",\r\n  2090586900: \"IFCQUANTITYSET\",\r\n  1482703590: \"IFCPROPERTYTEMPLATEDEFINITION\",\r\n  3778827333: \"IFCPREDEFINEDPROPERTIES\",\r\n  2998442950: \"IFCMIRROREDPROFILEDEF\",\r\n  853536259: \"IFCMATERIALRELATIONSHIP\",\r\n  3404854881: \"IFCMATERIALPROFILESETUSAGETAPERING\",\r\n  3079605661: \"IFCMATERIALPROFILESETUSAGE\",\r\n  2852063980: \"IFCMATERIALCONSTITUENTSET\",\r\n  3708119000: \"IFCMATERIALCONSTITUENT\",\r\n  1585845231: \"IFCLAGTIME\",\r\n  2133299955: \"IFCINDEXEDTRIANGLETEXTUREMAP\",\r\n  1437953363: \"IFCINDEXEDTEXTUREMAP\",\r\n  3570813810: \"IFCINDEXEDCOLOURMAP\",\r\n  1437805879: \"IFCEXTERNALREFERENCERELATIONSHIP\",\r\n  297599258: \"IFCEXTENDEDPROPERTIES\",\r\n  211053100: \"IFCEVENTTIME\",\r\n  2713554722: \"IFCCONVERSIONBASEDUNITWITHOFFSET\",\r\n  3285139300: \"IFCCOLOURRGBLIST\",\r\n  1236880293: \"IFCWORKTIME\",\r\n  1199560280: \"IFCTIMEPERIOD\",\r\n  3611470254: \"IFCTEXTUREVERTEXLIST\",\r\n  2771591690: \"IFCTASKTIMERECURRING\",\r\n  1549132990: \"IFCTASKTIME\",\r\n  2043862942: \"IFCTABLECOLUMN\",\r\n  2934153892: \"IFCSURFACEREINFORCEMENTAREA\",\r\n  609421318: \"IFCSTRUCTURALLOADORRESULT\",\r\n  3478079324: \"IFCSTRUCTURALLOADCONFIGURATION\",\r\n  1054537805: \"IFCSCHEDULINGTIME\",\r\n  2439245199: \"IFCRESOURCELEVELRELATIONSHIP\",\r\n  2433181523: \"IFCREFERENCE\",\r\n  3915482550: \"IFCRECURRENCEPATTERN\",\r\n  986844984: \"IFCPROPERTYABSTRACTION\",\r\n  3843373140: \"IFCPROJECTEDCRS\",\r\n  677532197: \"IFCPRESENTATIONITEM\",\r\n  1507914824: \"IFCMATERIALUSAGEDEFINITION\",\r\n  552965576: \"IFCMATERIALPROFILEWITHOFFSETS\",\r\n  164193824: \"IFCMATERIALPROFILESET\",\r\n  2235152071: \"IFCMATERIALPROFILE\",\r\n  1847252529: \"IFCMATERIALLAYERWITHOFFSETS\",\r\n  760658860: \"IFCMATERIALDEFINITION\",\r\n  3057273783: \"IFCMAPCONVERSION\",\r\n  4294318154: \"IFCEXTERNALINFORMATION\",\r\n  1466758467: \"IFCCOORDINATEREFERENCESYSTEM\",\r\n  1785450214: \"IFCCOORDINATEOPERATION\",\r\n  775493141: \"IFCCONNECTIONVOLUMEGEOMETRY\",\r\n  979691226: \"IFCREINFORCINGBAR\",\r\n  3700593921: \"IFCELECTRICDISTRIBUTIONPOINT\",\r\n  1062813311: \"IFCDISTRIBUTIONCONTROLELEMENT\",\r\n  1052013943: \"IFCDISTRIBUTIONCHAMBERELEMENT\",\r\n  578613899: \"IFCCONTROLLERTYPE\",\r\n  2454782716: \"IFCCHAMFEREDGEFEATURE\",\r\n  753842376: \"IFCBEAM\",\r\n  3001207471: \"IFCALARMTYPE\",\r\n  2874132201: \"IFCACTUATORTYPE\",\r\n  3304561284: \"IFCWINDOW\",\r\n  3512223829: \"IFCWALLSTANDARDCASE\",\r\n  2391406946: \"IFCWALL\",\r\n  3313531582: \"IFCVIBRATIONISOLATORTYPE\",\r\n  2347447852: \"IFCTENDONANCHOR\",\r\n  3824725483: \"IFCTENDON\",\r\n  2515109513: \"IFCSTRUCTURALANALYSISMODEL\",\r\n  4252922144: \"IFCSTAIRFLIGHT\",\r\n  331165859: \"IFCSTAIR\",\r\n  1529196076: \"IFCSLAB\",\r\n  1783015770: \"IFCSENSORTYPE\",\r\n  1376911519: \"IFCROUNDEDEDGEFEATURE\",\r\n  2016517767: \"IFCROOF\",\r\n  2320036040: \"IFCREINFORCINGMESH\",\r\n  3027567501: \"IFCREINFORCINGELEMENT\",\r\n  3055160366: \"IFCRATIONALBEZIERCURVE\",\r\n  3283111854: \"IFCRAMPFLIGHT\",\r\n  3024970846: \"IFCRAMP\",\r\n  2262370178: \"IFCRAILING\",\r\n  3171933400: \"IFCPLATE\",\r\n  1687234759: \"IFCPILE\",\r\n  1073191201: \"IFCMEMBER\",\r\n  900683007: \"IFCFOOTING\",\r\n  3508470533: \"IFCFLOWTREATMENTDEVICE\",\r\n  2223149337: \"IFCFLOWTERMINAL\",\r\n  707683696: \"IFCFLOWSTORAGEDEVICE\",\r\n  987401354: \"IFCFLOWSEGMENT\",\r\n  3132237377: \"IFCFLOWMOVINGDEVICE\",\r\n  4037862832: \"IFCFLOWINSTRUMENTTYPE\",\r\n  4278956645: \"IFCFLOWFITTING\",\r\n  2058353004: \"IFCFLOWCONTROLLER\",\r\n  4222183408: \"IFCFIRESUPPRESSIONTERMINALTYPE\",\r\n  1810631287: \"IFCFILTERTYPE\",\r\n  346874300: \"IFCFANTYPE\",\r\n  1658829314: \"IFCENERGYCONVERSIONDEVICE\",\r\n  857184966: \"IFCELECTRICALELEMENT\",\r\n  1634875225: \"IFCELECTRICALCIRCUIT\",\r\n  712377611: \"IFCELECTRICTIMECONTROLTYPE\",\r\n  1217240411: \"IFCELECTRICMOTORTYPE\",\r\n  1365060375: \"IFCELECTRICHEATERTYPE\",\r\n  1534661035: \"IFCELECTRICGENERATORTYPE\",\r\n  3277789161: \"IFCELECTRICFLOWSTORAGEDEVICETYPE\",\r\n  663422040: \"IFCELECTRICAPPLIANCETYPE\",\r\n  855621170: \"IFCEDGEFEATURE\",\r\n  2030761528: \"IFCDUCTSILENCERTYPE\",\r\n  3760055223: \"IFCDUCTSEGMENTTYPE\",\r\n  869906466: \"IFCDUCTFITTINGTYPE\",\r\n  395920057: \"IFCDOOR\",\r\n  3041715199: \"IFCDISTRIBUTIONPORT\",\r\n  3040386961: \"IFCDISTRIBUTIONFLOWELEMENT\",\r\n  1945004755: \"IFCDISTRIBUTIONELEMENT\",\r\n  2063403501: \"IFCDISTRIBUTIONCONTROLELEMENTTYPE\",\r\n  1599208980: \"IFCDISTRIBUTIONCHAMBERELEMENTTYPE\",\r\n  2635815018: \"IFCDISCRETEACCESSORYTYPE\",\r\n  1335981549: \"IFCDISCRETEACCESSORY\",\r\n  4147604152: \"IFCDIAMETERDIMENSION\",\r\n  3961806047: \"IFCDAMPERTYPE\",\r\n  3495092785: \"IFCCURTAINWALL\",\r\n  1973544240: \"IFCCOVERING\",\r\n  2954562838: \"IFCCOOLINGTOWERTYPE\",\r\n  335055490: \"IFCCOOLEDBEAMTYPE\",\r\n  488727124: \"IFCCONSTRUCTIONPRODUCTRESOURCE\",\r\n  1060000209: \"IFCCONSTRUCTIONMATERIALRESOURCE\",\r\n  3898045240: \"IFCCONSTRUCTIONEQUIPMENTRESOURCE\",\r\n  1163958913: \"IFCCONDITIONCRITERION\",\r\n  2188551683: \"IFCCONDITION\",\r\n  2816379211: \"IFCCONDENSERTYPE\",\r\n  3850581409: \"IFCCOMPRESSORTYPE\",\r\n  843113511: \"IFCCOLUMN\",\r\n  2301859152: \"IFCCOILTYPE\",\r\n  2611217952: \"IFCCIRCLE\",\r\n  2951183804: \"IFCCHILLERTYPE\",\r\n  1285652485: \"IFCCABLESEGMENTTYPE\",\r\n  3293546465: \"IFCCABLECARRIERSEGMENTTYPE\",\r\n  395041908: \"IFCCABLECARRIERFITTINGTYPE\",\r\n  1909888760: \"IFCBUILDINGELEMENTPROXYTYPE\",\r\n  1095909175: \"IFCBUILDINGELEMENTPROXY\",\r\n  2979338954: \"IFCBUILDINGELEMENTPART\",\r\n  52481810: \"IFCBUILDINGELEMENTCOMPONENT\",\r\n  3299480353: \"IFCBUILDINGELEMENT\",\r\n  231477066: \"IFCBOILERTYPE\",\r\n  1916977116: \"IFCBEZIERCURVE\",\r\n  819618141: \"IFCBEAMTYPE\",\r\n  1967976161: \"IFCBSPLINECURVE\",\r\n  3460190687: \"IFCASSET\",\r\n  2470393545: \"IFCANGULARDIMENSION\",\r\n  1871374353: \"IFCAIRTOAIRHEATRECOVERYTYPE\",\r\n  3352864051: \"IFCAIRTERMINALTYPE\",\r\n  1411407467: \"IFCAIRTERMINALBOXTYPE\",\r\n  3821786052: \"IFCACTIONREQUEST\",\r\n  1213861670: \"IFC2DCOMPOSITECURVE\",\r\n  1033361043: \"IFCZONE\",\r\n  3342526732: \"IFCWORKSCHEDULE\",\r\n  4218914973: \"IFCWORKPLAN\",\r\n  1028945134: \"IFCWORKCONTROL\",\r\n  1133259667: \"IFCWASTETERMINALTYPE\",\r\n  1898987631: \"IFCWALLTYPE\",\r\n  2769231204: \"IFCVIRTUALELEMENT\",\r\n  728799441: \"IFCVALVETYPE\",\r\n  1911125066: \"IFCUNITARYEQUIPMENTTYPE\",\r\n  1600972822: \"IFCTUBEBUNDLETYPE\",\r\n  3593883385: \"IFCTRIMMEDCURVE\",\r\n  1620046519: \"IFCTRANSPORTELEMENT\",\r\n  1692211062: \"IFCTRANSFORMERTYPE\",\r\n  1637806684: \"IFCTIMESERIESSCHEDULE\",\r\n  5716631: \"IFCTANKTYPE\",\r\n  2254336722: \"IFCSYSTEM\",\r\n  2315554128: \"IFCSWITCHINGDEVICETYPE\",\r\n  148013059: \"IFCSUBCONTRACTRESOURCE\",\r\n  1975003073: \"IFCSTRUCTURALSURFACECONNECTION\",\r\n  2986769608: \"IFCSTRUCTURALRESULTGROUP\",\r\n  1235345126: \"IFCSTRUCTURALPOINTREACTION\",\r\n  734778138: \"IFCSTRUCTURALPOINTCONNECTION\",\r\n  2082059205: \"IFCSTRUCTURALPOINTACTION\",\r\n  3987759626: \"IFCSTRUCTURALPLANARACTIONVARYING\",\r\n  1621171031: \"IFCSTRUCTURALPLANARACTION\",\r\n  1252848954: \"IFCSTRUCTURALLOADGROUP\",\r\n  1721250024: \"IFCSTRUCTURALLINEARACTIONVARYING\",\r\n  1807405624: \"IFCSTRUCTURALLINEARACTION\",\r\n  2445595289: \"IFCSTRUCTURALCURVEMEMBERVARYING\",\r\n  214636428: \"IFCSTRUCTURALCURVEMEMBER\",\r\n  4243806635: \"IFCSTRUCTURALCURVECONNECTION\",\r\n  1179482911: \"IFCSTRUCTURALCONNECTION\",\r\n  682877961: \"IFCSTRUCTURALACTION\",\r\n  1039846685: \"IFCSTAIRFLIGHTTYPE\",\r\n  3112655638: \"IFCSTACKTERMINALTYPE\",\r\n  3812236995: \"IFCSPACETYPE\",\r\n  652456506: \"IFCSPACEPROGRAM\",\r\n  1305183839: \"IFCSPACEHEATERTYPE\",\r\n  3856911033: \"IFCSPACE\",\r\n  2533589738: \"IFCSLABTYPE\",\r\n  4097777520: \"IFCSITE\",\r\n  4105383287: \"IFCSERVICELIFE\",\r\n  3517283431: \"IFCSCHEDULETIMECONTROL\",\r\n  1768891740: \"IFCSANITARYTERMINALTYPE\",\r\n  2863920197: \"IFCRELASSIGNSTASKS\",\r\n  160246688: \"IFCRELAGGREGATES\",\r\n  2324767716: \"IFCRAMPFLIGHTTYPE\",\r\n  2893384427: \"IFCRAILINGTYPE\",\r\n  3248260540: \"IFCRADIUSDIMENSION\",\r\n  2250791053: \"IFCPUMPTYPE\",\r\n  1842657554: \"IFCPROTECTIVEDEVICETYPE\",\r\n  3651124850: \"IFCPROJECTIONELEMENT\",\r\n  3642467123: \"IFCPROJECTORDERRECORD\",\r\n  2904328755: \"IFCPROJECTORDER\",\r\n  2744685151: \"IFCPROCEDURE\",\r\n  3740093272: \"IFCPORT\",\r\n  3724593414: \"IFCPOLYLINE\",\r\n  4017108033: \"IFCPLATETYPE\",\r\n  4231323485: \"IFCPIPESEGMENTTYPE\",\r\n  804291784: \"IFCPIPEFITTINGTYPE\",\r\n  3327091369: \"IFCPERMIT\",\r\n  2382730787: \"IFCPERFORMANCEHISTORY\",\r\n  2837617999: \"IFCOUTLETTYPE\",\r\n  3425660407: \"IFCORDERACTION\",\r\n  3588315303: \"IFCOPENINGELEMENT\",\r\n  4143007308: \"IFCOCCUPANT\",\r\n  1916936684: \"IFCMOVE\",\r\n  977012517: \"IFCMOTORCONNECTIONTYPE\",\r\n  3181161470: \"IFCMEMBERTYPE\",\r\n  2108223431: \"IFCMECHANICALFASTENERTYPE\",\r\n  377706215: \"IFCMECHANICALFASTENER\",\r\n  2506943328: \"IFCLINEARDIMENSION\",\r\n  1161773419: \"IFCLIGHTFIXTURETYPE\",\r\n  1051575348: \"IFCLAMPTYPE\",\r\n  3827777499: \"IFCLABORRESOURCE\",\r\n  4288270099: \"IFCJUNCTIONBOXTYPE\",\r\n  2391368822: \"IFCINVENTORY\",\r\n  1806887404: \"IFCHUMIDIFIERTYPE\",\r\n  1251058090: \"IFCHEATEXCHANGERTYPE\",\r\n  2706460486: \"IFCGROUP\",\r\n  3009204131: \"IFCGRID\",\r\n  200128114: \"IFCGASTERMINALTYPE\",\r\n  814719939: \"IFCFURNITURESTANDARD\",\r\n  263784265: \"IFCFURNISHINGELEMENT\",\r\n  3009222698: \"IFCFLOWTREATMENTDEVICETYPE\",\r\n  2297155007: \"IFCFLOWTERMINALTYPE\",\r\n  1339347760: \"IFCFLOWSTORAGEDEVICETYPE\",\r\n  1834744321: \"IFCFLOWSEGMENTTYPE\",\r\n  1482959167: \"IFCFLOWMOVINGDEVICETYPE\",\r\n  3815607619: \"IFCFLOWMETERTYPE\",\r\n  3198132628: \"IFCFLOWFITTINGTYPE\",\r\n  3907093117: \"IFCFLOWCONTROLLERTYPE\",\r\n  1287392070: \"IFCFEATUREELEMENTSUBTRACTION\",\r\n  2143335405: \"IFCFEATUREELEMENTADDITION\",\r\n  2827207264: \"IFCFEATUREELEMENT\",\r\n  2489546625: \"IFCFASTENERTYPE\",\r\n  647756555: \"IFCFASTENER\",\r\n  3737207727: \"IFCFACETEDBREPWITHVOIDS\",\r\n  807026263: \"IFCFACETEDBREP\",\r\n  3390157468: \"IFCEVAPORATORTYPE\",\r\n  3174744832: \"IFCEVAPORATIVECOOLERTYPE\",\r\n  3272907226: \"IFCEQUIPMENTSTANDARD\",\r\n  1962604670: \"IFCEQUIPMENTELEMENT\",\r\n  2107101300: \"IFCENERGYCONVERSIONDEVICETYPE\",\r\n  1704287377: \"IFCELLIPSE\",\r\n  2590856083: \"IFCELEMENTCOMPONENTTYPE\",\r\n  1623761950: \"IFCELEMENTCOMPONENT\",\r\n  4123344466: \"IFCELEMENTASSEMBLY\",\r\n  1758889154: \"IFCELEMENT\",\r\n  360485395: \"IFCELECTRICALBASEPROPERTIES\",\r\n  3849074793: \"IFCDISTRIBUTIONFLOWELEMENTTYPE\",\r\n  3256556792: \"IFCDISTRIBUTIONELEMENTTYPE\",\r\n  681481545: \"IFCDIMENSIONCURVEDIRECTEDCALLOUT\",\r\n  1457835157: \"IFCCURTAINWALLTYPE\",\r\n  3295246426: \"IFCCREWRESOURCE\",\r\n  1916426348: \"IFCCOVERINGTYPE\",\r\n  1419761937: \"IFCCOSTSCHEDULE\",\r\n  3895139033: \"IFCCOSTITEM\",\r\n  3293443760: \"IFCCONTROL\",\r\n  2559216714: \"IFCCONSTRUCTIONRESOURCE\",\r\n  2510884976: \"IFCCONIC\",\r\n  3732776249: \"IFCCOMPOSITECURVE\",\r\n  300633059: \"IFCCOLUMNTYPE\",\r\n  2937912522: \"IFCCIRCLEHOLLOWPROFILEDEF\",\r\n  3124254112: \"IFCBUILDINGSTOREY\",\r\n  1950629157: \"IFCBUILDINGELEMENTTYPE\",\r\n  4031249490: \"IFCBUILDING\",\r\n  1260505505: \"IFCBOUNDEDCURVE\",\r\n  3649129432: \"IFCBOOLEANCLIPPINGRESULT\",\r\n  1334484129: \"IFCBLOCK\",\r\n  3207858831: \"IFCASYMMETRICISHAPEPROFILEDEF\",\r\n  1674181508: \"IFCANNOTATION\",\r\n  2296667514: \"IFCACTOR\",\r\n  2097647324: \"IFCTRANSPORTELEMENTTYPE\",\r\n  3473067441: \"IFCTASK\",\r\n  1580310250: \"IFCSYSTEMFURNITUREELEMENTTYPE\",\r\n  4124788165: \"IFCSURFACEOFREVOLUTION\",\r\n  2809605785: \"IFCSURFACEOFLINEAREXTRUSION\",\r\n  2028607225: \"IFCSURFACECURVESWEPTAREASOLID\",\r\n  4070609034: \"IFCSTRUCTUREDDIMENSIONCALLOUT\",\r\n  2218152070: \"IFCSTRUCTURALSURFACEMEMBERVARYING\",\r\n  3979015343: \"IFCSTRUCTURALSURFACEMEMBER\",\r\n  3689010777: \"IFCSTRUCTURALREACTION\",\r\n  530289379: \"IFCSTRUCTURALMEMBER\",\r\n  3136571912: \"IFCSTRUCTURALITEM\",\r\n  3544373492: \"IFCSTRUCTURALACTIVITY\",\r\n  451544542: \"IFCSPHERE\",\r\n  3893378262: \"IFCSPATIALSTRUCTUREELEMENTTYPE\",\r\n  2706606064: \"IFCSPATIALSTRUCTUREELEMENT\",\r\n  3626867408: \"IFCRIGHTCIRCULARCYLINDER\",\r\n  4158566097: \"IFCRIGHTCIRCULARCONE\",\r\n  1856042241: \"IFCREVOLVEDAREASOLID\",\r\n  2914609552: \"IFCRESOURCE\",\r\n  1401173127: \"IFCRELVOIDSELEMENT\",\r\n  3451746338: \"IFCRELSPACEBOUNDARY\",\r\n  366585022: \"IFCRELSERVICESBUILDINGS\",\r\n  4122056220: \"IFCRELSEQUENCE\",\r\n  1058617721: \"IFCRELSCHEDULESCOSTITEMS\",\r\n  1245217292: \"IFCRELREFERENCEDINSPATIALSTRUCTURE\",\r\n  750771296: \"IFCRELPROJECTSELEMENT\",\r\n  202636808: \"IFCRELOVERRIDESPROPERTIES\",\r\n  2051452291: \"IFCRELOCCUPIESSPACES\",\r\n  3268803585: \"IFCRELNESTS\",\r\n  4189434867: \"IFCRELINTERACTIONREQUIREMENTS\",\r\n  279856033: \"IFCRELFLOWCONTROLELEMENTS\",\r\n  3940055652: \"IFCRELFILLSELEMENT\",\r\n  781010003: \"IFCRELDEFINESBYTYPE\",\r\n  4186316022: \"IFCRELDEFINESBYPROPERTIES\",\r\n  693640335: \"IFCRELDEFINES\",\r\n  2551354335: \"IFCRELDECOMPOSES\",\r\n  2802773753: \"IFCRELCOVERSSPACES\",\r\n  886880790: \"IFCRELCOVERSBLDGELEMENTS\",\r\n  3242617779: \"IFCRELCONTAINEDINSPATIALSTRUCTURE\",\r\n  3678494232: \"IFCRELCONNECTSWITHREALIZINGELEMENTS\",\r\n  504942748: \"IFCRELCONNECTSWITHECCENTRICITY\",\r\n  1638771189: \"IFCRELCONNECTSSTRUCTURALMEMBER\",\r\n  3912681535: \"IFCRELCONNECTSSTRUCTURALELEMENT\",\r\n  2127690289: \"IFCRELCONNECTSSTRUCTURALACTIVITY\",\r\n  3190031847: \"IFCRELCONNECTSPORTS\",\r\n  4201705270: \"IFCRELCONNECTSPORTTOELEMENT\",\r\n  3945020480: \"IFCRELCONNECTSPATHELEMENTS\",\r\n  1204542856: \"IFCRELCONNECTSELEMENTS\",\r\n  826625072: \"IFCRELCONNECTS\",\r\n  2851387026: \"IFCRELASSOCIATESPROFILEPROPERTIES\",\r\n  2655215786: \"IFCRELASSOCIATESMATERIAL\",\r\n  3840914261: \"IFCRELASSOCIATESLIBRARY\",\r\n  982818633: \"IFCRELASSOCIATESDOCUMENT\",\r\n  2728634034: \"IFCRELASSOCIATESCONSTRAINT\",\r\n  919958153: \"IFCRELASSOCIATESCLASSIFICATION\",\r\n  4095574036: \"IFCRELASSOCIATESAPPROVAL\",\r\n  1327628568: \"IFCRELASSOCIATESAPPLIEDVALUE\",\r\n  1865459582: \"IFCRELASSOCIATES\",\r\n  205026976: \"IFCRELASSIGNSTORESOURCE\",\r\n  3372526763: \"IFCRELASSIGNSTOPROJECTORDER\",\r\n  2857406711: \"IFCRELASSIGNSTOPRODUCT\",\r\n  4278684876: \"IFCRELASSIGNSTOPROCESS\",\r\n  1307041759: \"IFCRELASSIGNSTOGROUP\",\r\n  2495723537: \"IFCRELASSIGNSTOCONTROL\",\r\n  1683148259: \"IFCRELASSIGNSTOACTOR\",\r\n  3939117080: \"IFCRELASSIGNS\",\r\n  3454111270: \"IFCRECTANGULARTRIMMEDSURFACE\",\r\n  2798486643: \"IFCRECTANGULARPYRAMID\",\r\n  2770003689: \"IFCRECTANGLEHOLLOWPROFILEDEF\",\r\n  3219374653: \"IFCPROXY\",\r\n  1451395588: \"IFCPROPERTYSET\",\r\n  4194566429: \"IFCPROJECTIONCURVE\",\r\n  103090709: \"IFCPROJECT\",\r\n  4208778838: \"IFCPRODUCT\",\r\n  2945172077: \"IFCPROCESS\",\r\n  220341763: \"IFCPLANE\",\r\n  603570806: \"IFCPLANARBOX\",\r\n  3566463478: \"IFCPERMEABLECOVERINGPROPERTIES\",\r\n  3505215534: \"IFCOFFSETCURVE3D\",\r\n  3388369263: \"IFCOFFSETCURVE2D\",\r\n  3888040117: \"IFCOBJECT\",\r\n  1425443689: \"IFCMANIFOLDSOLIDBREP\",\r\n  1281925730: \"IFCLINE\",\r\n  572779678: \"IFCLSHAPEPROFILEDEF\",\r\n  1484403080: \"IFCISHAPEPROFILEDEF\",\r\n  987898635: \"IFCGEOMETRICCURVESET\",\r\n  1268542332: \"IFCFURNITURETYPE\",\r\n  4238390223: \"IFCFURNISHINGELEMENTTYPE\",\r\n  3455213021: \"IFCFLUIDFLOWPROPERTIES\",\r\n  315944413: \"IFCFILLAREASTYLETILES\",\r\n  4203026998: \"IFCFILLAREASTYLETILESYMBOLWITHSTYLE\",\r\n  374418227: \"IFCFILLAREASTYLEHATCHING\",\r\n  2047409740: \"IFCFACEBASEDSURFACEMODEL\",\r\n  477187591: \"IFCEXTRUDEDAREASOLID\",\r\n  80994333: \"IFCENERGYPROPERTIES\",\r\n  2835456948: \"IFCELLIPSEPROFILEDEF\",\r\n  2777663545: \"IFCELEMENTARYSURFACE\",\r\n  339256511: \"IFCELEMENTTYPE\",\r\n  1883228015: \"IFCELEMENTQUANTITY\",\r\n  1472233963: \"IFCEDGELOOP\",\r\n  4006246654: \"IFCDRAUGHTINGPREDEFINEDCURVEFONT\",\r\n  445594917: \"IFCDRAUGHTINGPREDEFINEDCOLOUR\",\r\n  3073041342: \"IFCDRAUGHTINGCALLOUT\",\r\n  526551008: \"IFCDOORSTYLE\",\r\n  1714330368: \"IFCDOORPANELPROPERTIES\",\r\n  2963535650: \"IFCDOORLININGPROPERTIES\",\r\n  32440307: \"IFCDIRECTION\",\r\n  4054601972: \"IFCDIMENSIONCURVETERMINATOR\",\r\n  606661476: \"IFCDIMENSIONCURVE\",\r\n  693772133: \"IFCDEFINEDSYMBOL\",\r\n  2827736869: \"IFCCURVEBOUNDEDPLANE\",\r\n  2601014836: \"IFCCURVE\",\r\n  2147822146: \"IFCCSGSOLID\",\r\n  2506170314: \"IFCCSGPRIMITIVE3D\",\r\n  194851669: \"IFCCRANERAILFSHAPEPROFILEDEF\",\r\n  4133800736: \"IFCCRANERAILASHAPEPROFILEDEF\",\r\n  2485617015: \"IFCCOMPOSITECURVESEGMENT\",\r\n  2205249479: \"IFCCLOSEDSHELL\",\r\n  1383045692: \"IFCCIRCLEPROFILEDEF\",\r\n  1416205885: \"IFCCARTESIANTRANSFORMATIONOPERATOR3DNONUNIFORM\",\r\n  3331915920: \"IFCCARTESIANTRANSFORMATIONOPERATOR3D\",\r\n  3486308946: \"IFCCARTESIANTRANSFORMATIONOPERATOR2DNONUNIFORM\",\r\n  3749851601: \"IFCCARTESIANTRANSFORMATIONOPERATOR2D\",\r\n  59481748: \"IFCCARTESIANTRANSFORMATIONOPERATOR\",\r\n  1123145078: \"IFCCARTESIANPOINT\",\r\n  2898889636: \"IFCCSHAPEPROFILEDEF\",\r\n  2713105998: \"IFCBOXEDHALFSPACE\",\r\n  2581212453: \"IFCBOUNDINGBOX\",\r\n  4182860854: \"IFCBOUNDEDSURFACE\",\r\n  2736907675: \"IFCBOOLEANRESULT\",\r\n  2740243338: \"IFCAXIS2PLACEMENT3D\",\r\n  3125803723: \"IFCAXIS2PLACEMENT2D\",\r\n  4261334040: \"IFCAXIS1PLACEMENT\",\r\n  1302238472: \"IFCANNOTATIONSURFACE\",\r\n  2265737646: \"IFCANNOTATIONFILLAREAOCCURRENCE\",\r\n  669184980: \"IFCANNOTATIONFILLAREA\",\r\n  3288037868: \"IFCANNOTATIONCURVEOCCURRENCE\",\r\n  2543172580: \"IFCZSHAPEPROFILEDEF\",\r\n  1299126871: \"IFCWINDOWSTYLE\",\r\n  512836454: \"IFCWINDOWPANELPROPERTIES\",\r\n  336235671: \"IFCWINDOWLININGPROPERTIES\",\r\n  2759199220: \"IFCVERTEXLOOP\",\r\n  1417489154: \"IFCVECTOR\",\r\n  427810014: \"IFCUSHAPEPROFILEDEF\",\r\n  2347495698: \"IFCTYPEPRODUCT\",\r\n  1628702193: \"IFCTYPEOBJECT\",\r\n  1345879162: \"IFCTWODIRECTIONREPEATFACTOR\",\r\n  2715220739: \"IFCTRAPEZIUMPROFILEDEF\",\r\n  3124975700: \"IFCTEXTLITERALWITHEXTENT\",\r\n  4282788508: \"IFCTEXTLITERAL\",\r\n  3028897424: \"IFCTERMINATORSYMBOL\",\r\n  3071757647: \"IFCTSHAPEPROFILEDEF\",\r\n  230924584: \"IFCSWEPTSURFACE\",\r\n  1260650574: \"IFCSWEPTDISKSOLID\",\r\n  2247615214: \"IFCSWEPTAREASOLID\",\r\n  1878645084: \"IFCSURFACESTYLERENDERING\",\r\n  2513912981: \"IFCSURFACE\",\r\n  2233826070: \"IFCSUBEDGE\",\r\n  3653947884: \"IFCSTRUCTURALSTEELPROFILEPROPERTIES\",\r\n  3843319758: \"IFCSTRUCTURALPROFILEPROPERTIES\",\r\n  1190533807: \"IFCSTRUCTURALLOADSINGLEFORCEWARPING\",\r\n  1597423693: \"IFCSTRUCTURALLOADSINGLEFORCE\",\r\n  1973038258: \"IFCSTRUCTURALLOADSINGLEDISPLACEMENTDISTORTION\",\r\n  2473145415: \"IFCSTRUCTURALLOADSINGLEDISPLACEMENT\",\r\n  2668620305: \"IFCSTRUCTURALLOADPLANARFORCE\",\r\n  1595516126: \"IFCSTRUCTURALLOADLINEARFORCE\",\r\n  390701378: \"IFCSPACETHERMALLOADPROPERTIES\",\r\n  1202362311: \"IFCSOUNDVALUE\",\r\n  2485662743: \"IFCSOUNDPROPERTIES\",\r\n  723233188: \"IFCSOLIDMODEL\",\r\n  2609359061: \"IFCSLIPPAGECONNECTIONCONDITION\",\r\n  4124623270: \"IFCSHELLBASEDSURFACEMODEL\",\r\n  2411513650: \"IFCSERVICELIFEFACTOR\",\r\n  1509187699: \"IFCSECTIONEDSPINE\",\r\n  2778083089: \"IFCROUNDEDRECTANGLEPROFILEDEF\",\r\n  478536968: \"IFCRELATIONSHIP\",\r\n  3765753017: \"IFCREINFORCEMENTDEFINITIONPROPERTIES\",\r\n  3413951693: \"IFCREGULARTIMESERIES\",\r\n  3615266464: \"IFCRECTANGLEPROFILEDEF\",\r\n  110355661: \"IFCPROPERTYTABLEVALUE\",\r\n  3650150729: \"IFCPROPERTYSINGLEVALUE\",\r\n  3357820518: \"IFCPROPERTYSETDEFINITION\",\r\n  941946838: \"IFCPROPERTYREFERENCEVALUE\",\r\n  2752243245: \"IFCPROPERTYLISTVALUE\",\r\n  4166981789: \"IFCPROPERTYENUMERATEDVALUE\",\r\n  1680319473: \"IFCPROPERTYDEFINITION\",\r\n  871118103: \"IFCPROPERTYBOUNDEDVALUE\",\r\n  673634403: \"IFCPRODUCTDEFINITIONSHAPE\",\r\n  179317114: \"IFCPREDEFINEDPOINTMARKERSYMBOL\",\r\n  433424934: \"IFCPREDEFINEDDIMENSIONSYMBOL\",\r\n  2559016684: \"IFCPREDEFINEDCURVEFONT\",\r\n  759155922: \"IFCPREDEFINEDCOLOUR\",\r\n  2775532180: \"IFCPOLYGONALBOUNDEDHALFSPACE\",\r\n  2924175390: \"IFCPOLYLOOP\",\r\n  1423911732: \"IFCPOINTONSURFACE\",\r\n  4022376103: \"IFCPOINTONCURVE\",\r\n  2067069095: \"IFCPOINT\",\r\n  1663979128: \"IFCPLANAREXTENT\",\r\n  2004835150: \"IFCPLACEMENT\",\r\n  597895409: \"IFCPIXELTEXTURE\",\r\n  3021840470: \"IFCPHYSICALCOMPLEXQUANTITY\",\r\n  2519244187: \"IFCPATH\",\r\n  2529465313: \"IFCPARAMETERIZEDPROFILEDEF\",\r\n  1029017970: \"IFCORIENTEDEDGE\",\r\n  2665983363: \"IFCOPENSHELL\",\r\n  2833995503: \"IFCONEDIRECTIONREPEATFACTOR\",\r\n  219451334: \"IFCOBJECTDEFINITION\",\r\n  1430189142: \"IFCMECHANICALCONCRETEMATERIALPROPERTIES\",\r\n  2022407955: \"IFCMATERIALDEFINITIONREPRESENTATION\",\r\n  2347385850: \"IFCMAPPEDITEM\",\r\n  1008929658: \"IFCLOOP\",\r\n  2624227202: \"IFCLOCALPLACEMENT\",\r\n  3422422726: \"IFCLIGHTSOURCESPOT\",\r\n  1520743889: \"IFCLIGHTSOURCEPOSITIONAL\",\r\n  4266656042: \"IFCLIGHTSOURCEGONIOMETRIC\",\r\n  2604431987: \"IFCLIGHTSOURCEDIRECTIONAL\",\r\n  125510826: \"IFCLIGHTSOURCEAMBIENT\",\r\n  1402838566: \"IFCLIGHTSOURCE\",\r\n  3741457305: \"IFCIRREGULARTIMESERIES\",\r\n  3905492369: \"IFCIMAGETEXTURE\",\r\n  2445078500: \"IFCHYGROSCOPICMATERIALPROPERTIES\",\r\n  812098782: \"IFCHALFSPACESOLID\",\r\n  178086475: \"IFCGRIDPLACEMENT\",\r\n  3590301190: \"IFCGEOMETRICSET\",\r\n  4142052618: \"IFCGEOMETRICREPRESENTATIONSUBCONTEXT\",\r\n  2453401579: \"IFCGEOMETRICREPRESENTATIONITEM\",\r\n  3448662350: \"IFCGEOMETRICREPRESENTATIONCONTEXT\",\r\n  1446786286: \"IFCGENERALPROFILEPROPERTIES\",\r\n  803998398: \"IFCGENERALMATERIALPROPERTIES\",\r\n  3857492461: \"IFCFUELPROPERTIES\",\r\n  738692330: \"IFCFILLAREASTYLE\",\r\n  4219587988: \"IFCFAILURECONNECTIONCONDITION\",\r\n  3008276851: \"IFCFACESURFACE\",\r\n  803316827: \"IFCFACEOUTERBOUND\",\r\n  1809719519: \"IFCFACEBOUND\",\r\n  2556980723: \"IFCFACE\",\r\n  1860660968: \"IFCEXTENDEDMATERIALPROPERTIES\",\r\n  476780140: \"IFCEDGECURVE\",\r\n  3900360178: \"IFCEDGE\",\r\n  4170525392: \"IFCDRAUGHTINGPREDEFINEDTEXTFONT\",\r\n  3732053477: \"IFCDOCUMENTREFERENCE\",\r\n  1694125774: \"IFCDIMENSIONPAIR\",\r\n  2273265877: \"IFCDIMENSIONCALLOUTRELATIONSHIP\",\r\n  3632507154: \"IFCDERIVEDPROFILEDEF\",\r\n  3800577675: \"IFCCURVESTYLE\",\r\n  2889183280: \"IFCCONVERSIONBASEDUNIT\",\r\n  3050246964: \"IFCCONTEXTDEPENDENTUNIT\",\r\n  45288368: \"IFCCONNECTIONPOINTECCENTRICITY\",\r\n  1981873012: \"IFCCONNECTIONCURVEGEOMETRY\",\r\n  370225590: \"IFCCONNECTEDFACESET\",\r\n  1485152156: \"IFCCOMPOSITEPROFILEDEF\",\r\n  2542286263: \"IFCCOMPLEXPROPERTY\",\r\n  776857604: \"IFCCOLOURRGB\",\r\n  647927063: \"IFCCLASSIFICATIONREFERENCE\",\r\n  3150382593: \"IFCCENTERLINEPROFILEDEF\",\r\n  616511568: \"IFCBLOBTEXTURE\",\r\n  2705031697: \"IFCARBITRARYPROFILEDEFWITHVOIDS\",\r\n  1310608509: \"IFCARBITRARYOPENPROFILEDEF\",\r\n  3798115385: \"IFCARBITRARYCLOSEDPROFILEDEF\",\r\n  2297822566: \"IFCANNOTATIONTEXTOCCURRENCE\",\r\n  3612888222: \"IFCANNOTATIONSYMBOLOCCURRENCE\",\r\n  962685235: \"IFCANNOTATIONSURFACEOCCURRENCE\",\r\n  2442683028: \"IFCANNOTATIONOCCURRENCE\",\r\n  1065908215: \"IFCWATERPROPERTIES\",\r\n  891718957: \"IFCVIRTUALGRIDINTERSECTION\",\r\n  1907098498: \"IFCVERTEXPOINT\",\r\n  3304826586: \"IFCVERTEXBASEDTEXTUREMAP\",\r\n  2799835756: \"IFCVERTEX\",\r\n  180925521: \"IFCUNITASSIGNMENT\",\r\n  1735638870: \"IFCTOPOLOGYREPRESENTATION\",\r\n  1377556343: \"IFCTOPOLOGICALREPRESENTATIONITEM\",\r\n  581633288: \"IFCTIMESERIESVALUE\",\r\n  1718945513: \"IFCTIMESERIESREFERENCERELATIONSHIP\",\r\n  3101149627: \"IFCTIMESERIES\",\r\n  3317419933: \"IFCTHERMALMATERIALPROPERTIES\",\r\n  1210645708: \"IFCTEXTUREVERTEX\",\r\n  2552916305: \"IFCTEXTUREMAP\",\r\n  1742049831: \"IFCTEXTURECOORDINATEGENERATOR\",\r\n  280115917: \"IFCTEXTURECOORDINATE\",\r\n  1484833681: \"IFCTEXTSTYLEWITHBOXCHARACTERISTICS\",\r\n  1640371178: \"IFCTEXTSTYLETEXTMODEL\",\r\n  2636378356: \"IFCTEXTSTYLEFORDEFINEDFONT\",\r\n  1983826977: \"IFCTEXTSTYLEFONTMODEL\",\r\n  1447204868: \"IFCTEXTSTYLE\",\r\n  912023232: \"IFCTELECOMADDRESS\",\r\n  531007025: \"IFCTABLEROW\",\r\n  985171141: \"IFCTABLE\",\r\n  1290481447: \"IFCSYMBOLSTYLE\",\r\n  626085974: \"IFCSURFACETEXTURE\",\r\n  1351298697: \"IFCSURFACESTYLEWITHTEXTURES\",\r\n  846575682: \"IFCSURFACESTYLESHADING\",\r\n  1607154358: \"IFCSURFACESTYLEREFRACTION\",\r\n  3303107099: \"IFCSURFACESTYLELIGHTING\",\r\n  1300840506: \"IFCSURFACESTYLE\",\r\n  3049322572: \"IFCSTYLEDREPRESENTATION\",\r\n  3958052878: \"IFCSTYLEDITEM\",\r\n  2830218821: \"IFCSTYLEMODEL\",\r\n  3408363356: \"IFCSTRUCTURALLOADTEMPERATURE\",\r\n  2525727697: \"IFCSTRUCTURALLOADSTATIC\",\r\n  2162789131: \"IFCSTRUCTURALLOAD\",\r\n  2273995522: \"IFCSTRUCTURALCONNECTIONCONDITION\",\r\n  3692461612: \"IFCSIMPLEPROPERTY\",\r\n  4240577450: \"IFCSHAPEREPRESENTATION\",\r\n  3982875396: \"IFCSHAPEMODEL\",\r\n  867548509: \"IFCSHAPEASPECT\",\r\n  4165799628: \"IFCSECTIONREINFORCEMENTPROPERTIES\",\r\n  2042790032: \"IFCSECTIONPROPERTIES\",\r\n  448429030: \"IFCSIUNIT\",\r\n  2341007311: \"IFCROOT\",\r\n  3679540991: \"IFCRIBPLATEPROFILEPROPERTIES\",\r\n  1660063152: \"IFCREPRESENTATIONMAP\",\r\n  3008791417: \"IFCREPRESENTATIONITEM\",\r\n  3377609919: \"IFCREPRESENTATIONCONTEXT\",\r\n  1076942058: \"IFCREPRESENTATION\",\r\n  1222501353: \"IFCRELAXATION\",\r\n  1580146022: \"IFCREINFORCEMENTBARPROPERTIES\",\r\n  2692823254: \"IFCREFERENCESVALUEDOCUMENT\",\r\n  825690147: \"IFCQUANTITYWEIGHT\",\r\n  2405470396: \"IFCQUANTITYVOLUME\",\r\n  3252649465: \"IFCQUANTITYTIME\",\r\n  931644368: \"IFCQUANTITYLENGTH\",\r\n  2093928680: \"IFCQUANTITYCOUNT\",\r\n  2044713172: \"IFCQUANTITYAREA\",\r\n  3710013099: \"IFCPROPERTYENUMERATION\",\r\n  148025276: \"IFCPROPERTYDEPENDENCYRELATIONSHIP\",\r\n  3896028662: \"IFCPROPERTYCONSTRAINTRELATIONSHIP\",\r\n  2598011224: \"IFCPROPERTY\",\r\n  2802850158: \"IFCPROFILEPROPERTIES\",\r\n  3958567839: \"IFCPROFILEDEF\",\r\n  2267347899: \"IFCPRODUCTSOFCOMBUSTIONPROPERTIES\",\r\n  2095639259: \"IFCPRODUCTREPRESENTATION\",\r\n  2417041796: \"IFCPRESENTATIONSTYLEASSIGNMENT\",\r\n  3119450353: \"IFCPRESENTATIONSTYLE\",\r\n  1304840413: \"IFCPRESENTATIONLAYERWITHSTYLE\",\r\n  2022622350: \"IFCPRESENTATIONLAYERASSIGNMENT\",\r\n  1775413392: \"IFCPREDEFINEDTEXTFONT\",\r\n  3213052703: \"IFCPREDEFINEDTERMINATORSYMBOL\",\r\n  990879717: \"IFCPREDEFINEDSYMBOL\",\r\n  3727388367: \"IFCPREDEFINEDITEM\",\r\n  3355820592: \"IFCPOSTALADDRESS\",\r\n  2226359599: \"IFCPHYSICALSIMPLEQUANTITY\",\r\n  2483315170: \"IFCPHYSICALQUANTITY\",\r\n  101040310: \"IFCPERSONANDORGANIZATION\",\r\n  2077209135: \"IFCPERSON\",\r\n  1207048766: \"IFCOWNERHISTORY\",\r\n  1411181986: \"IFCORGANIZATIONRELATIONSHIP\",\r\n  4251960020: \"IFCORGANIZATION\",\r\n  1227763645: \"IFCOPTICALMATERIALPROPERTIES\",\r\n  2251480897: \"IFCOBJECTIVE\",\r\n  3701648758: \"IFCOBJECTPLACEMENT\",\r\n  1918398963: \"IFCNAMEDUNIT\",\r\n  2706619895: \"IFCMONETARYUNIT\",\r\n  3368373690: \"IFCMETRIC\",\r\n  677618848: \"IFCMECHANICALSTEELMATERIALPROPERTIES\",\r\n  4256014907: \"IFCMECHANICALMATERIALPROPERTIES\",\r\n  2597039031: \"IFCMEASUREWITHUNIT\",\r\n  3265635763: \"IFCMATERIALPROPERTIES\",\r\n  2199411900: \"IFCMATERIALLIST\",\r\n  1303795690: \"IFCMATERIALLAYERSETUSAGE\",\r\n  3303938423: \"IFCMATERIALLAYERSET\",\r\n  248100487: \"IFCMATERIALLAYER\",\r\n  1847130766: \"IFCMATERIALCLASSIFICATIONRELATIONSHIP\",\r\n  1838606355: \"IFCMATERIAL\",\r\n  30780891: \"IFCLOCALTIME\",\r\n  1566485204: \"IFCLIGHTINTENSITYDISTRIBUTION\",\r\n  4162380809: \"IFCLIGHTDISTRIBUTIONDATA\",\r\n  3452421091: \"IFCLIBRARYREFERENCE\",\r\n  2655187982: \"IFCLIBRARYINFORMATION\",\r\n  3020489413: \"IFCIRREGULARTIMESERIESVALUE\",\r\n  852622518: \"IFCGRIDAXIS\",\r\n  3548104201: \"IFCEXTERNALLYDEFINEDTEXTFONT\",\r\n  3207319532: \"IFCEXTERNALLYDEFINEDSYMBOL\",\r\n  1040185647: \"IFCEXTERNALLYDEFINEDSURFACESTYLE\",\r\n  2242383968: \"IFCEXTERNALLYDEFINEDHATCHSTYLE\",\r\n  3200245327: \"IFCEXTERNALREFERENCE\",\r\n  1648886627: \"IFCENVIRONMENTALIMPACTVALUE\",\r\n  3796139169: \"IFCDRAUGHTINGCALLOUTRELATIONSHIP\",\r\n  770865208: \"IFCDOCUMENTINFORMATIONRELATIONSHIP\",\r\n  1154170062: \"IFCDOCUMENTINFORMATION\",\r\n  1376555844: \"IFCDOCUMENTELECTRONICFORMAT\",\r\n  2949456006: \"IFCDIMENSIONALEXPONENTS\",\r\n  1045800335: \"IFCDERIVEDUNITELEMENT\",\r\n  1765591967: \"IFCDERIVEDUNIT\",\r\n  1072939445: \"IFCDATEANDTIME\",\r\n  3510044353: \"IFCCURVESTYLEFONTPATTERN\",\r\n  2367409068: \"IFCCURVESTYLEFONTANDSCALING\",\r\n  1105321065: \"IFCCURVESTYLEFONT\",\r\n  539742890: \"IFCCURRENCYRELATIONSHIP\",\r\n  602808272: \"IFCCOSTVALUE\",\r\n  1065062679: \"IFCCOORDINATEDUNIVERSALTIMEOFFSET\",\r\n  347226245: \"IFCCONSTRAINTRELATIONSHIP\",\r\n  613356794: \"IFCCONSTRAINTCLASSIFICATIONRELATIONSHIP\",\r\n  1658513725: \"IFCCONSTRAINTAGGREGATIONRELATIONSHIP\",\r\n  1959218052: \"IFCCONSTRAINT\",\r\n  2732653382: \"IFCCONNECTIONSURFACEGEOMETRY\",\r\n  4257277454: \"IFCCONNECTIONPORTGEOMETRY\",\r\n  2614616156: \"IFCCONNECTIONPOINTGEOMETRY\",\r\n  2859738748: \"IFCCONNECTIONGEOMETRY\",\r\n  3264961684: \"IFCCOLOURSPECIFICATION\",\r\n  3639012971: \"IFCCLASSIFICATIONNOTATIONFACET\",\r\n  938368621: \"IFCCLASSIFICATIONNOTATION\",\r\n  1098599126: \"IFCCLASSIFICATIONITEMRELATIONSHIP\",\r\n  1767535486: \"IFCCLASSIFICATIONITEM\",\r\n  747523909: \"IFCCLASSIFICATION\",\r\n  622194075: \"IFCCALENDARDATE\",\r\n  2069777674: \"IFCBOUNDARYNODECONDITIONWARPING\",\r\n  1387855156: \"IFCBOUNDARYNODECONDITION\",\r\n  3367102660: \"IFCBOUNDARYFACECONDITION\",\r\n  1560379544: \"IFCBOUNDARYEDGECONDITION\",\r\n  4037036970: \"IFCBOUNDARYCONDITION\",\r\n  3869604511: \"IFCAPPROVALRELATIONSHIP\",\r\n  390851274: \"IFCAPPROVALPROPERTYRELATIONSHIP\",\r\n  2080292479: \"IFCAPPROVALACTORRELATIONSHIP\",\r\n  130549933: \"IFCAPPROVAL\",\r\n  1110488051: \"IFCAPPLIEDVALUERELATIONSHIP\",\r\n  411424972: \"IFCAPPLIEDVALUE\",\r\n  639542469: \"IFCAPPLICATION\",\r\n  618182010: \"IFCADDRESS\",\r\n  3630933823: \"IFCACTORROLE\",\r\n  599546466: \"FILE_DESCRIPTION\",\r\n  1390159747: \"FILE_NAME\",\r\n  1109904537: \"FILE_SCHEMA\",\r\n};\r\n","export class Event<T> {\r\n  enabled = true;\r\n\r\n  add(handler: T extends void ? { (): void } : { (data: T): void }): void {\r\n    this.handlers.push(handler);\r\n  }\r\n\r\n  remove(handler: T extends void ? { (): void } : { (data: T): void }): void {\r\n    this.handlers = this.handlers.filter((h) => h !== handler);\r\n  }\r\n\r\n  trigger = (data?: T) => {\r\n    if (!this.enabled) {\r\n      return;\r\n    }\r\n    const handlers = this.handlers.slice(0);\r\n    for (const handler of handlers) {\r\n      handler(data as any);\r\n    }\r\n  };\r\n\r\n  reset() {\r\n    this.handlers.length = 0;\r\n  }\r\n\r\n  private handlers: (T extends void ? { (): void } : { (data: T): void })[] =\r\n    [];\r\n}\r\n","export class AsyncEvent<T> {\r\n  enabled = true;\r\n\r\n  add(\r\n    handler: T extends void\r\n      ? { (): Promise<void> }\r\n      : { (data: T): Promise<void> },\r\n  ): void {\r\n    this.handlers.push(handler);\r\n  }\r\n\r\n  remove(\r\n    handler: T extends void\r\n      ? { (): Promise<void> }\r\n      : { (data: T): Promise<void> },\r\n  ): void {\r\n    this.handlers = this.handlers.filter((h) => h !== handler);\r\n  }\r\n\r\n  trigger = async (data?: T) => {\r\n    if (!this.enabled) {\r\n      return;\r\n    }\r\n    const handlers = this.handlers.slice(0);\r\n    for (const handler of handlers) {\r\n      await handler(data as any);\r\n    }\r\n  };\r\n\r\n  reset() {\r\n    this.handlers.length = 0;\r\n  }\r\n\r\n  private handlers: (T extends void\r\n    ? { (): Promise<void> }\r\n    : { (data: T): Promise<void> })[] = [];\r\n}\r\n","import { MathUtils } from \"three\";\r\nimport { Event } from \"./event\";\r\n\r\n// TODO: Implement bulk operations (set, update, delete) with the corresponding events\r\n\r\nexport class DataMap<K, V> extends Map<K, V> {\r\n  readonly onBeforeSet = new Event<{ key: K; value: V }>();\r\n  readonly onItemSet = new Event<{ key: K; value: V }>();\r\n\r\n  readonly onItemUpdated = new Event<{ key: K; value: V }>();\r\n\r\n  readonly onBeforeDelete = new Event<{ key: K; value: V }>();\r\n  readonly onItemDeleted = new Event<K>();\r\n\r\n  readonly onCleared = new Event();\r\n\r\n  set eventsEnabled(value: boolean) {\r\n    this.onItemSet.enabled = value;\r\n    this.onItemUpdated.enabled = value;\r\n    this.onItemDeleted.enabled = value;\r\n    this.onBeforeDelete.enabled = value;\r\n    this.onCleared.enabled = value;\r\n  }\r\n\r\n  constructor(iterable?: Iterable<readonly [K, V]> | null | undefined) {\r\n    super(iterable);\r\n  }\r\n\r\n  clear() {\r\n    for (const [key, value] of this) {\r\n      this.onBeforeDelete.trigger({ key, value });\r\n    }\r\n    super.clear();\r\n    this.onCleared.trigger();\r\n  }\r\n\r\n  set(key: K, value: V) {\r\n    const triggerUpdate = this.has(key);\r\n    const guard = this.guard ?? (() => true);\r\n    const isValid = guard(key, value);\r\n    if (!isValid) return this;\r\n    if (!triggerUpdate) {\r\n      // First time the item is in the Map\r\n      this.onBeforeSet.trigger({ key, value });\r\n    }\r\n    const result = super.set(key, value);\r\n    if (triggerUpdate) {\r\n      if (!this.onItemUpdated) {\r\n        (this.onItemUpdated as any) = new Event<{ key: K; value: V }>();\r\n      }\r\n      this.onItemUpdated.trigger({ key, value });\r\n    } else {\r\n      if (!this.onItemSet) {\r\n        (this.onItemSet as any) = new Event<{ key: K; value: V }>();\r\n      }\r\n      this.onItemSet.trigger({ key, value });\r\n    }\r\n    return result;\r\n  }\r\n\r\n  guard: (key: K, value: V) => boolean = () => true;\r\n  deleteGuard: (key: K, value: V) => boolean = () => true;\r\n  updateGuard: (key: K, value: V) => boolean = () => true;\r\n\r\n  delete(key: K) {\r\n    const value = this.get(key);\r\n    if (!value) return false;\r\n    if (!this.deleteGuard(key, value)) return false;\r\n    this.onBeforeDelete.trigger({ key, value });\r\n    const deleted = super.delete(key);\r\n    if (deleted) this.onItemDeleted.trigger(key);\r\n    return deleted;\r\n  }\r\n\r\n  getKey(item: V) {\r\n    for (const [key, value] of this) {\r\n      if (value === item) return key;\r\n    }\r\n    return undefined;\r\n  }\r\n\r\n  /**\r\n   * Sets the value in the map with a randomly generated uuidv4 key.\r\n   * Only use this if your keys are strings\r\n   *\r\n   * @param value - The value of the item to set.\r\n   * @returns The key used.\r\n   */\r\n  add(value: V) {\r\n    const key = MathUtils.generateUUID().toLowerCase() as K;\r\n    this.set(key, value);\r\n    return key;\r\n  }\r\n\r\n  /**\r\n   * Updates an item in the data map, triggering the corresponding event.\r\n   *\r\n   * @param item - The item to update.\r\n   */\r\n  update(item: V) {\r\n    const key = this.getKey(item);\r\n    if (key && this.updateGuard(key, item)) {\r\n      this.set(key, item)\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Deletes elements from the DataMap based on a provided predicate function.\r\n   *\r\n   * @param predicate A function that takes a value and its key as arguments and returns a boolean.\r\n   *                  If the function returns true, the element is deleted.\r\n   */\r\n  deleteIf(predicate: (value: V, key: K) => boolean) {\r\n    for (const [key, value] of this) {\r\n      if (predicate(value, key)) {\r\n        this.delete(key);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Replaces a key in the DataMap with a new key, transferring the associated value.\r\n   *\r\n   * @param oldKey - The key to be replaced.\r\n   * @param newKey - The new key that will replace the old key.\r\n   * @param fullReplace - If true, allows replacing an existing key with the new key. If false, the replacement will not occur if the new key already exists in the map. Defaults to false.\r\n   * @returns True if the key was successfully replaced, false otherwise.\r\n   */\r\n  replaceKey(oldKey: K, newKey: K, fullReplace = false) {\r\n    const oldKeyItem = this.get(oldKey);\r\n    if (!oldKeyItem) return false;\r\n    const newKeyItem = this.get(newKey);\r\n    if (newKeyItem && !fullReplace) return false;\r\n    this.eventsEnabled = false;\r\n    this.delete(oldKey);\r\n    this.eventsEnabled = true;\r\n    this.set(newKey, oldKeyItem);\r\n    return true;\r\n  }\r\n\r\n  dispose() {\r\n    this.clear();\r\n    this.onItemSet.reset();\r\n    this.onItemDeleted.reset();\r\n    this.onItemUpdated.reset();\r\n    this.onCleared.reset();\r\n    this.onBeforeDelete.reset();\r\n  }\r\n}\r\n","import { Event } from \"./event\";\r\n\r\n// TODO: Implement bulk operations (set, update, delete) with the corresponding events\r\n\r\nexport class DataSet<T> extends Set<T> {\r\n  readonly onUpdated = new Event<undefined>();\r\n\r\n  readonly onItemAdded = new Event<T>();\r\n\r\n  readonly onBeforeDelete = new Event<T>();\r\n\r\n  readonly onItemDeleted = new Event();\r\n\r\n  readonly onCleared = new Event();\r\n\r\n  set eventsEnabled(value: boolean) {\r\n    this.onUpdated.enabled = value;\r\n    this.onItemAdded.enabled = value;\r\n    this.onItemDeleted.enabled = value;\r\n    this.onBeforeDelete.enabled = value;\r\n    this.onCleared.enabled = value;\r\n  }\r\n\r\n  constructor(iterable?: Iterable<T> | null) {\r\n    super(iterable);\r\n  }\r\n\r\n  clear() {\r\n    for (const item of this) {\r\n      this.onBeforeDelete.trigger(item);\r\n    }\r\n    super.clear();\r\n    this.onCleared.trigger();\r\n    this.onUpdated.trigger();\r\n  }\r\n\r\n  add(...value: T[]) {\r\n    for (const item of value) {\r\n      const existing = this.has(item);\r\n      if (existing) continue;\r\n      const guard = this.guard ?? (() => true);\r\n      const isValid = guard(item);\r\n      if (!isValid) continue;\r\n      super.add(item);\r\n      if (!this.onItemAdded) (this.onItemAdded as any) = new Event<T>();\r\n      this.onItemAdded.trigger(item);\r\n    }\r\n    if (!this.onUpdated) (this.onUpdated as any) = new Event<undefined>();\r\n    this.onUpdated.trigger();\r\n    return this;\r\n  }\r\n\r\n  guard: (value: T) => boolean = () => true;\r\n  deleteGuard: (value: T) => boolean = () => true;\r\n\r\n  delete(value: T) {\r\n    const exist = this.has(value);\r\n    if (!exist) return false;\r\n    if (!this.deleteGuard(value)) return false;\r\n    this.onBeforeDelete.trigger(value);\r\n    const deleted = super.delete(value);\r\n    if (deleted) {\r\n      this.onItemDeleted.trigger();\r\n      this.onUpdated.trigger();\r\n    }\r\n    return deleted;\r\n  }\r\n\r\n  deleteIf(predicate: (value: T) => boolean) {\r\n    for (const v of this) {\r\n      if (predicate(v)) {\r\n        this.delete(v);\r\n      }\r\n    }\r\n  }\r\n\r\n  getIndex(item: T) {\r\n    let index = 0;\r\n    for (const value of this) {\r\n      if (value === item) return index;\r\n      index++;\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  dispose() {\r\n    this.clear();\r\n    this.onItemAdded.reset();\r\n    this.onItemDeleted.reset();\r\n    this.onCleared.reset();\r\n    this.onBeforeDelete.reset();\r\n    this.onUpdated.reset();\r\n  }\r\n}\r\n","export const SIZEOF_SHORT = 2;\nexport const SIZEOF_INT = 4;\nexport const FILE_IDENTIFIER_LENGTH = 4;\nexport const SIZE_PREFIX_LENGTH = 4;\n","export const int32 = new Int32Array(2);\nexport const float32 = new Float32Array(int32.buffer);\nexport const float64 = new Float64Array(int32.buffer);\nexport const isLittleEndian = new Uint16Array(new Uint8Array([1, 0]).buffer)[0] === 1;\n","export var Encoding;\n(function (Encoding) {\n    Encoding[Encoding[\"UTF8_BYTES\"] = 1] = \"UTF8_BYTES\";\n    Encoding[Encoding[\"UTF16_STRING\"] = 2] = \"UTF16_STRING\";\n})(Encoding || (Encoding = {}));\n","import { FILE_IDENTIFIER_LENGTH, SIZEOF_INT } from \"./constants.js\";\nimport { int32, isLittleEndian, float32, float64 } from \"./utils.js\";\nimport { Encoding } from \"./encoding.js\";\nexport class ByteBuffer {\n    /**\n     * Create a new ByteBuffer with a given array of bytes (`Uint8Array`)\n     */\n    constructor(bytes_) {\n        this.bytes_ = bytes_;\n        this.position_ = 0;\n        this.text_decoder_ = new TextDecoder();\n    }\n    /**\n     * Create and allocate a new ByteBuffer with a given size.\n     */\n    static allocate(byte_size) {\n        return new ByteBuffer(new Uint8Array(byte_size));\n    }\n    clear() {\n        this.position_ = 0;\n    }\n    /**\n     * Get the underlying `Uint8Array`.\n     */\n    bytes() {\n        return this.bytes_;\n    }\n    /**\n     * Get the buffer's position.\n     */\n    position() {\n        return this.position_;\n    }\n    /**\n     * Set the buffer's position.\n     */\n    setPosition(position) {\n        this.position_ = position;\n    }\n    /**\n     * Get the buffer's capacity.\n     */\n    capacity() {\n        return this.bytes_.length;\n    }\n    readInt8(offset) {\n        return this.readUint8(offset) << 24 >> 24;\n    }\n    readUint8(offset) {\n        return this.bytes_[offset];\n    }\n    readInt16(offset) {\n        return this.readUint16(offset) << 16 >> 16;\n    }\n    readUint16(offset) {\n        return this.bytes_[offset] | this.bytes_[offset + 1] << 8;\n    }\n    readInt32(offset) {\n        return this.bytes_[offset] | this.bytes_[offset + 1] << 8 | this.bytes_[offset + 2] << 16 | this.bytes_[offset + 3] << 24;\n    }\n    readUint32(offset) {\n        return this.readInt32(offset) >>> 0;\n    }\n    readInt64(offset) {\n        return BigInt.asIntN(64, BigInt(this.readUint32(offset)) + (BigInt(this.readUint32(offset + 4)) << BigInt(32)));\n    }\n    readUint64(offset) {\n        return BigInt.asUintN(64, BigInt(this.readUint32(offset)) + (BigInt(this.readUint32(offset + 4)) << BigInt(32)));\n    }\n    readFloat32(offset) {\n        int32[0] = this.readInt32(offset);\n        return float32[0];\n    }\n    readFloat64(offset) {\n        int32[isLittleEndian ? 0 : 1] = this.readInt32(offset);\n        int32[isLittleEndian ? 1 : 0] = this.readInt32(offset + 4);\n        return float64[0];\n    }\n    writeInt8(offset, value) {\n        this.bytes_[offset] = value;\n    }\n    writeUint8(offset, value) {\n        this.bytes_[offset] = value;\n    }\n    writeInt16(offset, value) {\n        this.bytes_[offset] = value;\n        this.bytes_[offset + 1] = value >> 8;\n    }\n    writeUint16(offset, value) {\n        this.bytes_[offset] = value;\n        this.bytes_[offset + 1] = value >> 8;\n    }\n    writeInt32(offset, value) {\n        this.bytes_[offset] = value;\n        this.bytes_[offset + 1] = value >> 8;\n        this.bytes_[offset + 2] = value >> 16;\n        this.bytes_[offset + 3] = value >> 24;\n    }\n    writeUint32(offset, value) {\n        this.bytes_[offset] = value;\n        this.bytes_[offset + 1] = value >> 8;\n        this.bytes_[offset + 2] = value >> 16;\n        this.bytes_[offset + 3] = value >> 24;\n    }\n    writeInt64(offset, value) {\n        this.writeInt32(offset, Number(BigInt.asIntN(32, value)));\n        this.writeInt32(offset + 4, Number(BigInt.asIntN(32, value >> BigInt(32))));\n    }\n    writeUint64(offset, value) {\n        this.writeUint32(offset, Number(BigInt.asUintN(32, value)));\n        this.writeUint32(offset + 4, Number(BigInt.asUintN(32, value >> BigInt(32))));\n    }\n    writeFloat32(offset, value) {\n        float32[0] = value;\n        this.writeInt32(offset, int32[0]);\n    }\n    writeFloat64(offset, value) {\n        float64[0] = value;\n        this.writeInt32(offset, int32[isLittleEndian ? 0 : 1]);\n        this.writeInt32(offset + 4, int32[isLittleEndian ? 1 : 0]);\n    }\n    /**\n     * Return the file identifier.   Behavior is undefined for FlatBuffers whose\n     * schema does not include a file_identifier (likely points at padding or the\n     * start of a the root vtable).\n     */\n    getBufferIdentifier() {\n        if (this.bytes_.length < this.position_ + SIZEOF_INT +\n            FILE_IDENTIFIER_LENGTH) {\n            throw new Error('FlatBuffers: ByteBuffer is too short to contain an identifier.');\n        }\n        let result = \"\";\n        for (let i = 0; i < FILE_IDENTIFIER_LENGTH; i++) {\n            result += String.fromCharCode(this.readInt8(this.position_ + SIZEOF_INT + i));\n        }\n        return result;\n    }\n    /**\n     * Look up a field in the vtable, return an offset into the object, or 0 if the\n     * field is not present.\n     */\n    __offset(bb_pos, vtable_offset) {\n        const vtable = bb_pos - this.readInt32(bb_pos);\n        return vtable_offset < this.readInt16(vtable) ? this.readInt16(vtable + vtable_offset) : 0;\n    }\n    /**\n     * Initialize any Table-derived type to point to the union at the given offset.\n     */\n    __union(t, offset) {\n        t.bb_pos = offset + this.readInt32(offset);\n        t.bb = this;\n        return t;\n    }\n    /**\n     * Create a JavaScript string from UTF-8 data stored inside the FlatBuffer.\n     * This allocates a new string and converts to wide chars upon each access.\n     *\n     * To avoid the conversion to string, pass Encoding.UTF8_BYTES as the\n     * \"optionalEncoding\" argument. This is useful for avoiding conversion when\n     * the data will just be packaged back up in another FlatBuffer later on.\n     *\n     * @param offset\n     * @param opt_encoding Defaults to UTF16_STRING\n     */\n    __string(offset, opt_encoding) {\n        offset += this.readInt32(offset);\n        const length = this.readInt32(offset);\n        offset += SIZEOF_INT;\n        const utf8bytes = this.bytes_.subarray(offset, offset + length);\n        if (opt_encoding === Encoding.UTF8_BYTES)\n            return utf8bytes;\n        else\n            return this.text_decoder_.decode(utf8bytes);\n    }\n    /**\n     * Handle unions that can contain string as its member, if a Table-derived type then initialize it,\n     * if a string then return a new one\n     *\n     * WARNING: strings are immutable in JS so we can't change the string that the user gave us, this\n     * makes the behaviour of __union_with_string different compared to __union\n     */\n    __union_with_string(o, offset) {\n        if (typeof o === 'string') {\n            return this.__string(offset);\n        }\n        return this.__union(o, offset);\n    }\n    /**\n     * Retrieve the relative offset stored at \"offset\"\n     */\n    __indirect(offset) {\n        return offset + this.readInt32(offset);\n    }\n    /**\n     * Get the start of data of a vector whose offset is stored at \"offset\" in this object.\n     */\n    __vector(offset) {\n        return offset + this.readInt32(offset) + SIZEOF_INT; // data starts after the length\n    }\n    /**\n     * Get the length of a vector whose offset is stored at \"offset\" in this object.\n     */\n    __vector_len(offset) {\n        return this.readInt32(offset + this.readInt32(offset));\n    }\n    __has_identifier(ident) {\n        if (ident.length != FILE_IDENTIFIER_LENGTH) {\n            throw new Error('FlatBuffers: file identifier must be length ' +\n                FILE_IDENTIFIER_LENGTH);\n        }\n        for (let i = 0; i < FILE_IDENTIFIER_LENGTH; i++) {\n            if (ident.charCodeAt(i) != this.readInt8(this.position() + SIZEOF_INT + i)) {\n                return false;\n            }\n        }\n        return true;\n    }\n    /**\n     * A helper function for generating list for obj api\n     */\n    createScalarList(listAccessor, listLength) {\n        const ret = [];\n        for (let i = 0; i < listLength; ++i) {\n            const val = listAccessor(i);\n            if (val !== null) {\n                ret.push(val);\n            }\n        }\n        return ret;\n    }\n    /**\n     * A helper function for generating list for obj api\n     * @param listAccessor function that accepts an index and return data at that index\n     * @param listLength listLength\n     * @param res result list\n     */\n    createObjList(listAccessor, listLength) {\n        const ret = [];\n        for (let i = 0; i < listLength; ++i) {\n            const val = listAccessor(i);\n            if (val !== null) {\n                ret.push(val.unpack());\n            }\n        }\n        return ret;\n    }\n}\n","import { ByteBuffer } from \"./byte-buffer.js\";\nimport { SIZEOF_SHORT, SIZE_PREFIX_LENGTH, SIZEOF_INT, FILE_IDENTIFIER_LENGTH } from \"./constants.js\";\nexport class Builder {\n    /**\n     * Create a FlatBufferBuilder.\n     */\n    constructor(opt_initial_size) {\n        /** Minimum alignment encountered so far. */\n        this.minalign = 1;\n        /** The vtable for the current table. */\n        this.vtable = null;\n        /** The amount of fields we're actually using. */\n        this.vtable_in_use = 0;\n        /** Whether we are currently serializing a table. */\n        this.isNested = false;\n        /** Starting offset of the current struct/table. */\n        this.object_start = 0;\n        /** List of offsets of all vtables. */\n        this.vtables = [];\n        /** For the current vector being built. */\n        this.vector_num_elems = 0;\n        /** False omits default values from the serialized data */\n        this.force_defaults = false;\n        this.string_maps = null;\n        this.text_encoder = new TextEncoder();\n        let initial_size;\n        if (!opt_initial_size) {\n            initial_size = 1024;\n        }\n        else {\n            initial_size = opt_initial_size;\n        }\n        /**\n         * @type {ByteBuffer}\n         * @private\n         */\n        this.bb = ByteBuffer.allocate(initial_size);\n        this.space = initial_size;\n    }\n    clear() {\n        this.bb.clear();\n        this.space = this.bb.capacity();\n        this.minalign = 1;\n        this.vtable = null;\n        this.vtable_in_use = 0;\n        this.isNested = false;\n        this.object_start = 0;\n        this.vtables = [];\n        this.vector_num_elems = 0;\n        this.force_defaults = false;\n        this.string_maps = null;\n    }\n    /**\n     * In order to save space, fields that are set to their default value\n     * don't get serialized into the buffer. Forcing defaults provides a\n     * way to manually disable this optimization.\n     *\n     * @param forceDefaults true always serializes default values\n     */\n    forceDefaults(forceDefaults) {\n        this.force_defaults = forceDefaults;\n    }\n    /**\n     * Get the ByteBuffer representing the FlatBuffer. Only call this after you've\n     * called finish(). The actual data starts at the ByteBuffer's current position,\n     * not necessarily at 0.\n     */\n    dataBuffer() {\n        return this.bb;\n    }\n    /**\n     * Get the bytes representing the FlatBuffer. Only call this after you've\n     * called finish().\n     */\n    asUint8Array() {\n        return this.bb.bytes().subarray(this.bb.position(), this.bb.position() + this.offset());\n    }\n    /**\n     * Prepare to write an element of `size` after `additional_bytes` have been\n     * written, e.g. if you write a string, you need to align such the int length\n     * field is aligned to 4 bytes, and the string data follows it directly. If all\n     * you need to do is alignment, `additional_bytes` will be 0.\n     *\n     * @param size This is the of the new element to write\n     * @param additional_bytes The padding size\n     */\n    prep(size, additional_bytes) {\n        // Track the biggest thing we've ever aligned to.\n        if (size > this.minalign) {\n            this.minalign = size;\n        }\n        // Find the amount of alignment needed such that `size` is properly\n        // aligned after `additional_bytes`\n        const align_size = ((~(this.bb.capacity() - this.space + additional_bytes)) + 1) & (size - 1);\n        // Reallocate the buffer if needed.\n        while (this.space < align_size + size + additional_bytes) {\n            const old_buf_size = this.bb.capacity();\n            this.bb = Builder.growByteBuffer(this.bb);\n            this.space += this.bb.capacity() - old_buf_size;\n        }\n        this.pad(align_size);\n    }\n    pad(byte_size) {\n        for (let i = 0; i < byte_size; i++) {\n            this.bb.writeInt8(--this.space, 0);\n        }\n    }\n    writeInt8(value) {\n        this.bb.writeInt8(this.space -= 1, value);\n    }\n    writeInt16(value) {\n        this.bb.writeInt16(this.space -= 2, value);\n    }\n    writeInt32(value) {\n        this.bb.writeInt32(this.space -= 4, value);\n    }\n    writeInt64(value) {\n        this.bb.writeInt64(this.space -= 8, value);\n    }\n    writeFloat32(value) {\n        this.bb.writeFloat32(this.space -= 4, value);\n    }\n    writeFloat64(value) {\n        this.bb.writeFloat64(this.space -= 8, value);\n    }\n    /**\n     * Add an `int8` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param value The `int8` to add the buffer.\n     */\n    addInt8(value) {\n        this.prep(1, 0);\n        this.writeInt8(value);\n    }\n    /**\n     * Add an `int16` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param value The `int16` to add the buffer.\n     */\n    addInt16(value) {\n        this.prep(2, 0);\n        this.writeInt16(value);\n    }\n    /**\n     * Add an `int32` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param value The `int32` to add the buffer.\n     */\n    addInt32(value) {\n        this.prep(4, 0);\n        this.writeInt32(value);\n    }\n    /**\n     * Add an `int64` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param value The `int64` to add the buffer.\n     */\n    addInt64(value) {\n        this.prep(8, 0);\n        this.writeInt64(value);\n    }\n    /**\n     * Add a `float32` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param value The `float32` to add the buffer.\n     */\n    addFloat32(value) {\n        this.prep(4, 0);\n        this.writeFloat32(value);\n    }\n    /**\n     * Add a `float64` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param value The `float64` to add the buffer.\n     */\n    addFloat64(value) {\n        this.prep(8, 0);\n        this.writeFloat64(value);\n    }\n    addFieldInt8(voffset, value, defaultValue) {\n        if (this.force_defaults || value != defaultValue) {\n            this.addInt8(value);\n            this.slot(voffset);\n        }\n    }\n    addFieldInt16(voffset, value, defaultValue) {\n        if (this.force_defaults || value != defaultValue) {\n            this.addInt16(value);\n            this.slot(voffset);\n        }\n    }\n    addFieldInt32(voffset, value, defaultValue) {\n        if (this.force_defaults || value != defaultValue) {\n            this.addInt32(value);\n            this.slot(voffset);\n        }\n    }\n    addFieldInt64(voffset, value, defaultValue) {\n        if (this.force_defaults || value !== defaultValue) {\n            this.addInt64(value);\n            this.slot(voffset);\n        }\n    }\n    addFieldFloat32(voffset, value, defaultValue) {\n        if (this.force_defaults || value != defaultValue) {\n            this.addFloat32(value);\n            this.slot(voffset);\n        }\n    }\n    addFieldFloat64(voffset, value, defaultValue) {\n        if (this.force_defaults || value != defaultValue) {\n            this.addFloat64(value);\n            this.slot(voffset);\n        }\n    }\n    addFieldOffset(voffset, value, defaultValue) {\n        if (this.force_defaults || value != defaultValue) {\n            this.addOffset(value);\n            this.slot(voffset);\n        }\n    }\n    /**\n     * Structs are stored inline, so nothing additional is being added. `d` is always 0.\n     */\n    addFieldStruct(voffset, value, defaultValue) {\n        if (value != defaultValue) {\n            this.nested(value);\n            this.slot(voffset);\n        }\n    }\n    /**\n     * Structures are always stored inline, they need to be created right\n     * where they're used.  You'll get this assertion failure if you\n     * created it elsewhere.\n     */\n    nested(obj) {\n        if (obj != this.offset()) {\n            throw new TypeError('FlatBuffers: struct must be serialized inline.');\n        }\n    }\n    /**\n     * Should not be creating any other object, string or vector\n     * while an object is being constructed\n     */\n    notNested() {\n        if (this.isNested) {\n            throw new TypeError('FlatBuffers: object serialization must not be nested.');\n        }\n    }\n    /**\n     * Set the current vtable at `voffset` to the current location in the buffer.\n     */\n    slot(voffset) {\n        if (this.vtable !== null)\n            this.vtable[voffset] = this.offset();\n    }\n    /**\n     * @returns Offset relative to the end of the buffer.\n     */\n    offset() {\n        return this.bb.capacity() - this.space;\n    }\n    /**\n     * Doubles the size of the backing ByteBuffer and copies the old data towards\n     * the end of the new buffer (since we build the buffer backwards).\n     *\n     * @param bb The current buffer with the existing data\n     * @returns A new byte buffer with the old data copied\n     * to it. The data is located at the end of the buffer.\n     *\n     * uint8Array.set() formally takes {Array<number>|ArrayBufferView}, so to pass\n     * it a uint8Array we need to suppress the type check:\n     * @suppress {checkTypes}\n     */\n    static growByteBuffer(bb) {\n        const old_buf_size = bb.capacity();\n        // Ensure we don't grow beyond what fits in an int.\n        if (old_buf_size & 0xC0000000) {\n            throw new Error('FlatBuffers: cannot grow buffer beyond 2 gigabytes.');\n        }\n        const new_buf_size = old_buf_size << 1;\n        const nbb = ByteBuffer.allocate(new_buf_size);\n        nbb.setPosition(new_buf_size - old_buf_size);\n        nbb.bytes().set(bb.bytes(), new_buf_size - old_buf_size);\n        return nbb;\n    }\n    /**\n     * Adds on offset, relative to where it will be written.\n     *\n     * @param offset The offset to add.\n     */\n    addOffset(offset) {\n        this.prep(SIZEOF_INT, 0); // Ensure alignment is already done.\n        this.writeInt32(this.offset() - offset + SIZEOF_INT);\n    }\n    /**\n     * Start encoding a new object in the buffer.  Users will not usually need to\n     * call this directly. The FlatBuffers compiler will generate helper methods\n     * that call this method internally.\n     */\n    startObject(numfields) {\n        this.notNested();\n        if (this.vtable == null) {\n            this.vtable = [];\n        }\n        this.vtable_in_use = numfields;\n        for (let i = 0; i < numfields; i++) {\n            this.vtable[i] = 0; // This will push additional elements as needed\n        }\n        this.isNested = true;\n        this.object_start = this.offset();\n    }\n    /**\n     * Finish off writing the object that is under construction.\n     *\n     * @returns The offset to the object inside `dataBuffer`\n     */\n    endObject() {\n        if (this.vtable == null || !this.isNested) {\n            throw new Error('FlatBuffers: endObject called without startObject');\n        }\n        this.addInt32(0);\n        const vtableloc = this.offset();\n        // Trim trailing zeroes.\n        let i = this.vtable_in_use - 1;\n        // eslint-disable-next-line no-empty\n        for (; i >= 0 && this.vtable[i] == 0; i--) { }\n        const trimmed_size = i + 1;\n        // Write out the current vtable.\n        for (; i >= 0; i--) {\n            // Offset relative to the start of the table.\n            this.addInt16(this.vtable[i] != 0 ? vtableloc - this.vtable[i] : 0);\n        }\n        const standard_fields = 2; // The fields below:\n        this.addInt16(vtableloc - this.object_start);\n        const len = (trimmed_size + standard_fields) * SIZEOF_SHORT;\n        this.addInt16(len);\n        // Search for an existing vtable that matches the current one.\n        let existing_vtable = 0;\n        const vt1 = this.space;\n        outer_loop: for (i = 0; i < this.vtables.length; i++) {\n            const vt2 = this.bb.capacity() - this.vtables[i];\n            if (len == this.bb.readInt16(vt2)) {\n                for (let j = SIZEOF_SHORT; j < len; j += SIZEOF_SHORT) {\n                    if (this.bb.readInt16(vt1 + j) != this.bb.readInt16(vt2 + j)) {\n                        continue outer_loop;\n                    }\n                }\n                existing_vtable = this.vtables[i];\n                break;\n            }\n        }\n        if (existing_vtable) {\n            // Found a match:\n            // Remove the current vtable.\n            this.space = this.bb.capacity() - vtableloc;\n            // Point table to existing vtable.\n            this.bb.writeInt32(this.space, existing_vtable - vtableloc);\n        }\n        else {\n            // No match:\n            // Add the location of the current vtable to the list of vtables.\n            this.vtables.push(this.offset());\n            // Point table to current vtable.\n            this.bb.writeInt32(this.bb.capacity() - vtableloc, this.offset() - vtableloc);\n        }\n        this.isNested = false;\n        return vtableloc;\n    }\n    /**\n     * Finalize a buffer, poiting to the given `root_table`.\n     */\n    finish(root_table, opt_file_identifier, opt_size_prefix) {\n        const size_prefix = opt_size_prefix ? SIZE_PREFIX_LENGTH : 0;\n        if (opt_file_identifier) {\n            const file_identifier = opt_file_identifier;\n            this.prep(this.minalign, SIZEOF_INT +\n                FILE_IDENTIFIER_LENGTH + size_prefix);\n            if (file_identifier.length != FILE_IDENTIFIER_LENGTH) {\n                throw new TypeError('FlatBuffers: file identifier must be length ' +\n                    FILE_IDENTIFIER_LENGTH);\n            }\n            for (let i = FILE_IDENTIFIER_LENGTH - 1; i >= 0; i--) {\n                this.writeInt8(file_identifier.charCodeAt(i));\n            }\n        }\n        this.prep(this.minalign, SIZEOF_INT + size_prefix);\n        this.addOffset(root_table);\n        if (size_prefix) {\n            this.addInt32(this.bb.capacity() - this.space);\n        }\n        this.bb.setPosition(this.space);\n    }\n    /**\n     * Finalize a size prefixed buffer, pointing to the given `root_table`.\n     */\n    finishSizePrefixed(root_table, opt_file_identifier) {\n        this.finish(root_table, opt_file_identifier, true);\n    }\n    /**\n     * This checks a required field has been set in a given table that has\n     * just been constructed.\n     */\n    requiredField(table, field) {\n        const table_start = this.bb.capacity() - table;\n        const vtable_start = table_start - this.bb.readInt32(table_start);\n        const ok = field < this.bb.readInt16(vtable_start) &&\n            this.bb.readInt16(vtable_start + field) != 0;\n        // If this fails, the caller will show what field needs to be set.\n        if (!ok) {\n            throw new TypeError('FlatBuffers: field ' + field + ' must be set');\n        }\n    }\n    /**\n     * Start a new array/vector of objects.  Users usually will not call\n     * this directly. The FlatBuffers compiler will create a start/end\n     * method for vector types in generated code.\n     *\n     * @param elem_size The size of each element in the array\n     * @param num_elems The number of elements in the array\n     * @param alignment The alignment of the array\n     */\n    startVector(elem_size, num_elems, alignment) {\n        this.notNested();\n        this.vector_num_elems = num_elems;\n        this.prep(SIZEOF_INT, elem_size * num_elems);\n        this.prep(alignment, elem_size * num_elems); // Just in case alignment > int.\n    }\n    /**\n     * Finish off the creation of an array and all its elements. The array must be\n     * created with `startVector`.\n     *\n     * @returns The offset at which the newly created array\n     * starts.\n     */\n    endVector() {\n        this.writeInt32(this.vector_num_elems);\n        return this.offset();\n    }\n    /**\n     * Encode the string `s` in the buffer using UTF-8. If the string passed has\n     * already been seen, we return the offset of the already written string\n     *\n     * @param s The string to encode\n     * @return The offset in the buffer where the encoded string starts\n     */\n    createSharedString(s) {\n        if (!s) {\n            return 0;\n        }\n        if (!this.string_maps) {\n            this.string_maps = new Map();\n        }\n        if (this.string_maps.has(s)) {\n            return this.string_maps.get(s);\n        }\n        const offset = this.createString(s);\n        this.string_maps.set(s, offset);\n        return offset;\n    }\n    /**\n     * Encode the string `s` in the buffer using UTF-8. If a Uint8Array is passed\n     * instead of a string, it is assumed to contain valid UTF-8 encoded data.\n     *\n     * @param s The string to encode\n     * @return The offset in the buffer where the encoded string starts\n     */\n    createString(s) {\n        if (s === null || s === undefined) {\n            return 0;\n        }\n        let utf8;\n        if (s instanceof Uint8Array) {\n            utf8 = s;\n        }\n        else {\n            utf8 = this.text_encoder.encode(s);\n        }\n        this.addInt8(0);\n        this.startVector(1, utf8.length, 1);\n        this.bb.setPosition(this.space -= utf8.length);\n        this.bb.bytes().set(utf8, this.space);\n        return this.endVector();\n    }\n    /**\n     * Create a byte vector.\n     *\n     * @param v The bytes to add\n     * @returns The offset in the buffer where the byte vector starts\n     */\n    createByteVector(v) {\n        if (v === null || v === undefined) {\n            return 0;\n        }\n        this.startVector(1, v.length, 1);\n        this.bb.setPosition(this.space -= v.length);\n        this.bb.bytes().set(v, this.space);\n        return this.endVector();\n    }\n    /**\n     * A helper function to pack an object\n     *\n     * @returns offset of obj\n     */\n    createObjectOffset(obj) {\n        if (obj === null) {\n            return 0;\n        }\n        if (typeof obj === 'string') {\n            return this.createString(obj);\n        }\n        else {\n            return obj.pack(this);\n        }\n    }\n    /**\n     * A helper function to pack a list of object\n     *\n     * @returns list of offsets of each non null object\n     */\n    createObjectOffsetList(list) {\n        const ret = [];\n        for (let i = 0; i < list.length; ++i) {\n            const val = list[i];\n            if (val !== null) {\n                ret.push(this.createObjectOffset(val));\n            }\n            else {\n                throw new TypeError('FlatBuffers: Argument for createObjectOffsetList cannot contain null.');\n            }\n        }\n        return ret;\n    }\n    createStructOffsetList(list, startFunc) {\n        startFunc(this, list.length);\n        this.createObjectOffsetList(list.slice().reverse());\n        return this.endVector();\n    }\n}\n","\n/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//const Z_FILTERED          = 1;\n//const Z_HUFFMAN_ONLY      = 2;\n//const Z_RLE               = 3;\nconst Z_FIXED$1               = 4;\n//const Z_DEFAULT_STRATEGY  = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nconst Z_BINARY              = 0;\nconst Z_TEXT                = 1;\n//const Z_ASCII             = 1; // = Z_TEXT\nconst Z_UNKNOWN$1             = 2;\n\n/*============================================================================*/\n\n\nfunction zero$1(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nconst STORED_BLOCK = 0;\nconst STATIC_TREES = 1;\nconst DYN_TREES    = 2;\n/* The three kinds of block type */\n\nconst MIN_MATCH$1    = 3;\nconst MAX_MATCH$1    = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nconst LENGTH_CODES$1  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nconst LITERALS$1      = 256;\n/* number of literal bytes 0..255 */\n\nconst L_CODES$1       = LITERALS$1 + 1 + LENGTH_CODES$1;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nconst D_CODES$1       = 30;\n/* number of distance codes */\n\nconst BL_CODES$1      = 19;\n/* number of codes used to transfer the bit lengths */\n\nconst HEAP_SIZE$1     = 2 * L_CODES$1 + 1;\n/* maximum heap size */\n\nconst MAX_BITS$1      = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst Buf_size      = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nconst MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nconst END_BLOCK   = 256;\n/* end of block literal code */\n\nconst REP_3_6     = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nconst REPZ_3_10   = 17;\n/* repeat a zero length 3-10 times  (3 bits of repeat count) */\n\nconst REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times  (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nconst extra_lbits =   /* extra bits for each length code */\n  new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]);\n\nconst extra_dbits =   /* extra bits for each distance code */\n  new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]);\n\nconst extra_blbits =  /* extra bits for each bit length code */\n  new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]);\n\nconst bl_order =\n  new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nconst DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nconst static_ltree  = new Array((L_CODES$1 + 2) * 2);\nzero$1(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nconst static_dtree  = new Array(D_CODES$1 * 2);\nzero$1(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nconst _dist_code    = new Array(DIST_CODE_LEN);\nzero$1(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nconst _length_code  = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1);\nzero$1(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nconst base_length   = new Array(LENGTH_CODES$1);\nzero$1(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nconst base_dist     = new Array(D_CODES$1);\nzero$1(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n  this.static_tree  = static_tree;  /* static tree or NULL */\n  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */\n  this.extra_base   = extra_base;   /* base index for extra_bits */\n  this.elems        = elems;        /* max number of elements in the tree */\n  this.max_length   = max_length;   /* max bit length for the codes */\n\n  // show if `static_tree` has data or dummy - needed for monomorphic objects\n  this.has_stree    = static_tree && static_tree.length;\n}\n\n\nlet static_l_desc;\nlet static_d_desc;\nlet static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n  this.dyn_tree = dyn_tree;     /* the dynamic tree */\n  this.max_code = 0;            /* largest code with non zero frequency */\n  this.stat_desc = stat_desc;   /* the corresponding static tree */\n}\n\n\n\nconst d_code = (dist) => {\n\n  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n};\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nconst put_short = (s, w) => {\n//    put_byte(s, (uch)((w) & 0xff));\n//    put_byte(s, (uch)((ush)(w) >> 8));\n  s.pending_buf[s.pending++] = (w) & 0xff;\n  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n};\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nconst send_bits = (s, value, length) => {\n\n  if (s.bi_valid > (Buf_size - length)) {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    put_short(s, s.bi_buf);\n    s.bi_buf = value >> (Buf_size - s.bi_valid);\n    s.bi_valid += length - Buf_size;\n  } else {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    s.bi_valid += length;\n  }\n};\n\n\nconst send_code = (s, c, tree) => {\n\n  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n};\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nconst bi_reverse = (code, len) => {\n\n  let res = 0;\n  do {\n    res |= code & 1;\n    code >>>= 1;\n    res <<= 1;\n  } while (--len > 0);\n  return res >>> 1;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nconst bi_flush = (s) => {\n\n  if (s.bi_valid === 16) {\n    put_short(s, s.bi_buf);\n    s.bi_buf = 0;\n    s.bi_valid = 0;\n\n  } else if (s.bi_valid >= 8) {\n    s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n    s.bi_buf >>= 8;\n    s.bi_valid -= 8;\n  }\n};\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n *    above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n *     array bl_count contains the frequencies for each bit length.\n *     The length opt_len is updated; static_len is also updated if stree is\n *     not null.\n */\nconst gen_bitlen = (s, desc) => {\n//    deflate_state *s;\n//    tree_desc *desc;    /* the tree descriptor */\n\n  const tree            = desc.dyn_tree;\n  const max_code        = desc.max_code;\n  const stree           = desc.stat_desc.static_tree;\n  const has_stree       = desc.stat_desc.has_stree;\n  const extra           = desc.stat_desc.extra_bits;\n  const base            = desc.stat_desc.extra_base;\n  const max_length      = desc.stat_desc.max_length;\n  let h;              /* heap index */\n  let n, m;           /* iterate over the tree elements */\n  let bits;           /* bit length */\n  let xbits;          /* extra bits */\n  let f;              /* frequency */\n  let overflow = 0;   /* number of elements with bit length too large */\n\n  for (bits = 0; bits <= MAX_BITS$1; bits++) {\n    s.bl_count[bits] = 0;\n  }\n\n  /* In a first pass, compute the optimal bit lengths (which may\n   * overflow in the case of the bit length tree).\n   */\n  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n  for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) {\n    n = s.heap[h];\n    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n    if (bits > max_length) {\n      bits = max_length;\n      overflow++;\n    }\n    tree[n * 2 + 1]/*.Len*/ = bits;\n    /* We overwrite tree[n].Dad which is no longer needed */\n\n    if (n > max_code) { continue; } /* not a leaf node */\n\n    s.bl_count[bits]++;\n    xbits = 0;\n    if (n >= base) {\n      xbits = extra[n - base];\n    }\n    f = tree[n * 2]/*.Freq*/;\n    s.opt_len += f * (bits + xbits);\n    if (has_stree) {\n      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n    }\n  }\n  if (overflow === 0) { return; }\n\n  // Tracev((stderr,\"\\nbit length overflow\\n\"));\n  /* This happens for example on obj2 and pic of the Calgary corpus */\n\n  /* Find the first bit length which could increase: */\n  do {\n    bits = max_length - 1;\n    while (s.bl_count[bits] === 0) { bits--; }\n    s.bl_count[bits]--;      /* move one leaf down the tree */\n    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n    s.bl_count[max_length]--;\n    /* The brother of the overflow item also moves one step up,\n     * but this does not affect bl_count[max_length]\n     */\n    overflow -= 2;\n  } while (overflow > 0);\n\n  /* Now recompute all bit lengths, scanning in increasing frequency.\n   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n   * lengths instead of fixing only the wrong ones. This idea is taken\n   * from 'ar' written by Haruhiko Okumura.)\n   */\n  for (bits = max_length; bits !== 0; bits--) {\n    n = s.bl_count[bits];\n    while (n !== 0) {\n      m = s.heap[--h];\n      if (m > max_code) { continue; }\n      if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n        // Tracev((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n        tree[m * 2 + 1]/*.Len*/ = bits;\n      }\n      n--;\n    }\n  }\n};\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n *     zero code length.\n */\nconst gen_codes = (tree, max_code, bl_count) => {\n//    ct_data *tree;             /* the tree to decorate */\n//    int max_code;              /* largest code with non zero frequency */\n//    ushf *bl_count;            /* number of codes at each bit length */\n\n  const next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */\n  let code = 0;              /* running code value */\n  let bits;                  /* bit index */\n  let n;                     /* code index */\n\n  /* The distribution counts are first used to generate the code values\n   * without bit reversal.\n   */\n  for (bits = 1; bits <= MAX_BITS$1; bits++) {\n    code = (code + bl_count[bits - 1]) << 1;\n    next_code[bits] = code;\n  }\n  /* Check that the bit counts in bl_count are consistent. The last code\n   * must be all ones.\n   */\n  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n  //        \"inconsistent bit counts\");\n  //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n  for (n = 0;  n <= max_code; n++) {\n    let len = tree[n * 2 + 1]/*.Len*/;\n    if (len === 0) { continue; }\n    /* Now reverse the bits */\n    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);\n\n    //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n  }\n};\n\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nconst tr_static_init = () => {\n\n  let n;        /* iterates over tree elements */\n  let bits;     /* bit counter */\n  let length;   /* length value */\n  let code;     /* code value */\n  let dist;     /* distance index */\n  const bl_count = new Array(MAX_BITS$1 + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  // do check in _tr_init()\n  //if (static_init_done) return;\n\n  /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n  static_l_desc.static_tree = static_ltree;\n  static_l_desc.extra_bits = extra_lbits;\n  static_d_desc.static_tree = static_dtree;\n  static_d_desc.extra_bits = extra_dbits;\n  static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n  /* Initialize the mapping length (0..255) -> length code (0..28) */\n  length = 0;\n  for (code = 0; code < LENGTH_CODES$1 - 1; code++) {\n    base_length[code] = length;\n    for (n = 0; n < (1 << extra_lbits[code]); n++) {\n      _length_code[length++] = code;\n    }\n  }\n  //Assert (length == 256, \"tr_static_init: length != 256\");\n  /* Note that the length 255 (match length 258) can be represented\n   * in two different ways: code 284 + 5 bits or code 285, so we\n   * overwrite length_code[255] to use the best encoding:\n   */\n  _length_code[length - 1] = code;\n\n  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n  dist = 0;\n  for (code = 0; code < 16; code++) {\n    base_dist[code] = dist;\n    for (n = 0; n < (1 << extra_dbits[code]); n++) {\n      _dist_code[dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: dist != 256\");\n  dist >>= 7; /* from now on, all distances are divided by 128 */\n  for (; code < D_CODES$1; code++) {\n    base_dist[code] = dist << 7;\n    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n      _dist_code[256 + dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n  /* Construct the codes of the static literal tree */\n  for (bits = 0; bits <= MAX_BITS$1; bits++) {\n    bl_count[bits] = 0;\n  }\n\n  n = 0;\n  while (n <= 143) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  while (n <= 255) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 9;\n    n++;\n    bl_count[9]++;\n  }\n  while (n <= 279) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 7;\n    n++;\n    bl_count[7]++;\n  }\n  while (n <= 287) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  /* Codes 286 and 287 do not exist, but we must include them in the\n   * tree construction to get a canonical Huffman tree (longest code\n   * all ones)\n   */\n  gen_codes(static_ltree, L_CODES$1 + 1, bl_count);\n\n  /* The static distance tree is trivial: */\n  for (n = 0; n < D_CODES$1; n++) {\n    static_dtree[n * 2 + 1]/*.Len*/ = 5;\n    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n  }\n\n  // Now data ready and we can init static trees\n  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1);\n  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES$1, MAX_BITS$1);\n  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES$1, MAX_BL_BITS);\n\n  //static_init_done = true;\n};\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nconst init_block = (s) => {\n\n  let n; /* iterates over tree elements */\n\n  /* Initialize the trees. */\n  for (n = 0; n < L_CODES$1;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < D_CODES$1;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < BL_CODES$1; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n  s.opt_len = s.static_len = 0;\n  s.sym_next = s.matches = 0;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nconst bi_windup = (s) =>\n{\n  if (s.bi_valid > 8) {\n    put_short(s, s.bi_buf);\n  } else if (s.bi_valid > 0) {\n    //put_byte(s, (Byte)s->bi_buf);\n    s.pending_buf[s.pending++] = s.bi_buf;\n  }\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n};\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nconst smaller = (tree, n, m, depth) => {\n\n  const _n2 = n * 2;\n  const _m2 = m * 2;\n  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n};\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nconst pqdownheap = (s, tree, k) => {\n//    deflate_state *s;\n//    ct_data *tree;  /* the tree to restore */\n//    int k;               /* node to move down */\n\n  const v = s.heap[k];\n  let j = k << 1;  /* left son of k */\n  while (j <= s.heap_len) {\n    /* Set j to the smallest of the two sons: */\n    if (j < s.heap_len &&\n      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n      j++;\n    }\n    /* Exit if v is smaller than both sons */\n    if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n    /* Exchange v with the smallest son */\n    s.heap[k] = s.heap[j];\n    k = j;\n\n    /* And continue down the tree, setting j to the left son of k */\n    j <<= 1;\n  }\n  s.heap[k] = v;\n};\n\n\n// inlined manually\n// const SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nconst compress_block = (s, ltree, dtree) => {\n//    deflate_state *s;\n//    const ct_data *ltree; /* literal tree */\n//    const ct_data *dtree; /* distance tree */\n\n  let dist;           /* distance of matched string */\n  let lc;             /* match length or unmatched char (if dist == 0) */\n  let sx = 0;         /* running index in sym_buf */\n  let code;           /* the code to send */\n  let extra;          /* number of extra bits to send */\n\n  if (s.sym_next !== 0) {\n    do {\n      dist = s.pending_buf[s.sym_buf + sx++] & 0xff;\n      dist += (s.pending_buf[s.sym_buf + sx++] & 0xff) << 8;\n      lc = s.pending_buf[s.sym_buf + sx++];\n      if (dist === 0) {\n        send_code(s, lc, ltree); /* send a literal byte */\n        //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n      } else {\n        /* Here, lc is the match length - MIN_MATCH */\n        code = _length_code[lc];\n        send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */\n        extra = extra_lbits[code];\n        if (extra !== 0) {\n          lc -= base_length[code];\n          send_bits(s, lc, extra);       /* send the extra length bits */\n        }\n        dist--; /* dist is now the match distance - 1 */\n        code = d_code(dist);\n        //Assert (code < D_CODES, \"bad d_code\");\n\n        send_code(s, code, dtree);       /* send the distance code */\n        extra = extra_dbits[code];\n        if (extra !== 0) {\n          dist -= base_dist[code];\n          send_bits(s, dist, extra);   /* send the extra distance bits */\n        }\n      } /* literal or match pair ? */\n\n      /* Check that the overlay between pending_buf and sym_buf is ok: */\n      //Assert(s->pending < s->lit_bufsize + sx, \"pendingBuf overflow\");\n\n    } while (sx < s.sym_next);\n  }\n\n  send_code(s, END_BLOCK, ltree);\n};\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n *     and corresponding code. The length opt_len is updated; static_len is\n *     also updated if stree is not null. The field max_code is set.\n */\nconst build_tree = (s, desc) => {\n//    deflate_state *s;\n//    tree_desc *desc; /* the tree descriptor */\n\n  const tree     = desc.dyn_tree;\n  const stree    = desc.stat_desc.static_tree;\n  const has_stree = desc.stat_desc.has_stree;\n  const elems    = desc.stat_desc.elems;\n  let n, m;          /* iterate over heap elements */\n  let max_code = -1; /* largest code with non zero frequency */\n  let node;          /* new node being created */\n\n  /* Construct the initial heap, with least frequent element in\n   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n   * heap[0] is not used.\n   */\n  s.heap_len = 0;\n  s.heap_max = HEAP_SIZE$1;\n\n  for (n = 0; n < elems; n++) {\n    if (tree[n * 2]/*.Freq*/ !== 0) {\n      s.heap[++s.heap_len] = max_code = n;\n      s.depth[n] = 0;\n\n    } else {\n      tree[n * 2 + 1]/*.Len*/ = 0;\n    }\n  }\n\n  /* The pkzip format requires that at least one distance code exists,\n   * and that at least one bit should be sent even if there is only one\n   * possible code. So to avoid special checks later on we force at least\n   * two codes of non zero frequency.\n   */\n  while (s.heap_len < 2) {\n    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n    tree[node * 2]/*.Freq*/ = 1;\n    s.depth[node] = 0;\n    s.opt_len--;\n\n    if (has_stree) {\n      s.static_len -= stree[node * 2 + 1]/*.Len*/;\n    }\n    /* node is 0 or 1 so it does not have extra bits */\n  }\n  desc.max_code = max_code;\n\n  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n   * establish sub-heaps of increasing lengths:\n   */\n  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n  /* Construct the Huffman tree by repeatedly combining the least two\n   * frequent nodes.\n   */\n  node = elems;              /* next internal node of the tree */\n  do {\n    //pqremove(s, tree, n);  /* n = node of least frequency */\n    /*** pqremove ***/\n    n = s.heap[1/*SMALLEST*/];\n    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n    /***/\n\n    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n    s.heap[--s.heap_max] = m;\n\n    /* Create a new node father of n and m */\n    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n    /* and insert the new node in the heap */\n    s.heap[1/*SMALLEST*/] = node++;\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n\n  } while (s.heap_len >= 2);\n\n  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n  /* At this point, the fields freq and dad are set. We can now\n   * generate the bit lengths.\n   */\n  gen_bitlen(s, desc);\n\n  /* The field len is now set, we can generate the bit codes */\n  gen_codes(tree, max_code, s.bl_count);\n};\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nconst scan_tree = (s, tree, max_code) => {\n//    deflate_state *s;\n//    ct_data *tree;   /* the tree to be scanned */\n//    int max_code;    /* and its largest code of non zero frequency */\n\n  let n;                     /* iterates over all tree elements */\n  let prevlen = -1;          /* last emitted length */\n  let curlen;                /* length of current code */\n\n  let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  let count = 0;             /* repeat count of the current code */\n  let max_count = 7;         /* max repeat count */\n  let min_count = 4;         /* min repeat count */\n\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n    } else if (curlen !== 0) {\n\n      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n    } else if (count <= 10) {\n      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n    } else {\n      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n    }\n\n    count = 0;\n    prevlen = curlen;\n\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n};\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nconst send_tree = (s, tree, max_code) => {\n//    deflate_state *s;\n//    ct_data *tree; /* the tree to be scanned */\n//    int max_code;       /* and its largest code of non zero frequency */\n\n  let n;                     /* iterates over all tree elements */\n  let prevlen = -1;          /* last emitted length */\n  let curlen;                /* length of current code */\n\n  let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  let count = 0;             /* repeat count of the current code */\n  let max_count = 7;         /* max repeat count */\n  let min_count = 4;         /* min repeat count */\n\n  /* tree[max_code+1].Len = -1; */  /* guard already set */\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n    } else if (curlen !== 0) {\n      if (curlen !== prevlen) {\n        send_code(s, curlen, s.bl_tree);\n        count--;\n      }\n      //Assert(count >= 3 && count <= 6, \" 3_6?\");\n      send_code(s, REP_3_6, s.bl_tree);\n      send_bits(s, count - 3, 2);\n\n    } else if (count <= 10) {\n      send_code(s, REPZ_3_10, s.bl_tree);\n      send_bits(s, count - 3, 3);\n\n    } else {\n      send_code(s, REPZ_11_138, s.bl_tree);\n      send_bits(s, count - 11, 7);\n    }\n\n    count = 0;\n    prevlen = curlen;\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n};\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nconst build_bl_tree = (s) => {\n\n  let max_blindex;  /* index of last bit length code of non zero freq */\n\n  /* Determine the bit length frequencies for literal and distance trees */\n  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n  /* Build the bit length tree: */\n  build_tree(s, s.bl_desc);\n  /* opt_len now includes the length of the tree representations, except\n   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n   */\n\n  /* Determine the number of bit length codes to send. The pkzip format\n   * requires that at least 4 bit length codes be sent. (appnote.txt says\n   * 3 but the actual value used is 4.)\n   */\n  for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) {\n    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n      break;\n    }\n  }\n  /* Update opt_len to include the bit length tree and counts */\n  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n  //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n  //        s->opt_len, s->static_len));\n\n  return max_blindex;\n};\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nconst send_all_trees = (s, lcodes, dcodes, blcodes) => {\n//    deflate_state *s;\n//    int lcodes, dcodes, blcodes; /* number of codes for each tree */\n\n  let rank;                    /* index in bl_order */\n\n  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n  //        \"too many codes\");\n  //Tracev((stderr, \"\\nbl counts: \"));\n  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n  send_bits(s, dcodes - 1,   5);\n  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */\n  for (rank = 0; rank < blcodes; rank++) {\n    //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n  }\n  //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n  //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n  //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n};\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n *    a) There are no non-portable control characters belonging to the\n *       \"block list\" (0..6, 14..25, 28..31).\n *    b) There is at least one printable character belonging to the\n *       \"allow list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n *   \"gray list\" that is ignored in this detection algorithm:\n *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nconst detect_data_type = (s) => {\n  /* block_mask is the bit mask of block-listed bytes\n   * set bits 0..6, 14..25, and 28..31\n   * 0xf3ffc07f = binary 11110011111111111100000001111111\n   */\n  let block_mask = 0xf3ffc07f;\n  let n;\n\n  /* Check for non-textual (\"block-listed\") bytes. */\n  for (n = 0; n <= 31; n++, block_mask >>>= 1) {\n    if ((block_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n      return Z_BINARY;\n    }\n  }\n\n  /* Check for textual (\"allow-listed\") bytes. */\n  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n    return Z_TEXT;\n  }\n  for (n = 32; n < LITERALS$1; n++) {\n    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n      return Z_TEXT;\n    }\n  }\n\n  /* There are no \"block-listed\" or \"allow-listed\" bytes:\n   * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n   */\n  return Z_BINARY;\n};\n\n\nlet static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nconst _tr_init$1 = (s) =>\n{\n\n  if (!static_init_done) {\n    tr_static_init();\n    static_init_done = true;\n  }\n\n  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);\n  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);\n  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n\n  /* Initialize the first block of the first file: */\n  init_block(s);\n};\n\n\n/* ===========================================================================\n * Send a stored block\n */\nconst _tr_stored_block$1 = (s, buf, stored_len, last) => {\n//DeflateState *s;\n//charf *buf;       /* input block */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n\n  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */\n  bi_windup(s);        /* align on byte boundary */\n  put_short(s, stored_len);\n  put_short(s, ~stored_len);\n  if (stored_len) {\n    s.pending_buf.set(s.window.subarray(buf, buf + stored_len), s.pending);\n  }\n  s.pending += stored_len;\n};\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nconst _tr_align$1 = (s) => {\n  send_bits(s, STATIC_TREES << 1, 3);\n  send_code(s, END_BLOCK, static_ltree);\n  bi_flush(s);\n};\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and write out the encoded block.\n */\nconst _tr_flush_block$1 = (s, buf, stored_len, last) => {\n//DeflateState *s;\n//charf *buf;       /* input block, or NULL if too old */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n\n  let opt_lenb, static_lenb;  /* opt_len and static_len in bytes */\n  let max_blindex = 0;        /* index of last bit length code of non zero freq */\n\n  /* Build the Huffman trees unless a stored block is forced */\n  if (s.level > 0) {\n\n    /* Check if the file is binary or text */\n    if (s.strm.data_type === Z_UNKNOWN$1) {\n      s.strm.data_type = detect_data_type(s);\n    }\n\n    /* Construct the literal and distance trees */\n    build_tree(s, s.l_desc);\n    // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n\n    build_tree(s, s.d_desc);\n    // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n    /* At this point, opt_len and static_len are the total bit lengths of\n     * the compressed block data, excluding the tree representations.\n     */\n\n    /* Build the bit length tree for the above two trees, and get the index\n     * in bl_order of the last bit length code to send.\n     */\n    max_blindex = build_bl_tree(s);\n\n    /* Determine the best encoding. Compute the block lengths in bytes. */\n    opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n    static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n    // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n    //        s->sym_next / 3));\n\n    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n  } else {\n    // Assert(buf != (char*)0, \"lost buf\");\n    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n  }\n\n  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n    /* 4: two words for the lengths */\n\n    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n     * Otherwise we can't have processed more than WSIZE input bytes since\n     * the last block flush, because compression would have been\n     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n     * transform a block into a stored block.\n     */\n    _tr_stored_block$1(s, buf, stored_len, last);\n\n  } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) {\n\n    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n    compress_block(s, static_ltree, static_dtree);\n\n  } else {\n    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n    compress_block(s, s.dyn_ltree, s.dyn_dtree);\n  }\n  // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n  /* The above check is made mod 2^32, for files larger than 512 MB\n   * and uLong implemented on 32 bits.\n   */\n  init_block(s);\n\n  if (last) {\n    bi_windup(s);\n  }\n  // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n  //       s->compressed_len-7*last));\n};\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nconst _tr_tally$1 = (s, dist, lc) => {\n//    deflate_state *s;\n//    unsigned dist;  /* distance of matched string */\n//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */\n\n  s.pending_buf[s.sym_buf + s.sym_next++] = dist;\n  s.pending_buf[s.sym_buf + s.sym_next++] = dist >> 8;\n  s.pending_buf[s.sym_buf + s.sym_next++] = lc;\n  if (dist === 0) {\n    /* lc is the unmatched char */\n    s.dyn_ltree[lc * 2]/*.Freq*/++;\n  } else {\n    s.matches++;\n    /* Here, lc is the match length - MIN_MATCH */\n    dist--;             /* dist = match distance - 1 */\n    //Assert((ush)dist < (ush)MAX_DIST(s) &&\n    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n    //       (ush)d_code(dist) < (ush)D_CODES,  \"_tr_tally: bad match\");\n\n    s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2]/*.Freq*/++;\n    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n  }\n\n  return (s.sym_next === s.sym_end);\n};\n\nvar _tr_init_1  = _tr_init$1;\nvar _tr_stored_block_1 = _tr_stored_block$1;\nvar _tr_flush_block_1  = _tr_flush_block$1;\nvar _tr_tally_1 = _tr_tally$1;\nvar _tr_align_1 = _tr_align$1;\n\nvar trees = {\n\t_tr_init: _tr_init_1,\n\t_tr_stored_block: _tr_stored_block_1,\n\t_tr_flush_block: _tr_flush_block_1,\n\t_tr_tally: _tr_tally_1,\n\t_tr_align: _tr_align_1\n};\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst adler32 = (adler, buf, len, pos) => {\n  let s1 = (adler & 0xffff) |0,\n      s2 = ((adler >>> 16) & 0xffff) |0,\n      n = 0;\n\n  while (len !== 0) {\n    // Set limit ~ twice less than 5552, to keep\n    // s2 in 31-bits, because we force signed ints.\n    // in other case %= will fail.\n    n = len > 2000 ? 2000 : len;\n    len -= n;\n\n    do {\n      s1 = (s1 + buf[pos++]) |0;\n      s2 = (s2 + s1) |0;\n    } while (--n);\n\n    s1 %= 65521;\n    s2 %= 65521;\n  }\n\n  return (s1 | (s2 << 16)) |0;\n};\n\n\nvar adler32_1 = adler32;\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nconst makeTable = () => {\n  let c, table = [];\n\n  for (var n = 0; n < 256; n++) {\n    c = n;\n    for (var k = 0; k < 8; k++) {\n      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n    }\n    table[n] = c;\n  }\n\n  return table;\n};\n\n// Create table on load. Just 255 signed longs. Not a problem.\nconst crcTable = new Uint32Array(makeTable());\n\n\nconst crc32 = (crc, buf, len, pos) => {\n  const t = crcTable;\n  const end = pos + len;\n\n  crc ^= -1;\n\n  for (let i = pos; i < end; i++) {\n    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n  }\n\n  return (crc ^ (-1)); // >>> 0;\n};\n\n\nvar crc32_1 = crc32;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar messages = {\n  2:      'need dictionary',     /* Z_NEED_DICT       2  */\n  1:      'stream end',          /* Z_STREAM_END      1  */\n  0:      '',                    /* Z_OK              0  */\n  '-1':   'file error',          /* Z_ERRNO         (-1) */\n  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */\n  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */\n  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */\n  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */\n  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar constants$2 = {\n\n  /* Allowed flush values; see deflate() and inflate() below for details */\n  Z_NO_FLUSH:         0,\n  Z_PARTIAL_FLUSH:    1,\n  Z_SYNC_FLUSH:       2,\n  Z_FULL_FLUSH:       3,\n  Z_FINISH:           4,\n  Z_BLOCK:            5,\n  Z_TREES:            6,\n\n  /* Return codes for the compression/decompression functions. Negative values\n  * are errors, positive values are used for special but normal events.\n  */\n  Z_OK:               0,\n  Z_STREAM_END:       1,\n  Z_NEED_DICT:        2,\n  Z_ERRNO:           -1,\n  Z_STREAM_ERROR:    -2,\n  Z_DATA_ERROR:      -3,\n  Z_MEM_ERROR:       -4,\n  Z_BUF_ERROR:       -5,\n  //Z_VERSION_ERROR: -6,\n\n  /* compression levels */\n  Z_NO_COMPRESSION:         0,\n  Z_BEST_SPEED:             1,\n  Z_BEST_COMPRESSION:       9,\n  Z_DEFAULT_COMPRESSION:   -1,\n\n\n  Z_FILTERED:               1,\n  Z_HUFFMAN_ONLY:           2,\n  Z_RLE:                    3,\n  Z_FIXED:                  4,\n  Z_DEFAULT_STRATEGY:       0,\n\n  /* Possible values of the data_type field (though see inflate()) */\n  Z_BINARY:                 0,\n  Z_TEXT:                   1,\n  //Z_ASCII:                1, // = Z_TEXT (deprecated)\n  Z_UNKNOWN:                2,\n\n  /* The deflate compression method */\n  Z_DEFLATED:               8\n  //Z_NULL:                 null // Use -1 or null inline, depending on var type\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = trees;\n\n\n\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n  Z_NO_FLUSH: Z_NO_FLUSH$2, Z_PARTIAL_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$3, Z_BLOCK: Z_BLOCK$1,\n  Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_BUF_ERROR: Z_BUF_ERROR$1,\n  Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1,\n  Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1,\n  Z_UNKNOWN,\n  Z_DEFLATED: Z_DEFLATED$2\n} = constants$2;\n\n/*============================================================================*/\n\n\nconst MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nconst MAX_WBITS$1 = 15;\n/* 32K LZ77 window */\nconst DEF_MEM_LEVEL = 8;\n\n\nconst LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nconst LITERALS      = 256;\n/* number of literal bytes 0..255 */\nconst L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nconst D_CODES       = 30;\n/* number of distance codes */\nconst BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\nconst HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\nconst MAX_BITS  = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst MIN_MATCH = 3;\nconst MAX_MATCH = 258;\nconst MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nconst PRESET_DICT = 0x20;\n\nconst INIT_STATE    =  42;    /* zlib header -> BUSY_STATE */\n//#ifdef GZIP\nconst GZIP_STATE    =  57;    /* gzip header -> BUSY_STATE | EXTRA_STATE */\n//#endif\nconst EXTRA_STATE   =  69;    /* gzip extra block -> NAME_STATE */\nconst NAME_STATE    =  73;    /* gzip file name -> COMMENT_STATE */\nconst COMMENT_STATE =  91;    /* gzip comment -> HCRC_STATE */\nconst HCRC_STATE    = 103;    /* gzip header CRC -> BUSY_STATE */\nconst BUSY_STATE    = 113;    /* deflate -> FINISH_STATE */\nconst FINISH_STATE  = 666;    /* stream complete */\n\nconst BS_NEED_MORE      = 1; /* block not completed, need more input or more output */\nconst BS_BLOCK_DONE     = 2; /* block flush performed */\nconst BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nconst BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */\n\nconst OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nconst err = (strm, errorCode) => {\n  strm.msg = messages[errorCode];\n  return errorCode;\n};\n\nconst rank = (f) => {\n  return ((f) * 2) - ((f) > 4 ? 9 : 0);\n};\n\nconst zero = (buf) => {\n  let len = buf.length; while (--len >= 0) { buf[len] = 0; }\n};\n\n/* ===========================================================================\n * Slide the hash table when sliding the window down (could be avoided with 32\n * bit values at the expense of memory usage). We slide even when level == 0 to\n * keep the hash table consistent if we switch back to level > 0 later.\n */\nconst slide_hash = (s) => {\n  let n, m;\n  let p;\n  let wsize = s.w_size;\n\n  n = s.hash_size;\n  p = n;\n  do {\n    m = s.head[--p];\n    s.head[p] = (m >= wsize ? m - wsize : 0);\n  } while (--n);\n  n = wsize;\n//#ifndef FASTEST\n  p = n;\n  do {\n    m = s.prev[--p];\n    s.prev[p] = (m >= wsize ? m - wsize : 0);\n    /* If n is not on any hash chain, prev[n] is garbage but\n     * its value will never be used.\n     */\n  } while (--n);\n//#endif\n};\n\n/* eslint-disable new-cap */\nlet HASH_ZLIB = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;\n// This hash causes less collisions, https://github.com/nodeca/pako/issues/135\n// But breaks binary compatibility\n//let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask;\nlet HASH = HASH_ZLIB;\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output, except for\n * some deflate_stored() output, goes through this function so some\n * applications may wish to modify it to avoid allocating a large\n * strm->next_out buffer and copying into it. (See also read_buf()).\n */\nconst flush_pending = (strm) => {\n  const s = strm.state;\n\n  //_tr_flush_bits(s);\n  let len = s.pending;\n  if (len > strm.avail_out) {\n    len = strm.avail_out;\n  }\n  if (len === 0) { return; }\n\n  strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out);\n  strm.next_out  += len;\n  s.pending_out  += len;\n  strm.total_out += len;\n  strm.avail_out -= len;\n  s.pending      -= len;\n  if (s.pending === 0) {\n    s.pending_out = 0;\n  }\n};\n\n\nconst flush_block_only = (s, last) => {\n  _tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n  s.block_start = s.strstart;\n  flush_pending(s.strm);\n};\n\n\nconst put_byte = (s, b) => {\n  s.pending_buf[s.pending++] = b;\n};\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nconst putShortMSB = (s, b) => {\n\n  //  put_byte(s, (Byte)(b >> 8));\n//  put_byte(s, (Byte)(b & 0xff));\n  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n  s.pending_buf[s.pending++] = b & 0xff;\n};\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read.  All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nconst read_buf = (strm, buf, start, size) => {\n\n  let len = strm.avail_in;\n\n  if (len > size) { len = size; }\n  if (len === 0) { return 0; }\n\n  strm.avail_in -= len;\n\n  // zmemcpy(buf, strm->next_in, len);\n  buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start);\n  if (strm.state.wrap === 1) {\n    strm.adler = adler32_1(strm.adler, buf, len, start);\n  }\n\n  else if (strm.state.wrap === 2) {\n    strm.adler = crc32_1(strm.adler, buf, len, start);\n  }\n\n  strm.next_in += len;\n  strm.total_in += len;\n\n  return len;\n};\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nconst longest_match = (s, cur_match) => {\n\n  let chain_length = s.max_chain_length;      /* max hash chain length */\n  let scan = s.strstart; /* current string */\n  let match;                       /* matched string */\n  let len;                           /* length of current match */\n  let best_len = s.prev_length;              /* best match length so far */\n  let nice_match = s.nice_match;             /* stop if match long enough */\n  const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n  const _win = s.window; // shortcut\n\n  const wmask = s.w_mask;\n  const prev  = s.prev;\n\n  /* Stop when cur_match becomes <= limit. To simplify the code,\n   * we prevent matches with the string of window index 0.\n   */\n\n  const strend = s.strstart + MAX_MATCH;\n  let scan_end1  = _win[scan + best_len - 1];\n  let scan_end   = _win[scan + best_len];\n\n  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n   * It is easy to get rid of this optimization if necessary.\n   */\n  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n  /* Do not waste too much time if we already have a good match: */\n  if (s.prev_length >= s.good_match) {\n    chain_length >>= 2;\n  }\n  /* Do not look for matches beyond the end of the input. This is necessary\n   * to make deflate deterministic.\n   */\n  if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n  do {\n    // Assert(cur_match < s->strstart, \"no future\");\n    match = cur_match;\n\n    /* Skip to next match if the match length cannot increase\n     * or if the match length is less than 2.  Note that the checks below\n     * for insufficient lookahead only occur occasionally for performance\n     * reasons.  Therefore uninitialized memory will be accessed, and\n     * conditional jumps will be made that depend on those values.\n     * However the length of the match is limited to the lookahead, so\n     * the output of deflate is not affected by the uninitialized values.\n     */\n\n    if (_win[match + best_len]     !== scan_end  ||\n        _win[match + best_len - 1] !== scan_end1 ||\n        _win[match]                !== _win[scan] ||\n        _win[++match]              !== _win[scan + 1]) {\n      continue;\n    }\n\n    /* The check at best_len-1 can be removed because it will be made\n     * again later. (This heuristic is not always a win.)\n     * It is not necessary to compare scan[2] and match[2] since they\n     * are always equal when the other bytes match, given that\n     * the hash keys are equal and that HASH_BITS >= 8.\n     */\n    scan += 2;\n    match++;\n    // Assert(*scan == *match, \"match[2]?\");\n\n    /* We check for insufficient lookahead only every 8th comparison;\n     * the 256th check will be made at strstart+258.\n     */\n    do {\n      /*jshint noempty:false*/\n    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             scan < strend);\n\n    // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n    len = MAX_MATCH - (strend - scan);\n    scan = strend - MAX_MATCH;\n\n    if (len > best_len) {\n      s.match_start = cur_match;\n      best_len = len;\n      if (len >= nice_match) {\n        break;\n      }\n      scan_end1  = _win[scan + best_len - 1];\n      scan_end   = _win[scan + best_len];\n    }\n  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n  if (best_len <= s.lookahead) {\n    return best_len;\n  }\n  return s.lookahead;\n};\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n *    At least one byte has been read, or avail_in == 0; reads are\n *    performed for at least two bytes (required for the zip translate_eol\n *    option -- not supported here).\n */\nconst fill_window = (s) => {\n\n  const _w_size = s.w_size;\n  let n, more, str;\n\n  //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n  do {\n    more = s.window_size - s.lookahead - s.strstart;\n\n    // JS ints have 32 bit, block below not needed\n    /* Deal with !@#$% 64K limit: */\n    //if (sizeof(int) <= 2) {\n    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n    //        more = wsize;\n    //\n    //  } else if (more == (unsigned)(-1)) {\n    //        /* Very unlikely, but possible on 16 bit machine if\n    //         * strstart == 0 && lookahead == 1 (input done a byte at time)\n    //         */\n    //        more--;\n    //    }\n    //}\n\n\n    /* If the window is almost full and there is insufficient lookahead,\n     * move the upper half to the lower one to make room in the upper half.\n     */\n    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n      s.window.set(s.window.subarray(_w_size, _w_size + _w_size - more), 0);\n      s.match_start -= _w_size;\n      s.strstart -= _w_size;\n      /* we now have strstart >= MAX_DIST */\n      s.block_start -= _w_size;\n      if (s.insert > s.strstart) {\n        s.insert = s.strstart;\n      }\n      slide_hash(s);\n      more += _w_size;\n    }\n    if (s.strm.avail_in === 0) {\n      break;\n    }\n\n    /* If there was no sliding:\n     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n     *    more == window_size - lookahead - strstart\n     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n     * => more >= window_size - 2*WSIZE + 2\n     * In the BIG_MEM or MMAP case (not yet supported),\n     *   window_size == input_size + MIN_LOOKAHEAD  &&\n     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n     * Otherwise, window_size == 2*WSIZE so more >= 2.\n     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n     */\n    //Assert(more >= 2, \"more < 2\");\n    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n    s.lookahead += n;\n\n    /* Initialize the hash value now that we have some input: */\n    if (s.lookahead + s.insert >= MIN_MATCH) {\n      str = s.strstart - s.insert;\n      s.ins_h = s.window[str];\n\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n      s.ins_h = HASH(s, s.ins_h, s.window[str + 1]);\n//#if MIN_MATCH != 3\n//        Call update_hash() MIN_MATCH-3 more times\n//#endif\n      while (s.insert) {\n        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n        s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n\n        s.prev[str & s.w_mask] = s.head[s.ins_h];\n        s.head[s.ins_h] = str;\n        str++;\n        s.insert--;\n        if (s.lookahead + s.insert < MIN_MATCH) {\n          break;\n        }\n      }\n    }\n    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n     * but this is not important since only literal bytes will be emitted.\n     */\n\n  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n  /* If the WIN_INIT bytes after the end of the current data have never been\n   * written, then zero those bytes in order to avoid memory check reports of\n   * the use of uninitialized (or uninitialised as Julian writes) bytes by\n   * the longest match routines.  Update the high water mark for the next\n   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match\n   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n   */\n//  if (s.high_water < s.window_size) {\n//    const curr = s.strstart + s.lookahead;\n//    let init = 0;\n//\n//    if (s.high_water < curr) {\n//      /* Previous high water mark below current data -- zero WIN_INIT\n//       * bytes or up to end of window, whichever is less.\n//       */\n//      init = s.window_size - curr;\n//      if (init > WIN_INIT)\n//        init = WIN_INIT;\n//      zmemzero(s->window + curr, (unsigned)init);\n//      s->high_water = curr + init;\n//    }\n//    else if (s->high_water < (ulg)curr + WIN_INIT) {\n//      /* High water mark at or above current data, but below current data\n//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n//       * to end of window, whichever is less.\n//       */\n//      init = (ulg)curr + WIN_INIT - s->high_water;\n//      if (init > s->window_size - s->high_water)\n//        init = s->window_size - s->high_water;\n//      zmemzero(s->window + s->high_water, (unsigned)init);\n//      s->high_water += init;\n//    }\n//  }\n//\n//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n//    \"not enough room for search\");\n};\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n *\n * In case deflateParams() is used to later switch to a non-zero compression\n * level, s->matches (otherwise unused when storing) keeps track of the number\n * of hash table slides to perform. If s->matches is 1, then one hash table\n * slide will be done when switching. If s->matches is 2, the maximum value\n * allowed here, then the hash table will be cleared, since two or more slides\n * is the same as a clear.\n *\n * deflate_stored() is written to minimize the number of times an input byte is\n * copied. It is most efficient with large input and output buffers, which\n * maximizes the opportunites to have a single copy from next_in to next_out.\n */\nconst deflate_stored = (s, flush) => {\n\n  /* Smallest worthy block size when not flushing or finishing. By default\n   * this is 32K. This can be as small as 507 bytes for memLevel == 1. For\n   * large input and output buffers, the stored block size will be larger.\n   */\n  let min_block = s.pending_buf_size - 5 > s.w_size ? s.w_size : s.pending_buf_size - 5;\n\n  /* Copy as many min_block or larger stored blocks directly to next_out as\n   * possible. If flushing, copy the remaining available input to next_out as\n   * stored blocks, if there is enough space.\n   */\n  let len, left, have, last = 0;\n  let used = s.strm.avail_in;\n  do {\n    /* Set len to the maximum size block that we can copy directly with the\n     * available input data and output space. Set left to how much of that\n     * would be copied from what's left in the window.\n     */\n    len = 65535/* MAX_STORED */;     /* maximum deflate stored block length */\n    have = (s.bi_valid + 42) >> 3;     /* number of header bytes */\n    if (s.strm.avail_out < have) {         /* need room for header */\n      break;\n    }\n      /* maximum stored block length that will fit in avail_out: */\n    have = s.strm.avail_out - have;\n    left = s.strstart - s.block_start;  /* bytes left in window */\n    if (len > left + s.strm.avail_in) {\n      len = left + s.strm.avail_in;   /* limit len to the input */\n    }\n    if (len > have) {\n      len = have;             /* limit len to the output */\n    }\n\n    /* If the stored block would be less than min_block in length, or if\n     * unable to copy all of the available input when flushing, then try\n     * copying to the window and the pending buffer instead. Also don't\n     * write an empty block when flushing -- deflate() does that.\n     */\n    if (len < min_block && ((len === 0 && flush !== Z_FINISH$3) ||\n                        flush === Z_NO_FLUSH$2 ||\n                        len !== left + s.strm.avail_in)) {\n      break;\n    }\n\n    /* Make a dummy stored block in pending to get the header bytes,\n     * including any pending bits. This also updates the debugging counts.\n     */\n    last = flush === Z_FINISH$3 && len === left + s.strm.avail_in ? 1 : 0;\n    _tr_stored_block(s, 0, 0, last);\n\n    /* Replace the lengths in the dummy stored block with len. */\n    s.pending_buf[s.pending - 4] = len;\n    s.pending_buf[s.pending - 3] = len >> 8;\n    s.pending_buf[s.pending - 2] = ~len;\n    s.pending_buf[s.pending - 1] = ~len >> 8;\n\n    /* Write the stored block header bytes. */\n    flush_pending(s.strm);\n\n//#ifdef ZLIB_DEBUG\n//    /* Update debugging counts for the data about to be copied. */\n//    s->compressed_len += len << 3;\n//    s->bits_sent += len << 3;\n//#endif\n\n    /* Copy uncompressed bytes from the window to next_out. */\n    if (left) {\n      if (left > len) {\n        left = len;\n      }\n      //zmemcpy(s->strm->next_out, s->window + s->block_start, left);\n      s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out);\n      s.strm.next_out += left;\n      s.strm.avail_out -= left;\n      s.strm.total_out += left;\n      s.block_start += left;\n      len -= left;\n    }\n\n    /* Copy uncompressed bytes directly from next_in to next_out, updating\n     * the check value.\n     */\n    if (len) {\n      read_buf(s.strm, s.strm.output, s.strm.next_out, len);\n      s.strm.next_out += len;\n      s.strm.avail_out -= len;\n      s.strm.total_out += len;\n    }\n  } while (last === 0);\n\n  /* Update the sliding window with the last s->w_size bytes of the copied\n   * data, or append all of the copied data to the existing window if less\n   * than s->w_size bytes were copied. Also update the number of bytes to\n   * insert in the hash tables, in the event that deflateParams() switches to\n   * a non-zero compression level.\n   */\n  used -= s.strm.avail_in;    /* number of input bytes directly copied */\n  if (used) {\n    /* If any input was used, then no unused input remains in the window,\n     * therefore s->block_start == s->strstart.\n     */\n    if (used >= s.w_size) {  /* supplant the previous history */\n      s.matches = 2;     /* clear hash */\n      //zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size);\n      s.window.set(s.strm.input.subarray(s.strm.next_in - s.w_size, s.strm.next_in), 0);\n      s.strstart = s.w_size;\n      s.insert = s.strstart;\n    }\n    else {\n      if (s.window_size - s.strstart <= used) {\n        /* Slide the window down. */\n        s.strstart -= s.w_size;\n        //zmemcpy(s->window, s->window + s->w_size, s->strstart);\n        s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0);\n        if (s.matches < 2) {\n          s.matches++;   /* add a pending slide_hash() */\n        }\n        if (s.insert > s.strstart) {\n          s.insert = s.strstart;\n        }\n      }\n      //zmemcpy(s->window + s->strstart, s->strm->next_in - used, used);\n      s.window.set(s.strm.input.subarray(s.strm.next_in - used, s.strm.next_in), s.strstart);\n      s.strstart += used;\n      s.insert += used > s.w_size - s.insert ? s.w_size - s.insert : used;\n    }\n    s.block_start = s.strstart;\n  }\n  if (s.high_water < s.strstart) {\n    s.high_water = s.strstart;\n  }\n\n  /* If the last block was written to next_out, then done. */\n  if (last) {\n    return BS_FINISH_DONE;\n  }\n\n  /* If flushing and all input has been consumed, then done. */\n  if (flush !== Z_NO_FLUSH$2 && flush !== Z_FINISH$3 &&\n    s.strm.avail_in === 0 && s.strstart === s.block_start) {\n    return BS_BLOCK_DONE;\n  }\n\n  /* Fill the window with any remaining input. */\n  have = s.window_size - s.strstart;\n  if (s.strm.avail_in > have && s.block_start >= s.w_size) {\n    /* Slide the window down. */\n    s.block_start -= s.w_size;\n    s.strstart -= s.w_size;\n    //zmemcpy(s->window, s->window + s->w_size, s->strstart);\n    s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0);\n    if (s.matches < 2) {\n      s.matches++;       /* add a pending slide_hash() */\n    }\n    have += s.w_size;      /* more space now */\n    if (s.insert > s.strstart) {\n      s.insert = s.strstart;\n    }\n  }\n  if (have > s.strm.avail_in) {\n    have = s.strm.avail_in;\n  }\n  if (have) {\n    read_buf(s.strm, s.window, s.strstart, have);\n    s.strstart += have;\n    s.insert += have > s.w_size - s.insert ? s.w_size - s.insert : have;\n  }\n  if (s.high_water < s.strstart) {\n    s.high_water = s.strstart;\n  }\n\n  /* There was not enough avail_out to write a complete worthy or flushed\n   * stored block to next_out. Write a stored block to pending instead, if we\n   * have enough input for a worthy block, or if flushing and there is enough\n   * room for the remaining input as a stored block in the pending buffer.\n   */\n  have = (s.bi_valid + 42) >> 3;     /* number of header bytes */\n    /* maximum stored block length that will fit in pending: */\n  have = s.pending_buf_size - have > 65535/* MAX_STORED */ ? 65535/* MAX_STORED */ : s.pending_buf_size - have;\n  min_block = have > s.w_size ? s.w_size : have;\n  left = s.strstart - s.block_start;\n  if (left >= min_block ||\n     ((left || flush === Z_FINISH$3) && flush !== Z_NO_FLUSH$2 &&\n     s.strm.avail_in === 0 && left <= have)) {\n    len = left > have ? have : left;\n    last = flush === Z_FINISH$3 && s.strm.avail_in === 0 &&\n         len === left ? 1 : 0;\n    _tr_stored_block(s, s.block_start, len, last);\n    s.block_start += len;\n    flush_pending(s.strm);\n  }\n\n  /* We've done all we can with the available input and output. */\n  return last ? BS_FINISH_STARTED : BS_NEED_MORE;\n};\n\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nconst deflate_fast = (s, flush) => {\n\n  let hash_head;        /* head of the hash chain */\n  let bflush;           /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) {\n        break; /* flush the current block */\n      }\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     * At this point we have always match_length < MIN_MATCH\n     */\n    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n    }\n    if (s.match_length >= MIN_MATCH) {\n      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n      /*** _tr_tally_dist(s, s.strstart - s.match_start,\n                     s.match_length - MIN_MATCH, bflush); ***/\n      bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n\n      /* Insert new strings in the hash table only if the match length\n       * is not too large. This saves time but degrades compression.\n       */\n      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n        s.match_length--; /* string at strstart already in table */\n        do {\n          s.strstart++;\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n          /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n           * always MIN_MATCH bytes ahead.\n           */\n        } while (--s.match_length !== 0);\n        s.strstart++;\n      } else\n      {\n        s.strstart += s.match_length;\n        s.match_length = 0;\n        s.ins_h = s.window[s.strstart];\n        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n        s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);\n\n//#if MIN_MATCH != 3\n//                Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n         * matter since it will be recomputed at next deflate call.\n         */\n      }\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = _tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n  if (flush === Z_FINISH$3) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.sym_next) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nconst deflate_slow = (s, flush) => {\n\n  let hash_head;          /* head of hash chain */\n  let bflush;              /* set if current block must be flushed */\n\n  let max_insert;\n\n  /* Process the input block. */\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     */\n    s.prev_length = s.match_length;\n    s.prev_match = s.match_start;\n    s.match_length = MIN_MATCH - 1;\n\n    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n\n      if (s.match_length <= 5 &&\n         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n        /* If prev_match is also MIN_MATCH, match_start is garbage\n         * but we will ignore the current match anyway.\n         */\n        s.match_length = MIN_MATCH - 1;\n      }\n    }\n    /* If there was a match at the previous step and the current\n     * match is not better, output the previous match:\n     */\n    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n      max_insert = s.strstart + s.lookahead - MIN_MATCH;\n      /* Do not insert strings in hash table beyond this. */\n\n      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n                     s.prev_length - MIN_MATCH, bflush);***/\n      bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n      /* Insert in hash table all strings up to the end of the match.\n       * strstart-1 and strstart are already inserted. If there is not\n       * enough lookahead, the last two strings are not inserted in\n       * the hash table.\n       */\n      s.lookahead -= s.prev_length - 1;\n      s.prev_length -= 2;\n      do {\n        if (++s.strstart <= max_insert) {\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n        }\n      } while (--s.prev_length !== 0);\n      s.match_available = 0;\n      s.match_length = MIN_MATCH - 1;\n      s.strstart++;\n\n      if (bflush) {\n        /*** FLUSH_BLOCK(s, 0); ***/\n        flush_block_only(s, false);\n        if (s.strm.avail_out === 0) {\n          return BS_NEED_MORE;\n        }\n        /***/\n      }\n\n    } else if (s.match_available) {\n      /* If there was no match at the previous position, output a\n       * single literal. If there was a match but the current match\n       * is longer, truncate the previous match to a single literal.\n       */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n      bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n\n      if (bflush) {\n        /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n        flush_block_only(s, false);\n        /***/\n      }\n      s.strstart++;\n      s.lookahead--;\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n    } else {\n      /* There is no previous match to compare with, wait for\n       * the next step to decide.\n       */\n      s.match_available = 1;\n      s.strstart++;\n      s.lookahead--;\n    }\n  }\n  //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n  if (s.match_available) {\n    //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n    bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n\n    s.match_available = 0;\n  }\n  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n  if (flush === Z_FINISH$3) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.sym_next) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_BLOCK_DONE;\n};\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one.  Do not maintain a hash table.  (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nconst deflate_rle = (s, flush) => {\n\n  let bflush;            /* set if current block must be flushed */\n  let prev;              /* byte at distance one to match */\n  let scan, strend;      /* scan goes up to strend for length of run */\n\n  const _win = s.window;\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the longest run, plus one for the unrolled loop.\n     */\n    if (s.lookahead <= MAX_MATCH) {\n      fill_window(s);\n      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH$2) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* See how many times the previous byte repeats */\n    s.match_length = 0;\n    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n      scan = s.strstart - 1;\n      prev = _win[scan];\n      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n        strend = s.strstart + MAX_MATCH;\n        do {\n          /*jshint noempty:false*/\n        } while (prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 scan < strend);\n        s.match_length = MAX_MATCH - (strend - scan);\n        if (s.match_length > s.lookahead) {\n          s.match_length = s.lookahead;\n        }\n      }\n      //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n    }\n\n    /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n    if (s.match_length >= MIN_MATCH) {\n      //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n      bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n      s.strstart += s.match_length;\n      s.match_length = 0;\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = _tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH$3) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.sym_next) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nconst deflate_huff = (s, flush) => {\n\n  let bflush;             /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we have a literal to write. */\n    if (s.lookahead === 0) {\n      fill_window(s);\n      if (s.lookahead === 0) {\n        if (flush === Z_NO_FLUSH$2) {\n          return BS_NEED_MORE;\n        }\n        break;      /* flush the current block */\n      }\n    }\n\n    /* Output a literal byte */\n    s.match_length = 0;\n    //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n    bflush = _tr_tally(s, 0, s.window[s.strstart]);\n    s.lookahead--;\n    s.strstart++;\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH$3) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.sym_next) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n};\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n\n  this.good_length = good_length;\n  this.max_lazy = max_lazy;\n  this.nice_length = nice_length;\n  this.max_chain = max_chain;\n  this.func = func;\n}\n\nconst configuration_table = [\n  /*      good lazy nice chain */\n  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */\n  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */\n  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */\n  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */\n\n  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */\n  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */\n  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */\n  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */\n  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */\n  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nconst lm_init = (s) => {\n\n  s.window_size = 2 * s.w_size;\n\n  /*** CLEAR_HASH(s); ***/\n  zero(s.head); // Fill with NIL (= 0);\n\n  /* Set the default configuration parameters:\n   */\n  s.max_lazy_match = configuration_table[s.level].max_lazy;\n  s.good_match = configuration_table[s.level].good_length;\n  s.nice_match = configuration_table[s.level].nice_length;\n  s.max_chain_length = configuration_table[s.level].max_chain;\n\n  s.strstart = 0;\n  s.block_start = 0;\n  s.lookahead = 0;\n  s.insert = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  s.ins_h = 0;\n};\n\n\nfunction DeflateState() {\n  this.strm = null;            /* pointer back to this zlib stream */\n  this.status = 0;            /* as the name implies */\n  this.pending_buf = null;      /* output still pending */\n  this.pending_buf_size = 0;  /* size of pending_buf */\n  this.pending_out = 0;       /* next pending byte to output to the stream */\n  this.pending = 0;           /* nb of bytes in the pending buffer */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.gzhead = null;         /* gzip header information to write */\n  this.gzindex = 0;           /* where in extra, name, or comment */\n  this.method = Z_DEFLATED$2; /* can only be DEFLATED */\n  this.last_flush = -1;   /* value of flush param for previous deflate call */\n\n  this.w_size = 0;  /* LZ77 window size (32K by default) */\n  this.w_bits = 0;  /* log2(w_size)  (8..16) */\n  this.w_mask = 0;  /* w_size - 1 */\n\n  this.window = null;\n  /* Sliding window. Input bytes are read into the second half of the window,\n   * and move to the first half later to keep a dictionary of at least wSize\n   * bytes. With this organization, matches are limited to a distance of\n   * wSize-MAX_MATCH bytes, but this ensures that IO is always\n   * performed with a length multiple of the block size.\n   */\n\n  this.window_size = 0;\n  /* Actual size of window: 2*wSize, except when the user input buffer\n   * is directly used as sliding window.\n   */\n\n  this.prev = null;\n  /* Link to older string with same hash index. To limit the size of this\n   * array to 64K, this link is maintained only for the last 32K strings.\n   * An index in this array is thus a window index modulo 32K.\n   */\n\n  this.head = null;   /* Heads of the hash chains or NIL. */\n\n  this.ins_h = 0;       /* hash index of string to be inserted */\n  this.hash_size = 0;   /* number of elements in hash table */\n  this.hash_bits = 0;   /* log2(hash_size) */\n  this.hash_mask = 0;   /* hash_size-1 */\n\n  this.hash_shift = 0;\n  /* Number of bits by which ins_h must be shifted at each input\n   * step. It must be such that after MIN_MATCH steps, the oldest\n   * byte no longer takes part in the hash key, that is:\n   *   hash_shift * MIN_MATCH >= hash_bits\n   */\n\n  this.block_start = 0;\n  /* Window position at the beginning of the current output block. Gets\n   * negative when the window is moved backwards.\n   */\n\n  this.match_length = 0;      /* length of best match */\n  this.prev_match = 0;        /* previous match */\n  this.match_available = 0;   /* set if previous match exists */\n  this.strstart = 0;          /* start of string to insert */\n  this.match_start = 0;       /* start of matching string */\n  this.lookahead = 0;         /* number of valid bytes ahead in window */\n\n  this.prev_length = 0;\n  /* Length of the best match at previous step. Matches not greater than this\n   * are discarded. This is used in the lazy match evaluation.\n   */\n\n  this.max_chain_length = 0;\n  /* To speed up deflation, hash chains are never searched beyond this\n   * length.  A higher limit improves compression ratio but degrades the\n   * speed.\n   */\n\n  this.max_lazy_match = 0;\n  /* Attempt to find a better match only when the current match is strictly\n   * smaller than this value. This mechanism is used only for compression\n   * levels >= 4.\n   */\n  // That's alias to max_lazy_match, don't use directly\n  //this.max_insert_length = 0;\n  /* Insert new strings in the hash table only if the match length is not\n   * greater than this length. This saves time but degrades compression.\n   * max_insert_length is used only for compression levels <= 3.\n   */\n\n  this.level = 0;     /* compression level (1..9) */\n  this.strategy = 0;  /* favor or force Huffman coding*/\n\n  this.good_match = 0;\n  /* Use a faster search when the previous match is longer than this */\n\n  this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n              /* used by trees.c: */\n\n  /* Didn't use ct_data typedef below to suppress compiler warning */\n\n  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */\n  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */\n\n  // Use flat array of DOUBLE size, with interleaved fata,\n  // because JS does not support effective\n  this.dyn_ltree  = new Uint16Array(HEAP_SIZE * 2);\n  this.dyn_dtree  = new Uint16Array((2 * D_CODES + 1) * 2);\n  this.bl_tree    = new Uint16Array((2 * BL_CODES + 1) * 2);\n  zero(this.dyn_ltree);\n  zero(this.dyn_dtree);\n  zero(this.bl_tree);\n\n  this.l_desc   = null;         /* desc. for literal tree */\n  this.d_desc   = null;         /* desc. for distance tree */\n  this.bl_desc  = null;         /* desc. for bit length tree */\n\n  //ush bl_count[MAX_BITS+1];\n  this.bl_count = new Uint16Array(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */\n  this.heap = new Uint16Array(2 * L_CODES + 1);  /* heap used to build the Huffman trees */\n  zero(this.heap);\n\n  this.heap_len = 0;               /* number of elements in the heap */\n  this.heap_max = 0;               /* element of largest frequency */\n  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n   * The same heap array is used to build all trees.\n   */\n\n  this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n  zero(this.depth);\n  /* Depth of each subtree used as tie breaker for trees of equal frequency\n   */\n\n  this.sym_buf = 0;        /* buffer for distances and literals/lengths */\n\n  this.lit_bufsize = 0;\n  /* Size of match buffer for literals/lengths.  There are 4 reasons for\n   * limiting lit_bufsize to 64K:\n   *   - frequencies can be kept in 16 bit counters\n   *   - if compression is not successful for the first block, all input\n   *     data is still in the window so we can still emit a stored block even\n   *     when input comes from standard input.  (This can also be done for\n   *     all blocks if lit_bufsize is not greater than 32K.)\n   *   - if compression is not successful for a file smaller than 64K, we can\n   *     even emit a stored file instead of a stored block (saving 5 bytes).\n   *     This is applicable only for zip (not gzip or zlib).\n   *   - creating new Huffman trees less frequently may not provide fast\n   *     adaptation to changes in the input data statistics. (Take for\n   *     example a binary file with poorly compressible code followed by\n   *     a highly compressible string table.) Smaller buffer sizes give\n   *     fast adaptation but have of course the overhead of transmitting\n   *     trees more frequently.\n   *   - I can't count above 4\n   */\n\n  this.sym_next = 0;      /* running index in sym_buf */\n  this.sym_end = 0;       /* symbol table full when sym_next reaches this */\n\n  this.opt_len = 0;       /* bit length of current block with optimal trees */\n  this.static_len = 0;    /* bit length of current block with static trees */\n  this.matches = 0;       /* number of string matches in current block */\n  this.insert = 0;        /* bytes at end of window left to insert */\n\n\n  this.bi_buf = 0;\n  /* Output buffer. bits are inserted starting at the bottom (least\n   * significant bits).\n   */\n  this.bi_valid = 0;\n  /* Number of valid bits in bi_buf.  All bits above the last valid bit\n   * are always zero.\n   */\n\n  // Used for window memory init. We safely ignore it for JS. That makes\n  // sense only for pointers and memory check tools.\n  //this.high_water = 0;\n  /* High water mark offset in window for initialized bytes -- bytes above\n   * this are set to zero in order to avoid memory check warnings when\n   * longest match routines access bytes past the input.  This is then\n   * updated to the new high water mark.\n   */\n}\n\n\n/* =========================================================================\n * Check for a valid deflate stream state. Return 0 if ok, 1 if not.\n */\nconst deflateStateCheck = (strm) => {\n\n  if (!strm) {\n    return 1;\n  }\n  const s = strm.state;\n  if (!s || s.strm !== strm || (s.status !== INIT_STATE &&\n//#ifdef GZIP\n                                s.status !== GZIP_STATE &&\n//#endif\n                                s.status !== EXTRA_STATE &&\n                                s.status !== NAME_STATE &&\n                                s.status !== COMMENT_STATE &&\n                                s.status !== HCRC_STATE &&\n                                s.status !== BUSY_STATE &&\n                                s.status !== FINISH_STATE)) {\n    return 1;\n  }\n  return 0;\n};\n\n\nconst deflateResetKeep = (strm) => {\n\n  if (deflateStateCheck(strm)) {\n    return err(strm, Z_STREAM_ERROR$2);\n  }\n\n  strm.total_in = strm.total_out = 0;\n  strm.data_type = Z_UNKNOWN;\n\n  const s = strm.state;\n  s.pending = 0;\n  s.pending_out = 0;\n\n  if (s.wrap < 0) {\n    s.wrap = -s.wrap;\n    /* was made negative by deflate(..., Z_FINISH); */\n  }\n  s.status =\n//#ifdef GZIP\n    s.wrap === 2 ? GZIP_STATE :\n//#endif\n    s.wrap ? INIT_STATE : BUSY_STATE;\n  strm.adler = (s.wrap === 2) ?\n    0  // crc32(0, Z_NULL, 0)\n  :\n    1; // adler32(0, Z_NULL, 0)\n  s.last_flush = -2;\n  _tr_init(s);\n  return Z_OK$3;\n};\n\n\nconst deflateReset = (strm) => {\n\n  const ret = deflateResetKeep(strm);\n  if (ret === Z_OK$3) {\n    lm_init(strm.state);\n  }\n  return ret;\n};\n\n\nconst deflateSetHeader = (strm, head) => {\n\n  if (deflateStateCheck(strm) || strm.state.wrap !== 2) {\n    return Z_STREAM_ERROR$2;\n  }\n  strm.state.gzhead = head;\n  return Z_OK$3;\n};\n\n\nconst deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {\n\n  if (!strm) { // === Z_NULL\n    return Z_STREAM_ERROR$2;\n  }\n  let wrap = 1;\n\n  if (level === Z_DEFAULT_COMPRESSION$1) {\n    level = 6;\n  }\n\n  if (windowBits < 0) { /* suppress zlib wrapper */\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n\n  else if (windowBits > 15) {\n    wrap = 2;           /* write gzip wrapper instead */\n    windowBits -= 16;\n  }\n\n\n  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$2 ||\n    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n    strategy < 0 || strategy > Z_FIXED || (windowBits === 8 && wrap !== 1)) {\n    return err(strm, Z_STREAM_ERROR$2);\n  }\n\n\n  if (windowBits === 8) {\n    windowBits = 9;\n  }\n  /* until 256-byte window bug fixed */\n\n  const s = new DeflateState();\n\n  strm.state = s;\n  s.strm = strm;\n  s.status = INIT_STATE;     /* to pass state test in deflateReset() */\n\n  s.wrap = wrap;\n  s.gzhead = null;\n  s.w_bits = windowBits;\n  s.w_size = 1 << s.w_bits;\n  s.w_mask = s.w_size - 1;\n\n  s.hash_bits = memLevel + 7;\n  s.hash_size = 1 << s.hash_bits;\n  s.hash_mask = s.hash_size - 1;\n  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n  s.window = new Uint8Array(s.w_size * 2);\n  s.head = new Uint16Array(s.hash_size);\n  s.prev = new Uint16Array(s.w_size);\n\n  // Don't need mem init magic for JS.\n  //s.high_water = 0;  /* nothing written to s->window yet */\n\n  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n  /* We overlay pending_buf and sym_buf. This works since the average size\n   * for length/distance pairs over any compressed block is assured to be 31\n   * bits or less.\n   *\n   * Analysis: The longest fixed codes are a length code of 8 bits plus 5\n   * extra bits, for lengths 131 to 257. The longest fixed distance codes are\n   * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest\n   * possible fixed-codes length/distance pair is then 31 bits total.\n   *\n   * sym_buf starts one-fourth of the way into pending_buf. So there are\n   * three bytes in sym_buf for every four bytes in pending_buf. Each symbol\n   * in sym_buf is three bytes -- two for the distance and one for the\n   * literal/length. As each symbol is consumed, the pointer to the next\n   * sym_buf value to read moves forward three bytes. From that symbol, up to\n   * 31 bits are written to pending_buf. The closest the written pending_buf\n   * bits gets to the next sym_buf symbol to read is just before the last\n   * code is written. At that time, 31*(n-2) bits have been written, just\n   * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at\n   * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1\n   * symbols are written.) The closest the writing gets to what is unread is\n   * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and\n   * can range from 128 to 32768.\n   *\n   * Therefore, at a minimum, there are 142 bits of space between what is\n   * written and what is read in the overlain buffers, so the symbols cannot\n   * be overwritten by the compressed data. That space is actually 139 bits,\n   * due to the three-bit fixed-code block header.\n   *\n   * That covers the case where either Z_FIXED is specified, forcing fixed\n   * codes, or when the use of fixed codes is chosen, because that choice\n   * results in a smaller compressed block than dynamic codes. That latter\n   * condition then assures that the above analysis also covers all dynamic\n   * blocks. A dynamic-code block will only be chosen to be emitted if it has\n   * fewer bits than a fixed-code block would for the same set of symbols.\n   * Therefore its average symbol length is assured to be less than 31. So\n   * the compressed data for a dynamic block also cannot overwrite the\n   * symbols from which it is being constructed.\n   */\n\n  s.pending_buf_size = s.lit_bufsize * 4;\n  s.pending_buf = new Uint8Array(s.pending_buf_size);\n\n  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n  //s->sym_buf = s->pending_buf + s->lit_bufsize;\n  s.sym_buf = s.lit_bufsize;\n\n  //s->sym_end = (s->lit_bufsize - 1) * 3;\n  s.sym_end = (s.lit_bufsize - 1) * 3;\n  /* We avoid equality with lit_bufsize*3 because of wraparound at 64K\n   * on 16 bit machines and because stored blocks are restricted to\n   * 64K-1 bytes.\n   */\n\n  s.level = level;\n  s.strategy = strategy;\n  s.method = method;\n\n  return deflateReset(strm);\n};\n\nconst deflateInit = (strm, level) => {\n\n  return deflateInit2(strm, level, Z_DEFLATED$2, MAX_WBITS$1, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY$1);\n};\n\n\n/* ========================================================================= */\nconst deflate$2 = (strm, flush) => {\n\n  if (deflateStateCheck(strm) || flush > Z_BLOCK$1 || flush < 0) {\n    return strm ? err(strm, Z_STREAM_ERROR$2) : Z_STREAM_ERROR$2;\n  }\n\n  const s = strm.state;\n\n  if (!strm.output ||\n      (strm.avail_in !== 0 && !strm.input) ||\n      (s.status === FINISH_STATE && flush !== Z_FINISH$3)) {\n    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$1 : Z_STREAM_ERROR$2);\n  }\n\n  const old_flush = s.last_flush;\n  s.last_flush = flush;\n\n  /* Flush as much pending output as possible */\n  if (s.pending !== 0) {\n    flush_pending(strm);\n    if (strm.avail_out === 0) {\n      /* Since avail_out is 0, deflate will be called again with\n       * more output space, but possibly with both pending and\n       * avail_in equal to zero. There won't be anything to do,\n       * but this is not an error situation so make sure we\n       * return OK instead of BUF_ERROR at next call of deflate:\n       */\n      s.last_flush = -1;\n      return Z_OK$3;\n    }\n\n    /* Make sure there is something to do and avoid duplicate consecutive\n     * flushes. For repeated and useless calls with Z_FINISH, we keep\n     * returning Z_STREAM_END instead of Z_BUF_ERROR.\n     */\n  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n    flush !== Z_FINISH$3) {\n    return err(strm, Z_BUF_ERROR$1);\n  }\n\n  /* User must not provide more input after the first FINISH: */\n  if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n    return err(strm, Z_BUF_ERROR$1);\n  }\n\n  /* Write the header */\n  if (s.status === INIT_STATE && s.wrap === 0) {\n    s.status = BUSY_STATE;\n  }\n  if (s.status === INIT_STATE) {\n    /* zlib header */\n    let header = (Z_DEFLATED$2 + ((s.w_bits - 8) << 4)) << 8;\n    let level_flags = -1;\n\n    if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n      level_flags = 0;\n    } else if (s.level < 6) {\n      level_flags = 1;\n    } else if (s.level === 6) {\n      level_flags = 2;\n    } else {\n      level_flags = 3;\n    }\n    header |= (level_flags << 6);\n    if (s.strstart !== 0) { header |= PRESET_DICT; }\n    header += 31 - (header % 31);\n\n    putShortMSB(s, header);\n\n    /* Save the adler32 of the preset dictionary: */\n    if (s.strstart !== 0) {\n      putShortMSB(s, strm.adler >>> 16);\n      putShortMSB(s, strm.adler & 0xffff);\n    }\n    strm.adler = 1; // adler32(0L, Z_NULL, 0);\n    s.status = BUSY_STATE;\n\n    /* Compression must start with an empty pending buffer */\n    flush_pending(strm);\n    if (s.pending !== 0) {\n      s.last_flush = -1;\n      return Z_OK$3;\n    }\n  }\n//#ifdef GZIP\n  if (s.status === GZIP_STATE) {\n    /* gzip header */\n    strm.adler = 0;  //crc32(0L, Z_NULL, 0);\n    put_byte(s, 31);\n    put_byte(s, 139);\n    put_byte(s, 8);\n    if (!s.gzhead) { // s->gzhead == Z_NULL\n      put_byte(s, 0);\n      put_byte(s, 0);\n      put_byte(s, 0);\n      put_byte(s, 0);\n      put_byte(s, 0);\n      put_byte(s, s.level === 9 ? 2 :\n                  (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                   4 : 0));\n      put_byte(s, OS_CODE);\n      s.status = BUSY_STATE;\n\n      /* Compression must start with an empty pending buffer */\n      flush_pending(strm);\n      if (s.pending !== 0) {\n        s.last_flush = -1;\n        return Z_OK$3;\n      }\n    }\n    else {\n      put_byte(s, (s.gzhead.text ? 1 : 0) +\n                  (s.gzhead.hcrc ? 2 : 0) +\n                  (!s.gzhead.extra ? 0 : 4) +\n                  (!s.gzhead.name ? 0 : 8) +\n                  (!s.gzhead.comment ? 0 : 16)\n      );\n      put_byte(s, s.gzhead.time & 0xff);\n      put_byte(s, (s.gzhead.time >> 8) & 0xff);\n      put_byte(s, (s.gzhead.time >> 16) & 0xff);\n      put_byte(s, (s.gzhead.time >> 24) & 0xff);\n      put_byte(s, s.level === 9 ? 2 :\n                  (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                   4 : 0));\n      put_byte(s, s.gzhead.os & 0xff);\n      if (s.gzhead.extra && s.gzhead.extra.length) {\n        put_byte(s, s.gzhead.extra.length & 0xff);\n        put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n      }\n      if (s.gzhead.hcrc) {\n        strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0);\n      }\n      s.gzindex = 0;\n      s.status = EXTRA_STATE;\n    }\n  }\n  if (s.status === EXTRA_STATE) {\n    if (s.gzhead.extra/* != Z_NULL*/) {\n      let beg = s.pending;   /* start of bytes to update crc */\n      let left = (s.gzhead.extra.length & 0xffff) - s.gzindex;\n      while (s.pending + left > s.pending_buf_size) {\n        let copy = s.pending_buf_size - s.pending;\n        // zmemcpy(s.pending_buf + s.pending,\n        //    s.gzhead.extra + s.gzindex, copy);\n        s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex, s.gzindex + copy), s.pending);\n        s.pending = s.pending_buf_size;\n        //--- HCRC_UPDATE(beg) ---//\n        if (s.gzhead.hcrc && s.pending > beg) {\n          strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n        }\n        //---//\n        s.gzindex += copy;\n        flush_pending(strm);\n        if (s.pending !== 0) {\n          s.last_flush = -1;\n          return Z_OK$3;\n        }\n        beg = 0;\n        left -= copy;\n      }\n      // JS specific: s.gzhead.extra may be TypedArray or Array for backward compatibility\n      //              TypedArray.slice and TypedArray.from don't exist in IE10-IE11\n      let gzhead_extra = new Uint8Array(s.gzhead.extra);\n      // zmemcpy(s->pending_buf + s->pending,\n      //     s->gzhead->extra + s->gzindex, left);\n      s.pending_buf.set(gzhead_extra.subarray(s.gzindex, s.gzindex + left), s.pending);\n      s.pending += left;\n      //--- HCRC_UPDATE(beg) ---//\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      //---//\n      s.gzindex = 0;\n    }\n    s.status = NAME_STATE;\n  }\n  if (s.status === NAME_STATE) {\n    if (s.gzhead.name/* != Z_NULL*/) {\n      let beg = s.pending;   /* start of bytes to update crc */\n      let val;\n      do {\n        if (s.pending === s.pending_buf_size) {\n          //--- HCRC_UPDATE(beg) ---//\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          //---//\n          flush_pending(strm);\n          if (s.pending !== 0) {\n            s.last_flush = -1;\n            return Z_OK$3;\n          }\n          beg = 0;\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.name.length) {\n          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n      //--- HCRC_UPDATE(beg) ---//\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      //---//\n      s.gzindex = 0;\n    }\n    s.status = COMMENT_STATE;\n  }\n  if (s.status === COMMENT_STATE) {\n    if (s.gzhead.comment/* != Z_NULL*/) {\n      let beg = s.pending;   /* start of bytes to update crc */\n      let val;\n      do {\n        if (s.pending === s.pending_buf_size) {\n          //--- HCRC_UPDATE(beg) ---//\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          //---//\n          flush_pending(strm);\n          if (s.pending !== 0) {\n            s.last_flush = -1;\n            return Z_OK$3;\n          }\n          beg = 0;\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.comment.length) {\n          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n      //--- HCRC_UPDATE(beg) ---//\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      //---//\n    }\n    s.status = HCRC_STATE;\n  }\n  if (s.status === HCRC_STATE) {\n    if (s.gzhead.hcrc) {\n      if (s.pending + 2 > s.pending_buf_size) {\n        flush_pending(strm);\n        if (s.pending !== 0) {\n          s.last_flush = -1;\n          return Z_OK$3;\n        }\n      }\n      put_byte(s, strm.adler & 0xff);\n      put_byte(s, (strm.adler >> 8) & 0xff);\n      strm.adler = 0; //crc32(0L, Z_NULL, 0);\n    }\n    s.status = BUSY_STATE;\n\n    /* Compression must start with an empty pending buffer */\n    flush_pending(strm);\n    if (s.pending !== 0) {\n      s.last_flush = -1;\n      return Z_OK$3;\n    }\n  }\n//#endif\n\n  /* Start a new block or continue the current one.\n   */\n  if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n    (flush !== Z_NO_FLUSH$2 && s.status !== FINISH_STATE)) {\n    let bstate = s.level === 0 ? deflate_stored(s, flush) :\n                 s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :\n                 s.strategy === Z_RLE ? deflate_rle(s, flush) :\n                 configuration_table[s.level].func(s, flush);\n\n    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n      s.status = FINISH_STATE;\n    }\n    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n      if (strm.avail_out === 0) {\n        s.last_flush = -1;\n        /* avoid BUF_ERROR next call, see above */\n      }\n      return Z_OK$3;\n      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n       * of deflate should use the same flush parameter to make sure\n       * that the flush is complete. So we don't have to output an\n       * empty block here, this will be done at next call. This also\n       * ensures that for a very small output buffer, we emit at most\n       * one empty block.\n       */\n    }\n    if (bstate === BS_BLOCK_DONE) {\n      if (flush === Z_PARTIAL_FLUSH) {\n        _tr_align(s);\n      }\n      else if (flush !== Z_BLOCK$1) { /* FULL_FLUSH or SYNC_FLUSH */\n\n        _tr_stored_block(s, 0, 0, false);\n        /* For a full flush, this empty block will be recognized\n         * as a special marker by inflate_sync().\n         */\n        if (flush === Z_FULL_FLUSH$1) {\n          /*** CLEAR_HASH(s); ***/             /* forget history */\n          zero(s.head); // Fill with NIL (= 0);\n\n          if (s.lookahead === 0) {\n            s.strstart = 0;\n            s.block_start = 0;\n            s.insert = 0;\n          }\n        }\n      }\n      flush_pending(strm);\n      if (strm.avail_out === 0) {\n        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n        return Z_OK$3;\n      }\n    }\n  }\n\n  if (flush !== Z_FINISH$3) { return Z_OK$3; }\n  if (s.wrap <= 0) { return Z_STREAM_END$3; }\n\n  /* Write the trailer */\n  if (s.wrap === 2) {\n    put_byte(s, strm.adler & 0xff);\n    put_byte(s, (strm.adler >> 8) & 0xff);\n    put_byte(s, (strm.adler >> 16) & 0xff);\n    put_byte(s, (strm.adler >> 24) & 0xff);\n    put_byte(s, strm.total_in & 0xff);\n    put_byte(s, (strm.total_in >> 8) & 0xff);\n    put_byte(s, (strm.total_in >> 16) & 0xff);\n    put_byte(s, (strm.total_in >> 24) & 0xff);\n  }\n  else\n  {\n    putShortMSB(s, strm.adler >>> 16);\n    putShortMSB(s, strm.adler & 0xffff);\n  }\n\n  flush_pending(strm);\n  /* If avail_out is zero, the application will call deflate again\n   * to flush the rest.\n   */\n  if (s.wrap > 0) { s.wrap = -s.wrap; }\n  /* write the trailer only once! */\n  return s.pending !== 0 ? Z_OK$3 : Z_STREAM_END$3;\n};\n\n\nconst deflateEnd = (strm) => {\n\n  if (deflateStateCheck(strm)) {\n    return Z_STREAM_ERROR$2;\n  }\n\n  const status = strm.state.status;\n\n  strm.state = null;\n\n  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR$2) : Z_OK$3;\n};\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nconst deflateSetDictionary = (strm, dictionary) => {\n\n  let dictLength = dictionary.length;\n\n  if (deflateStateCheck(strm)) {\n    return Z_STREAM_ERROR$2;\n  }\n\n  const s = strm.state;\n  const wrap = s.wrap;\n\n  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n    return Z_STREAM_ERROR$2;\n  }\n\n  /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n  if (wrap === 1) {\n    /* adler32(strm->adler, dictionary, dictLength); */\n    strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0);\n  }\n\n  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */\n\n  /* if dictionary would fill window, just replace the history */\n  if (dictLength >= s.w_size) {\n    if (wrap === 0) {            /* already empty otherwise */\n      /*** CLEAR_HASH(s); ***/\n      zero(s.head); // Fill with NIL (= 0);\n      s.strstart = 0;\n      s.block_start = 0;\n      s.insert = 0;\n    }\n    /* use the tail */\n    // dictionary = dictionary.slice(dictLength - s.w_size);\n    let tmpDict = new Uint8Array(s.w_size);\n    tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0);\n    dictionary = tmpDict;\n    dictLength = s.w_size;\n  }\n  /* insert dictionary into window and hash */\n  const avail = strm.avail_in;\n  const next = strm.next_in;\n  const input = strm.input;\n  strm.avail_in = dictLength;\n  strm.next_in = 0;\n  strm.input = dictionary;\n  fill_window(s);\n  while (s.lookahead >= MIN_MATCH) {\n    let str = s.strstart;\n    let n = s.lookahead - (MIN_MATCH - 1);\n    do {\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n      s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n\n      s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n      s.head[s.ins_h] = str;\n      str++;\n    } while (--n);\n    s.strstart = str;\n    s.lookahead = MIN_MATCH - 1;\n    fill_window(s);\n  }\n  s.strstart += s.lookahead;\n  s.block_start = s.strstart;\n  s.insert = s.lookahead;\n  s.lookahead = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  strm.next_in = next;\n  strm.input = input;\n  strm.avail_in = avail;\n  s.wrap = wrap;\n  return Z_OK$3;\n};\n\n\nvar deflateInit_1 = deflateInit;\nvar deflateInit2_1 = deflateInit2;\nvar deflateReset_1 = deflateReset;\nvar deflateResetKeep_1 = deflateResetKeep;\nvar deflateSetHeader_1 = deflateSetHeader;\nvar deflate_2$1 = deflate$2;\nvar deflateEnd_1 = deflateEnd;\nvar deflateSetDictionary_1 = deflateSetDictionary;\nvar deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.deflateBound = deflateBound;\nmodule.exports.deflateCopy = deflateCopy;\nmodule.exports.deflateGetDictionary = deflateGetDictionary;\nmodule.exports.deflateParams = deflateParams;\nmodule.exports.deflatePending = deflatePending;\nmodule.exports.deflatePrime = deflatePrime;\nmodule.exports.deflateTune = deflateTune;\n*/\n\nvar deflate_1$2 = {\n\tdeflateInit: deflateInit_1,\n\tdeflateInit2: deflateInit2_1,\n\tdeflateReset: deflateReset_1,\n\tdeflateResetKeep: deflateResetKeep_1,\n\tdeflateSetHeader: deflateSetHeader_1,\n\tdeflate: deflate_2$1,\n\tdeflateEnd: deflateEnd_1,\n\tdeflateSetDictionary: deflateSetDictionary_1,\n\tdeflateInfo: deflateInfo\n};\n\nconst _has = (obj, key) => {\n  return Object.prototype.hasOwnProperty.call(obj, key);\n};\n\nvar assign = function (obj /*from1, from2, from3, ...*/) {\n  const sources = Array.prototype.slice.call(arguments, 1);\n  while (sources.length) {\n    const source = sources.shift();\n    if (!source) { continue; }\n\n    if (typeof source !== 'object') {\n      throw new TypeError(source + 'must be non-object');\n    }\n\n    for (const p in source) {\n      if (_has(source, p)) {\n        obj[p] = source[p];\n      }\n    }\n  }\n\n  return obj;\n};\n\n\n// Join array of chunks to single array.\nvar flattenChunks = (chunks) => {\n  // calculate data length\n  let len = 0;\n\n  for (let i = 0, l = chunks.length; i < l; i++) {\n    len += chunks[i].length;\n  }\n\n  // join chunks\n  const result = new Uint8Array(len);\n\n  for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {\n    let chunk = chunks[i];\n    result.set(chunk, pos);\n    pos += chunk.length;\n  }\n\n  return result;\n};\n\nvar common = {\n\tassign: assign,\n\tflattenChunks: flattenChunks\n};\n\n// String encode/decode helpers\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nlet STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nconst _utf8len = new Uint8Array(256);\nfor (let q = 0; q < 256; q++) {\n  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nvar string2buf = (str) => {\n  if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) {\n    return new TextEncoder().encode(str);\n  }\n\n  let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n  // count binary size\n  for (m_pos = 0; m_pos < str_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n  }\n\n  // allocate buffer\n  buf = new Uint8Array(buf_len);\n\n  // convert\n  for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    if (c < 0x80) {\n      /* one byte */\n      buf[i++] = c;\n    } else if (c < 0x800) {\n      /* two bytes */\n      buf[i++] = 0xC0 | (c >>> 6);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else if (c < 0x10000) {\n      /* three bytes */\n      buf[i++] = 0xE0 | (c >>> 12);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else {\n      /* four bytes */\n      buf[i++] = 0xf0 | (c >>> 18);\n      buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    }\n  }\n\n  return buf;\n};\n\n// Helper\nconst buf2binstring = (buf, len) => {\n  // On Chrome, the arguments in a function call that are allowed is `65534`.\n  // If the length of the buffer is smaller than that, we can use this optimization,\n  // otherwise we will take a slower path.\n  if (len < 65534) {\n    if (buf.subarray && STR_APPLY_UIA_OK) {\n      return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));\n    }\n  }\n\n  let result = '';\n  for (let i = 0; i < len; i++) {\n    result += String.fromCharCode(buf[i]);\n  }\n  return result;\n};\n\n\n// convert array to string\nvar buf2string = (buf, max) => {\n  const len = max || buf.length;\n\n  if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) {\n    return new TextDecoder().decode(buf.subarray(0, max));\n  }\n\n  let i, out;\n\n  // Reserve max possible length (2 words per char)\n  // NB: by unknown reasons, Array is significantly faster for\n  //     String.fromCharCode.apply than Uint16Array.\n  const utf16buf = new Array(len * 2);\n\n  for (out = 0, i = 0; i < len;) {\n    let c = buf[i++];\n    // quick process ascii\n    if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n    let c_len = _utf8len[c];\n    // skip 5 & 6 byte codes\n    if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n    // apply mask on first byte\n    c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n    // join the rest\n    while (c_len > 1 && i < len) {\n      c = (c << 6) | (buf[i++] & 0x3f);\n      c_len--;\n    }\n\n    // terminated by end of string?\n    if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n    if (c < 0x10000) {\n      utf16buf[out++] = c;\n    } else {\n      c -= 0x10000;\n      utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n      utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n    }\n  }\n\n  return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max   - length limit (mandatory);\nvar utf8border = (buf, max) => {\n\n  max = max || buf.length;\n  if (max > buf.length) { max = buf.length; }\n\n  // go back from last position, until start of sequence found\n  let pos = max - 1;\n  while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n  // Very small and broken sequence,\n  // return max, because we should return something anyway.\n  if (pos < 0) { return max; }\n\n  // If we came to start of buffer - that means buffer is too small,\n  // return max too.\n  if (pos === 0) { return max; }\n\n  return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\nvar strings = {\n\tstring2buf: string2buf,\n\tbuf2string: buf2string,\n\tutf8border: utf8border\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n  /* next input byte */\n  this.input = null; // JS specific, because we have no pointers\n  this.next_in = 0;\n  /* number of bytes available at input */\n  this.avail_in = 0;\n  /* total number of input bytes read so far */\n  this.total_in = 0;\n  /* next output byte should be put there */\n  this.output = null; // JS specific, because we have no pointers\n  this.next_out = 0;\n  /* remaining free space at output */\n  this.avail_out = 0;\n  /* total number of bytes output so far */\n  this.total_out = 0;\n  /* last error message, NULL if no error */\n  this.msg = ''/*Z_NULL*/;\n  /* not visible by applications */\n  this.state = null;\n  /* best guess about the data type: binary or text */\n  this.data_type = 2/*Z_UNKNOWN*/;\n  /* adler32 value of the uncompressed data */\n  this.adler = 0;\n}\n\nvar zstream = ZStream;\n\nconst toString$1 = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n  Z_NO_FLUSH: Z_NO_FLUSH$1, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH: Z_FINISH$2,\n  Z_OK: Z_OK$2, Z_STREAM_END: Z_STREAM_END$2,\n  Z_DEFAULT_COMPRESSION,\n  Z_DEFAULT_STRATEGY,\n  Z_DEFLATED: Z_DEFLATED$1\n} = constants$2;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `header` (Object) - custom header for gzip\n *   - `text` (Boolean) - true if compressed data believed to be text\n *   - `time` (Number) - modification time, unix timestamp\n *   - `os` (Number) - operation system code\n *   - `extra` (Array) - array of bytes with extra data (max 65536)\n *   - `name` (String) - file name (binary string)\n *   - `comment` (String) - comment (binary string)\n *   - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n *   , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true);  // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate$1(options) {\n  this.options = common.assign({\n    level: Z_DEFAULT_COMPRESSION,\n    method: Z_DEFLATED$1,\n    chunkSize: 16384,\n    windowBits: 15,\n    memLevel: 8,\n    strategy: Z_DEFAULT_STRATEGY\n  }, options || {});\n\n  let opt = this.options;\n\n  if (opt.raw && (opt.windowBits > 0)) {\n    opt.windowBits = -opt.windowBits;\n  }\n\n  else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n    opt.windowBits += 16;\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm = new zstream();\n  this.strm.avail_out = 0;\n\n  let status = deflate_1$2.deflateInit2(\n    this.strm,\n    opt.level,\n    opt.method,\n    opt.windowBits,\n    opt.memLevel,\n    opt.strategy\n  );\n\n  if (status !== Z_OK$2) {\n    throw new Error(messages[status]);\n  }\n\n  if (opt.header) {\n    deflate_1$2.deflateSetHeader(this.strm, opt.header);\n  }\n\n  if (opt.dictionary) {\n    let dict;\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      // If we need to compress text, change encoding to utf8.\n      dict = strings.string2buf(opt.dictionary);\n    } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') {\n      dict = new Uint8Array(opt.dictionary);\n    } else {\n      dict = opt.dictionary;\n    }\n\n    status = deflate_1$2.deflateSetDictionary(this.strm, dict);\n\n    if (status !== Z_OK$2) {\n      throw new Error(messages[status]);\n    }\n\n    this._dict_set = true;\n  }\n}\n\n/**\n * Deflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be\n *   converted to utf8 byte sequence.\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must\n * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending\n * buffers and call [[Deflate#onEnd]].\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nDeflate$1.prototype.push = function (data, flush_mode) {\n  const strm = this.strm;\n  const chunkSize = this.options.chunkSize;\n  let status, _flush_mode;\n\n  if (this.ended) { return false; }\n\n  if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n  else _flush_mode = flush_mode === true ? Z_FINISH$2 : Z_NO_FLUSH$1;\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // If we need to compress text, change encoding to utf8.\n    strm.input = strings.string2buf(data);\n  } else if (toString$1.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  for (;;) {\n    if (strm.avail_out === 0) {\n      strm.output = new Uint8Array(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n\n    // Make sure avail_out > 6 to avoid repeating markers\n    if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) {\n      this.onData(strm.output.subarray(0, strm.next_out));\n      strm.avail_out = 0;\n      continue;\n    }\n\n    status = deflate_1$2.deflate(strm, _flush_mode);\n\n    // Ended => flush and finish\n    if (status === Z_STREAM_END$2) {\n      if (strm.next_out > 0) {\n        this.onData(strm.output.subarray(0, strm.next_out));\n      }\n      status = deflate_1$2.deflateEnd(this.strm);\n      this.onEnd(status);\n      this.ended = true;\n      return status === Z_OK$2;\n    }\n\n    // Flush if out buffer full\n    if (strm.avail_out === 0) {\n      this.onData(strm.output);\n      continue;\n    }\n\n    // Flush if requested and has data\n    if (_flush_mode > 0 && strm.next_out > 0) {\n      this.onData(strm.output.subarray(0, strm.next_out));\n      strm.avail_out = 0;\n      continue;\n    }\n\n    if (strm.avail_in === 0) break;\n  }\n\n  return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array): output data.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate$1.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate$1.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === Z_OK$2) {\n    this.result = common.flattenChunks(this.chunks);\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate$1(input, options) {\n  const deflator = new Deflate$1(options);\n\n  deflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (deflator.err) { throw deflator.msg || messages[deflator.err]; }\n\n  return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw$1(input, options) {\n  options = options || {};\n  options.raw = true;\n  return deflate$1(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip$1(input, options) {\n  options = options || {};\n  options.gzip = true;\n  return deflate$1(input, options);\n}\n\n\nvar Deflate_1$1 = Deflate$1;\nvar deflate_2 = deflate$1;\nvar deflateRaw_1$1 = deflateRaw$1;\nvar gzip_1$1 = gzip$1;\nvar constants$1 = constants$2;\n\nvar deflate_1$1 = {\n\tDeflate: Deflate_1$1,\n\tdeflate: deflate_2,\n\tdeflateRaw: deflateRaw_1$1,\n\tgzip: gzip_1$1,\n\tconstants: constants$1\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nconst BAD$1 = 16209;       /* got a data error -- remain here until reset */\nconst TYPE$1 = 16191;      /* i: waiting for type bits, including last-flag bit */\n\n/*\n   Decode literal, length, and distance codes and write out the resulting\n   literal and match bytes until either not enough input or output is\n   available, an end-of-block is encountered, or a data error is encountered.\n   When large enough input and output buffers are supplied to inflate(), for\n   example, a 16K input buffer and a 64K output buffer, more than 95% of the\n   inflate execution time is spent in this routine.\n\n   Entry assumptions:\n\n        state.mode === LEN\n        strm.avail_in >= 6\n        strm.avail_out >= 258\n        start >= strm.avail_out\n        state.bits < 8\n\n   On return, state.mode is one of:\n\n        LEN -- ran out of enough output space or enough available input\n        TYPE -- reached end of block code, inflate() to interpret next block\n        BAD -- error in block data\n\n   Notes:\n\n    - The maximum input bits used by a length/distance pair is 15 bits for the\n      length code, 5 bits for the length extra, 15 bits for the distance code,\n      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.\n      Therefore if strm.avail_in >= 6, then there is enough input to avoid\n      checking for available input while decoding.\n\n    - The maximum bytes that a single length/distance pair can output is 258\n      bytes, which is the maximum length that can be coded.  inflate_fast()\n      requires strm.avail_out >= 258 for each loop to avoid checking for\n      output space.\n */\nvar inffast = function inflate_fast(strm, start) {\n  let _in;                    /* local strm.input */\n  let last;                   /* have enough input while in < last */\n  let _out;                   /* local strm.output */\n  let beg;                    /* inflate()'s initial strm.output */\n  let end;                    /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n  let dmax;                   /* maximum distance from zlib header */\n//#endif\n  let wsize;                  /* window size or zero if not using window */\n  let whave;                  /* valid bytes in the window */\n  let wnext;                  /* window write index */\n  // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n  let s_window;               /* allocated sliding window, if wsize != 0 */\n  let hold;                   /* local strm.hold */\n  let bits;                   /* local strm.bits */\n  let lcode;                  /* local strm.lencode */\n  let dcode;                  /* local strm.distcode */\n  let lmask;                  /* mask for first level of length codes */\n  let dmask;                  /* mask for first level of distance codes */\n  let here;                   /* retrieved table entry */\n  let op;                     /* code bits, operation, extra bits, or */\n                              /*  window position, window bytes to copy */\n  let len;                    /* match length, unused bytes */\n  let dist;                   /* match distance */\n  let from;                   /* where to copy match from */\n  let from_source;\n\n\n  let input, output; // JS specific, because we have no pointers\n\n  /* copy state to local variables */\n  const state = strm.state;\n  //here = state.here;\n  _in = strm.next_in;\n  input = strm.input;\n  last = _in + (strm.avail_in - 5);\n  _out = strm.next_out;\n  output = strm.output;\n  beg = _out - (start - strm.avail_out);\n  end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n  dmax = state.dmax;\n//#endif\n  wsize = state.wsize;\n  whave = state.whave;\n  wnext = state.wnext;\n  s_window = state.window;\n  hold = state.hold;\n  bits = state.bits;\n  lcode = state.lencode;\n  dcode = state.distcode;\n  lmask = (1 << state.lenbits) - 1;\n  dmask = (1 << state.distbits) - 1;\n\n\n  /* decode literals and length/distances until end-of-block or not enough\n     input data or output space */\n\n  top:\n  do {\n    if (bits < 15) {\n      hold += input[_in++] << bits;\n      bits += 8;\n      hold += input[_in++] << bits;\n      bits += 8;\n    }\n\n    here = lcode[hold & lmask];\n\n    dolen:\n    for (;;) { // Goto emulation\n      op = here >>> 24/*here.bits*/;\n      hold >>>= op;\n      bits -= op;\n      op = (here >>> 16) & 0xff/*here.op*/;\n      if (op === 0) {                          /* literal */\n        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n        //        \"inflate:         literal '%c'\\n\" :\n        //        \"inflate:         literal 0x%02x\\n\", here.val));\n        output[_out++] = here & 0xffff/*here.val*/;\n      }\n      else if (op & 16) {                     /* length base */\n        len = here & 0xffff/*here.val*/;\n        op &= 15;                           /* number of extra bits */\n        if (op) {\n          if (bits < op) {\n            hold += input[_in++] << bits;\n            bits += 8;\n          }\n          len += hold & ((1 << op) - 1);\n          hold >>>= op;\n          bits -= op;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", len));\n        if (bits < 15) {\n          hold += input[_in++] << bits;\n          bits += 8;\n          hold += input[_in++] << bits;\n          bits += 8;\n        }\n        here = dcode[hold & dmask];\n\n        dodist:\n        for (;;) { // goto emulation\n          op = here >>> 24/*here.bits*/;\n          hold >>>= op;\n          bits -= op;\n          op = (here >>> 16) & 0xff/*here.op*/;\n\n          if (op & 16) {                      /* distance base */\n            dist = here & 0xffff/*here.val*/;\n            op &= 15;                       /* number of extra bits */\n            if (bits < op) {\n              hold += input[_in++] << bits;\n              bits += 8;\n              if (bits < op) {\n                hold += input[_in++] << bits;\n                bits += 8;\n              }\n            }\n            dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n            if (dist > dmax) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD$1;\n              break top;\n            }\n//#endif\n            hold >>>= op;\n            bits -= op;\n            //Tracevv((stderr, \"inflate:         distance %u\\n\", dist));\n            op = _out - beg;                /* max distance in output */\n            if (dist > op) {                /* see if copy from window */\n              op = dist - op;               /* distance back in window */\n              if (op > whave) {\n                if (state.sane) {\n                  strm.msg = 'invalid distance too far back';\n                  state.mode = BAD$1;\n                  break top;\n                }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//                if (len <= op - whave) {\n//                  do {\n//                    output[_out++] = 0;\n//                  } while (--len);\n//                  continue top;\n//                }\n//                len -= op - whave;\n//                do {\n//                  output[_out++] = 0;\n//                } while (--op > whave);\n//                if (op === 0) {\n//                  from = _out - dist;\n//                  do {\n//                    output[_out++] = output[from++];\n//                  } while (--len);\n//                  continue top;\n//                }\n//#endif\n              }\n              from = 0; // window index\n              from_source = s_window;\n              if (wnext === 0) {           /* very common case */\n                from += wsize - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              else if (wnext < op) {      /* wrap around window */\n                from += wsize + wnext - op;\n                op -= wnext;\n                if (op < len) {         /* some from end of window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = 0;\n                  if (wnext < len) {  /* some from start of window */\n                    op = wnext;\n                    len -= op;\n                    do {\n                      output[_out++] = s_window[from++];\n                    } while (--op);\n                    from = _out - dist;      /* rest from output */\n                    from_source = output;\n                  }\n                }\n              }\n              else {                      /* contiguous in window */\n                from += wnext - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              while (len > 2) {\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                len -= 3;\n              }\n              if (len) {\n                output[_out++] = from_source[from++];\n                if (len > 1) {\n                  output[_out++] = from_source[from++];\n                }\n              }\n            }\n            else {\n              from = _out - dist;          /* copy direct from output */\n              do {                        /* minimum length is three */\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                len -= 3;\n              } while (len > 2);\n              if (len) {\n                output[_out++] = output[from++];\n                if (len > 1) {\n                  output[_out++] = output[from++];\n                }\n              }\n            }\n          }\n          else if ((op & 64) === 0) {          /* 2nd level distance code */\n            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n            continue dodist;\n          }\n          else {\n            strm.msg = 'invalid distance code';\n            state.mode = BAD$1;\n            break top;\n          }\n\n          break; // need to emulate goto via \"continue\"\n        }\n      }\n      else if ((op & 64) === 0) {              /* 2nd level length code */\n        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n        continue dolen;\n      }\n      else if (op & 32) {                     /* end-of-block */\n        //Tracevv((stderr, \"inflate:         end of block\\n\"));\n        state.mode = TYPE$1;\n        break top;\n      }\n      else {\n        strm.msg = 'invalid literal/length code';\n        state.mode = BAD$1;\n        break top;\n      }\n\n      break; // need to emulate goto via \"continue\"\n    }\n  } while (_in < last && _out < end);\n\n  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n  len = bits >> 3;\n  _in -= len;\n  bits -= len << 3;\n  hold &= (1 << bits) - 1;\n\n  /* update state and return */\n  strm.next_in = _in;\n  strm.next_out = _out;\n  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n  state.hold = hold;\n  state.bits = bits;\n  return;\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst MAXBITS = 15;\nconst ENOUGH_LENS$1 = 852;\nconst ENOUGH_DISTS$1 = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst CODES$1 = 0;\nconst LENS$1 = 1;\nconst DISTS$1 = 2;\n\nconst lbase = new Uint16Array([ /* Length codes 257..285 base */\n  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n]);\n\nconst lext = new Uint8Array([ /* Length codes 257..285 extra */\n  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n]);\n\nconst dbase = new Uint16Array([ /* Distance codes 0..29 base */\n  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n  8193, 12289, 16385, 24577, 0, 0\n]);\n\nconst dext = new Uint8Array([ /* Distance codes 0..29 extra */\n  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n  28, 28, 29, 29, 64, 64\n]);\n\nconst inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) =>\n{\n  const bits = opts.bits;\n      //here = opts.here; /* table entry for duplication */\n\n  let len = 0;               /* a code's length in bits */\n  let sym = 0;               /* index of code symbols */\n  let min = 0, max = 0;          /* minimum and maximum code lengths */\n  let root = 0;              /* number of index bits for root table */\n  let curr = 0;              /* number of index bits for current table */\n  let drop = 0;              /* code bits to drop for sub-table */\n  let left = 0;                   /* number of prefix codes available */\n  let used = 0;              /* code entries in table used */\n  let huff = 0;              /* Huffman code */\n  let incr;              /* for incrementing code, index */\n  let fill;              /* index for replicating entries */\n  let low;               /* low bits for current root entry */\n  let mask;              /* mask for low root bits */\n  let next;             /* next available space in table */\n  let base = null;     /* base value table to use */\n//  let shoextra;    /* extra bits table to use */\n  let match;                  /* use base and extra for symbol >= match */\n  const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */\n  const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */\n  let extra = null;\n\n  let here_bits, here_op, here_val;\n\n  /*\n   Process a set of code lengths to create a canonical Huffman code.  The\n   code lengths are lens[0..codes-1].  Each length corresponds to the\n   symbols 0..codes-1.  The Huffman code is generated by first sorting the\n   symbols by length from short to long, and retaining the symbol order\n   for codes with equal lengths.  Then the code starts with all zero bits\n   for the first code of the shortest length, and the codes are integer\n   increments for the same length, and zeros are appended as the length\n   increases.  For the deflate format, these bits are stored backwards\n   from their more natural integer increment ordering, and so when the\n   decoding tables are built in the large loop below, the integer codes\n   are incremented backwards.\n\n   This routine assumes, but does not check, that all of the entries in\n   lens[] are in the range 0..MAXBITS.  The caller must assure this.\n   1..MAXBITS is interpreted as that code length.  zero means that that\n   symbol does not occur in this code.\n\n   The codes are sorted by computing a count of codes for each length,\n   creating from that a table of starting indices for each length in the\n   sorted table, and then entering the symbols in order in the sorted\n   table.  The sorted table is work[], with that space being provided by\n   the caller.\n\n   The length counts are used for other purposes as well, i.e. finding\n   the minimum and maximum length codes, determining if there are any\n   codes at all, checking for a valid set of lengths, and looking ahead\n   at length counts to determine sub-table sizes when building the\n   decoding tables.\n   */\n\n  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n  for (len = 0; len <= MAXBITS; len++) {\n    count[len] = 0;\n  }\n  for (sym = 0; sym < codes; sym++) {\n    count[lens[lens_index + sym]]++;\n  }\n\n  /* bound code lengths, force root to be within code lengths */\n  root = bits;\n  for (max = MAXBITS; max >= 1; max--) {\n    if (count[max] !== 0) { break; }\n  }\n  if (root > max) {\n    root = max;\n  }\n  if (max === 0) {                     /* no symbols to code at all */\n    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */\n    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;\n    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n    //table.op[opts.table_index] = 64;\n    //table.bits[opts.table_index] = 1;\n    //table.val[opts.table_index++] = 0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n    opts.bits = 1;\n    return 0;     /* no symbols, but wait for decoding to report error */\n  }\n  for (min = 1; min < max; min++) {\n    if (count[min] !== 0) { break; }\n  }\n  if (root < min) {\n    root = min;\n  }\n\n  /* check for an over-subscribed or incomplete set of lengths */\n  left = 1;\n  for (len = 1; len <= MAXBITS; len++) {\n    left <<= 1;\n    left -= count[len];\n    if (left < 0) {\n      return -1;\n    }        /* over-subscribed */\n  }\n  if (left > 0 && (type === CODES$1 || max !== 1)) {\n    return -1;                      /* incomplete set */\n  }\n\n  /* generate offsets into symbol table for each length for sorting */\n  offs[1] = 0;\n  for (len = 1; len < MAXBITS; len++) {\n    offs[len + 1] = offs[len] + count[len];\n  }\n\n  /* sort symbols by length, by symbol order within each length */\n  for (sym = 0; sym < codes; sym++) {\n    if (lens[lens_index + sym] !== 0) {\n      work[offs[lens[lens_index + sym]]++] = sym;\n    }\n  }\n\n  /*\n   Create and fill in decoding tables.  In this loop, the table being\n   filled is at next and has curr index bits.  The code being used is huff\n   with length len.  That code is converted to an index by dropping drop\n   bits off of the bottom.  For codes where len is less than drop + curr,\n   those top drop + curr - len bits are incremented through all values to\n   fill the table with replicated entries.\n\n   root is the number of index bits for the root table.  When len exceeds\n   root, sub-tables are created pointed to by the root entry with an index\n   of the low root bits of huff.  This is saved in low to check for when a\n   new sub-table should be started.  drop is zero when the root table is\n   being filled, and drop is root when sub-tables are being filled.\n\n   When a new sub-table is needed, it is necessary to look ahead in the\n   code lengths to determine what size sub-table is needed.  The length\n   counts are used for this, and so count[] is decremented as codes are\n   entered in the tables.\n\n   used keeps track of how many table entries have been allocated from the\n   provided *table space.  It is checked for LENS and DIST tables against\n   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n   the initial root table size constants.  See the comments in inftrees.h\n   for more information.\n\n   sym increments through all symbols, and the loop terminates when\n   all codes of length max, i.e. all codes, have been processed.  This\n   routine permits incomplete codes, so another loop after this one fills\n   in the rest of the decoding tables with invalid code markers.\n   */\n\n  /* set up for code type */\n  // poor man optimization - use if-else instead of switch,\n  // to avoid deopts in old v8\n  if (type === CODES$1) {\n    base = extra = work;    /* dummy value--not used */\n    match = 20;\n\n  } else if (type === LENS$1) {\n    base = lbase;\n    extra = lext;\n    match = 257;\n\n  } else {                    /* DISTS */\n    base = dbase;\n    extra = dext;\n    match = 0;\n  }\n\n  /* initialize opts for loop */\n  huff = 0;                   /* starting code */\n  sym = 0;                    /* starting code symbol */\n  len = min;                  /* starting code length */\n  next = table_index;              /* current table to fill in */\n  curr = root;                /* current table index bits */\n  drop = 0;                   /* current bits to drop from code for index */\n  low = -1;                   /* trigger new sub-table when len > root */\n  used = 1 << root;          /* use root table entries */\n  mask = used - 1;            /* mask for comparing low */\n\n  /* check available table space */\n  if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n    (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n    return 1;\n  }\n\n  /* process all codes and make table entries */\n  for (;;) {\n    /* create table entry */\n    here_bits = len - drop;\n    if (work[sym] + 1 < match) {\n      here_op = 0;\n      here_val = work[sym];\n    }\n    else if (work[sym] >= match) {\n      here_op = extra[work[sym] - match];\n      here_val = base[work[sym] - match];\n    }\n    else {\n      here_op = 32 + 64;         /* end of block */\n      here_val = 0;\n    }\n\n    /* replicate for those indices with low len bits equal to huff */\n    incr = 1 << (len - drop);\n    fill = 1 << curr;\n    min = fill;                 /* save offset to next table */\n    do {\n      fill -= incr;\n      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n    } while (fill !== 0);\n\n    /* backwards increment the len-bit code huff */\n    incr = 1 << (len - 1);\n    while (huff & incr) {\n      incr >>= 1;\n    }\n    if (incr !== 0) {\n      huff &= incr - 1;\n      huff += incr;\n    } else {\n      huff = 0;\n    }\n\n    /* go to next symbol, update count, len */\n    sym++;\n    if (--count[len] === 0) {\n      if (len === max) { break; }\n      len = lens[lens_index + work[sym]];\n    }\n\n    /* create new sub-table if needed */\n    if (len > root && (huff & mask) !== low) {\n      /* if first time, transition to sub-tables */\n      if (drop === 0) {\n        drop = root;\n      }\n\n      /* increment past last table */\n      next += min;            /* here min is 1 << curr */\n\n      /* determine length of next table */\n      curr = len - drop;\n      left = 1 << curr;\n      while (curr + drop < max) {\n        left -= count[curr + drop];\n        if (left <= 0) { break; }\n        curr++;\n        left <<= 1;\n      }\n\n      /* check for enough space */\n      used += 1 << curr;\n      if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n        (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n        return 1;\n      }\n\n      /* point entry in root table to sub-table */\n      low = huff & mask;\n      /*table.op[low] = curr;\n      table.bits[low] = root;\n      table.val[low] = next - opts.table_index;*/\n      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n    }\n  }\n\n  /* fill in remaining table entry if code is incomplete (guaranteed to have\n   at most one remaining entry, since if the code is incomplete, the\n   maximum code length that was allowed to get this far is one bit) */\n  if (huff !== 0) {\n    //table.op[next + huff] = 64;            /* invalid code marker */\n    //table.bits[next + huff] = len - drop;\n    //table.val[next + huff] = 0;\n    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n  }\n\n  /* set return parameters */\n  //opts.table_index += used;\n  opts.bits = root;\n  return 0;\n};\n\n\nvar inftrees = inflate_table;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n\n\n\n\n\nconst CODES = 0;\nconst LENS = 1;\nconst DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n  Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES,\n  Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR,\n  Z_DEFLATED\n} = constants$2;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nconst    HEAD = 16180;       /* i: waiting for magic header */\nconst    FLAGS = 16181;      /* i: waiting for method and flags (gzip) */\nconst    TIME = 16182;       /* i: waiting for modification time (gzip) */\nconst    OS = 16183;         /* i: waiting for extra flags and operating system (gzip) */\nconst    EXLEN = 16184;      /* i: waiting for extra length (gzip) */\nconst    EXTRA = 16185;      /* i: waiting for extra bytes (gzip) */\nconst    NAME = 16186;       /* i: waiting for end of file name (gzip) */\nconst    COMMENT = 16187;    /* i: waiting for end of comment (gzip) */\nconst    HCRC = 16188;       /* i: waiting for header crc (gzip) */\nconst    DICTID = 16189;    /* i: waiting for dictionary check value */\nconst    DICT = 16190;      /* waiting for inflateSetDictionary() call */\nconst        TYPE = 16191;      /* i: waiting for type bits, including last-flag bit */\nconst        TYPEDO = 16192;    /* i: same, but skip check to exit inflate on new block */\nconst        STORED = 16193;    /* i: waiting for stored size (length and complement) */\nconst        COPY_ = 16194;     /* i/o: same as COPY below, but only first time in */\nconst        COPY = 16195;      /* i/o: waiting for input or output to copy stored block */\nconst        TABLE = 16196;     /* i: waiting for dynamic block table lengths */\nconst        LENLENS = 16197;   /* i: waiting for code length code lengths */\nconst        CODELENS = 16198;  /* i: waiting for length/lit and distance code lengths */\nconst            LEN_ = 16199;      /* i: same as LEN below, but only first time in */\nconst            LEN = 16200;       /* i: waiting for length/lit/eob code */\nconst            LENEXT = 16201;    /* i: waiting for length extra bits */\nconst            DIST = 16202;      /* i: waiting for distance code */\nconst            DISTEXT = 16203;   /* i: waiting for distance extra bits */\nconst            MATCH = 16204;     /* o: waiting for output space to copy string */\nconst            LIT = 16205;       /* o: waiting for output space to write literal */\nconst    CHECK = 16206;     /* i: waiting for 32-bit check value */\nconst    LENGTH = 16207;    /* i: waiting for 32-bit length (gzip) */\nconst    DONE = 16208;      /* finished check, done -- remain here until reset */\nconst    BAD = 16209;       /* got a data error -- remain here until reset */\nconst    MEM = 16210;       /* got an inflate() memory error -- remain here until reset */\nconst    SYNC = 16211;      /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nconst ENOUGH_LENS = 852;\nconst ENOUGH_DISTS = 592;\n//const ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst MAX_WBITS = 15;\n/* 32K LZ77 window */\nconst DEF_WBITS = MAX_WBITS;\n\n\nconst zswap32 = (q) => {\n\n  return  (((q >>> 24) & 0xff) +\n          ((q >>> 8) & 0xff00) +\n          ((q & 0xff00) << 8) +\n          ((q & 0xff) << 24));\n};\n\n\nfunction InflateState() {\n  this.strm = null;           /* pointer back to this zlib stream */\n  this.mode = 0;              /* current inflate mode */\n  this.last = false;          /* true if processing last block */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip,\n                                 bit 2 true to validate check value */\n  this.havedict = false;      /* true if dictionary provided */\n  this.flags = 0;             /* gzip header method and flags (0 if zlib), or\n                                 -1 if raw or no header yet */\n  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */\n  this.check = 0;             /* protected copy of check value */\n  this.total = 0;             /* protected copy of output count */\n  // TODO: may be {}\n  this.head = null;           /* where to save gzip header information */\n\n  /* sliding window */\n  this.wbits = 0;             /* log base 2 of requested window size */\n  this.wsize = 0;             /* window size or zero if not using window */\n  this.whave = 0;             /* valid bytes in the window */\n  this.wnext = 0;             /* window write index */\n  this.window = null;         /* allocated sliding window, if needed */\n\n  /* bit accumulator */\n  this.hold = 0;              /* input bit accumulator */\n  this.bits = 0;              /* number of bits in \"in\" */\n\n  /* for string and stored block copying */\n  this.length = 0;            /* literal or length of data to copy */\n  this.offset = 0;            /* distance back to copy string from */\n\n  /* for table and code decoding */\n  this.extra = 0;             /* extra bits needed */\n\n  /* fixed and dynamic code tables */\n  this.lencode = null;          /* starting table for length/literal codes */\n  this.distcode = null;         /* starting table for distance codes */\n  this.lenbits = 0;           /* index bits for lencode */\n  this.distbits = 0;          /* index bits for distcode */\n\n  /* dynamic table building */\n  this.ncode = 0;             /* number of code length code lengths */\n  this.nlen = 0;              /* number of length code lengths */\n  this.ndist = 0;             /* number of distance code lengths */\n  this.have = 0;              /* number of code lengths in lens[] */\n  this.next = null;              /* next available space in codes[] */\n\n  this.lens = new Uint16Array(320); /* temporary storage for code lengths */\n  this.work = new Uint16Array(288); /* work area for code table building */\n\n  /*\n   because we don't have pointers in js, we use lencode and distcode directly\n   as buffers so we don't need codes\n  */\n  //this.codes = new Int32Array(ENOUGH);       /* space for code tables */\n  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */\n  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */\n  this.sane = 0;                   /* if false, allow invalid distance too far */\n  this.back = 0;                   /* bits back of last unprocessed length/lit */\n  this.was = 0;                    /* initial length of match */\n}\n\n\nconst inflateStateCheck = (strm) => {\n\n  if (!strm) {\n    return 1;\n  }\n  const state = strm.state;\n  if (!state || state.strm !== strm ||\n    state.mode < HEAD || state.mode > SYNC) {\n    return 1;\n  }\n  return 0;\n};\n\n\nconst inflateResetKeep = (strm) => {\n\n  if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n  const state = strm.state;\n  strm.total_in = strm.total_out = state.total = 0;\n  strm.msg = ''; /*Z_NULL*/\n  if (state.wrap) {       /* to support ill-conceived Java test suite */\n    strm.adler = state.wrap & 1;\n  }\n  state.mode = HEAD;\n  state.last = 0;\n  state.havedict = 0;\n  state.flags = -1;\n  state.dmax = 32768;\n  state.head = null/*Z_NULL*/;\n  state.hold = 0;\n  state.bits = 0;\n  //state.lencode = state.distcode = state.next = state.codes;\n  state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS);\n  state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS);\n\n  state.sane = 1;\n  state.back = -1;\n  //Tracev((stderr, \"inflate: reset\\n\"));\n  return Z_OK$1;\n};\n\n\nconst inflateReset = (strm) => {\n\n  if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n  const state = strm.state;\n  state.wsize = 0;\n  state.whave = 0;\n  state.wnext = 0;\n  return inflateResetKeep(strm);\n\n};\n\n\nconst inflateReset2 = (strm, windowBits) => {\n  let wrap;\n\n  /* get the state */\n  if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n  const state = strm.state;\n\n  /* extract wrap request from windowBits parameter */\n  if (windowBits < 0) {\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n  else {\n    wrap = (windowBits >> 4) + 5;\n    if (windowBits < 48) {\n      windowBits &= 15;\n    }\n  }\n\n  /* set number of window bits, free window if different */\n  if (windowBits && (windowBits < 8 || windowBits > 15)) {\n    return Z_STREAM_ERROR$1;\n  }\n  if (state.window !== null && state.wbits !== windowBits) {\n    state.window = null;\n  }\n\n  /* update state and reset the rest of it */\n  state.wrap = wrap;\n  state.wbits = windowBits;\n  return inflateReset(strm);\n};\n\n\nconst inflateInit2 = (strm, windowBits) => {\n\n  if (!strm) { return Z_STREAM_ERROR$1; }\n  //strm.msg = Z_NULL;                 /* in case we return an error */\n\n  const state = new InflateState();\n\n  //if (state === Z_NULL) return Z_MEM_ERROR;\n  //Tracev((stderr, \"inflate: allocated\\n\"));\n  strm.state = state;\n  state.strm = strm;\n  state.window = null/*Z_NULL*/;\n  state.mode = HEAD;     /* to pass state test in inflateReset2() */\n  const ret = inflateReset2(strm, windowBits);\n  if (ret !== Z_OK$1) {\n    strm.state = null/*Z_NULL*/;\n  }\n  return ret;\n};\n\n\nconst inflateInit = (strm) => {\n\n  return inflateInit2(strm, DEF_WBITS);\n};\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding.  Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter.  This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time.  However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nlet virgin = true;\n\nlet lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\n\nconst fixedtables = (state) => {\n\n  /* build fixed huffman tables if first call (may not be thread safe) */\n  if (virgin) {\n    lenfix = new Int32Array(512);\n    distfix = new Int32Array(32);\n\n    /* literal/length table */\n    let sym = 0;\n    while (sym < 144) { state.lens[sym++] = 8; }\n    while (sym < 256) { state.lens[sym++] = 9; }\n    while (sym < 280) { state.lens[sym++] = 7; }\n    while (sym < 288) { state.lens[sym++] = 8; }\n\n    inftrees(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });\n\n    /* distance table */\n    sym = 0;\n    while (sym < 32) { state.lens[sym++] = 5; }\n\n    inftrees(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });\n\n    /* do this just once */\n    virgin = false;\n  }\n\n  state.lencode = lenfix;\n  state.lenbits = 9;\n  state.distcode = distfix;\n  state.distbits = 5;\n};\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning.  If window does not exist yet, create it.  This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nconst updatewindow = (strm, src, end, copy) => {\n\n  let dist;\n  const state = strm.state;\n\n  /* if it hasn't been done already, allocate space for the window */\n  if (state.window === null) {\n    state.wsize = 1 << state.wbits;\n    state.wnext = 0;\n    state.whave = 0;\n\n    state.window = new Uint8Array(state.wsize);\n  }\n\n  /* copy state->wsize or less output bytes into the circular window */\n  if (copy >= state.wsize) {\n    state.window.set(src.subarray(end - state.wsize, end), 0);\n    state.wnext = 0;\n    state.whave = state.wsize;\n  }\n  else {\n    dist = state.wsize - state.wnext;\n    if (dist > copy) {\n      dist = copy;\n    }\n    //zmemcpy(state->window + state->wnext, end - copy, dist);\n    state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext);\n    copy -= dist;\n    if (copy) {\n      //zmemcpy(state->window, end - copy, copy);\n      state.window.set(src.subarray(end - copy, end), 0);\n      state.wnext = copy;\n      state.whave = state.wsize;\n    }\n    else {\n      state.wnext += dist;\n      if (state.wnext === state.wsize) { state.wnext = 0; }\n      if (state.whave < state.wsize) { state.whave += dist; }\n    }\n  }\n  return 0;\n};\n\n\nconst inflate$2 = (strm, flush) => {\n\n  let state;\n  let input, output;          // input/output buffers\n  let next;                   /* next input INDEX */\n  let put;                    /* next output INDEX */\n  let have, left;             /* available input and output */\n  let hold;                   /* bit buffer */\n  let bits;                   /* bits in bit buffer */\n  let _in, _out;              /* save starting available input and output */\n  let copy;                   /* number of stored or match bytes to copy */\n  let from;                   /* where to copy match bytes from */\n  let from_source;\n  let here = 0;               /* current decoding table entry */\n  let here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n  //let last;                   /* parent table entry */\n  let last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n  let len;                    /* length to copy for repeats, bits to drop */\n  let ret;                    /* return code */\n  const hbuf = new Uint8Array(4);    /* buffer for gzip header crc calculation */\n  let opts;\n\n  let n; // temporary variable for NEED_BITS\n\n  const order = /* permutation of code lengths */\n    new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]);\n\n\n  if (inflateStateCheck(strm) || !strm.output ||\n      (!strm.input && strm.avail_in !== 0)) {\n    return Z_STREAM_ERROR$1;\n  }\n\n  state = strm.state;\n  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */\n\n\n  //--- LOAD() ---\n  put = strm.next_out;\n  output = strm.output;\n  left = strm.avail_out;\n  next = strm.next_in;\n  input = strm.input;\n  have = strm.avail_in;\n  hold = state.hold;\n  bits = state.bits;\n  //---\n\n  _in = have;\n  _out = left;\n  ret = Z_OK$1;\n\n  inf_leave: // goto emulation\n  for (;;) {\n    switch (state.mode) {\n      case HEAD:\n        if (state.wrap === 0) {\n          state.mode = TYPEDO;\n          break;\n        }\n        //=== NEEDBITS(16);\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */\n          if (state.wbits === 0) {\n            state.wbits = 15;\n          }\n          state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32_1(state.check, hbuf, 2, 0);\n          //===//\n\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          state.mode = FLAGS;\n          break;\n        }\n        if (state.head) {\n          state.head.done = false;\n        }\n        if (!(state.wrap & 1) ||   /* check if zlib header allowed */\n          (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n          strm.msg = 'incorrect header check';\n          state.mode = BAD;\n          break;\n        }\n        if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n          strm.msg = 'unknown compression method';\n          state.mode = BAD;\n          break;\n        }\n        //--- DROPBITS(4) ---//\n        hold >>>= 4;\n        bits -= 4;\n        //---//\n        len = (hold & 0x0f)/*BITS(4)*/ + 8;\n        if (state.wbits === 0) {\n          state.wbits = len;\n        }\n        if (len > 15 || len > state.wbits) {\n          strm.msg = 'invalid window size';\n          state.mode = BAD;\n          break;\n        }\n\n        // !!! pako patch. Force use `options.windowBits` if passed.\n        // Required to always use max window size by default.\n        state.dmax = 1 << state.wbits;\n        //state.dmax = 1 << len;\n\n        state.flags = 0;               /* indicate zlib header */\n        //Tracev((stderr, \"inflate:   zlib header ok\\n\"));\n        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n        state.mode = hold & 0x200 ? DICTID : TYPE;\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        break;\n      case FLAGS:\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.flags = hold;\n        if ((state.flags & 0xff) !== Z_DEFLATED) {\n          strm.msg = 'unknown compression method';\n          state.mode = BAD;\n          break;\n        }\n        if (state.flags & 0xe000) {\n          strm.msg = 'unknown header flags set';\n          state.mode = BAD;\n          break;\n        }\n        if (state.head) {\n          state.head.text = ((hold >> 8) & 1);\n        }\n        if ((state.flags & 0x0200) && (state.wrap & 4)) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32_1(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = TIME;\n        /* falls through */\n      case TIME:\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (state.head) {\n          state.head.time = hold;\n        }\n        if ((state.flags & 0x0200) && (state.wrap & 4)) {\n          //=== CRC4(state.check, hold)\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          hbuf[2] = (hold >>> 16) & 0xff;\n          hbuf[3] = (hold >>> 24) & 0xff;\n          state.check = crc32_1(state.check, hbuf, 4, 0);\n          //===\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = OS;\n        /* falls through */\n      case OS:\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (state.head) {\n          state.head.xflags = (hold & 0xff);\n          state.head.os = (hold >> 8);\n        }\n        if ((state.flags & 0x0200) && (state.wrap & 4)) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32_1(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = EXLEN;\n        /* falls through */\n      case EXLEN:\n        if (state.flags & 0x0400) {\n          //=== NEEDBITS(16); */\n          while (bits < 16) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.length = hold;\n          if (state.head) {\n            state.head.extra_len = hold;\n          }\n          if ((state.flags & 0x0200) && (state.wrap & 4)) {\n            //=== CRC2(state.check, hold);\n            hbuf[0] = hold & 0xff;\n            hbuf[1] = (hold >>> 8) & 0xff;\n            state.check = crc32_1(state.check, hbuf, 2, 0);\n            //===//\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n        }\n        else if (state.head) {\n          state.head.extra = null/*Z_NULL*/;\n        }\n        state.mode = EXTRA;\n        /* falls through */\n      case EXTRA:\n        if (state.flags & 0x0400) {\n          copy = state.length;\n          if (copy > have) { copy = have; }\n          if (copy) {\n            if (state.head) {\n              len = state.head.extra_len - state.length;\n              if (!state.head.extra) {\n                // Use untyped array for more convenient processing later\n                state.head.extra = new Uint8Array(state.head.extra_len);\n              }\n              state.head.extra.set(\n                input.subarray(\n                  next,\n                  // extra field is limited to 65536 bytes\n                  // - no need for additional size check\n                  next + copy\n                ),\n                /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n                len\n              );\n              //zmemcpy(state.head.extra + len, next,\n              //        len + copy > state.head.extra_max ?\n              //        state.head.extra_max - len : copy);\n            }\n            if ((state.flags & 0x0200) && (state.wrap & 4)) {\n              state.check = crc32_1(state.check, input, copy, next);\n            }\n            have -= copy;\n            next += copy;\n            state.length -= copy;\n          }\n          if (state.length) { break inf_leave; }\n        }\n        state.length = 0;\n        state.mode = NAME;\n        /* falls through */\n      case NAME:\n        if (state.flags & 0x0800) {\n          if (have === 0) { break inf_leave; }\n          copy = 0;\n          do {\n            // TODO: 2 or 1 bytes?\n            len = input[next + copy++];\n            /* use constant limit because in js we should not preallocate memory */\n            if (state.head && len &&\n                (state.length < 65536 /*state.head.name_max*/)) {\n              state.head.name += String.fromCharCode(len);\n            }\n          } while (len && copy < have);\n\n          if ((state.flags & 0x0200) && (state.wrap & 4)) {\n            state.check = crc32_1(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          if (len) { break inf_leave; }\n        }\n        else if (state.head) {\n          state.head.name = null;\n        }\n        state.length = 0;\n        state.mode = COMMENT;\n        /* falls through */\n      case COMMENT:\n        if (state.flags & 0x1000) {\n          if (have === 0) { break inf_leave; }\n          copy = 0;\n          do {\n            len = input[next + copy++];\n            /* use constant limit because in js we should not preallocate memory */\n            if (state.head && len &&\n                (state.length < 65536 /*state.head.comm_max*/)) {\n              state.head.comment += String.fromCharCode(len);\n            }\n          } while (len && copy < have);\n          if ((state.flags & 0x0200) && (state.wrap & 4)) {\n            state.check = crc32_1(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          if (len) { break inf_leave; }\n        }\n        else if (state.head) {\n          state.head.comment = null;\n        }\n        state.mode = HCRC;\n        /* falls through */\n      case HCRC:\n        if (state.flags & 0x0200) {\n          //=== NEEDBITS(16); */\n          while (bits < 16) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          if ((state.wrap & 4) && hold !== (state.check & 0xffff)) {\n            strm.msg = 'header crc mismatch';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n        }\n        if (state.head) {\n          state.head.hcrc = ((state.flags >> 9) & 1);\n          state.head.done = true;\n        }\n        strm.adler = state.check = 0;\n        state.mode = TYPE;\n        break;\n      case DICTID:\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        strm.adler = state.check = zswap32(hold);\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = DICT;\n        /* falls through */\n      case DICT:\n        if (state.havedict === 0) {\n          //--- RESTORE() ---\n          strm.next_out = put;\n          strm.avail_out = left;\n          strm.next_in = next;\n          strm.avail_in = have;\n          state.hold = hold;\n          state.bits = bits;\n          //---\n          return Z_NEED_DICT$1;\n        }\n        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n        state.mode = TYPE;\n        /* falls through */\n      case TYPE:\n        if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case TYPEDO:\n        if (state.last) {\n          //--- BYTEBITS() ---//\n          hold >>>= bits & 7;\n          bits -= bits & 7;\n          //---//\n          state.mode = CHECK;\n          break;\n        }\n        //=== NEEDBITS(3); */\n        while (bits < 3) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.last = (hold & 0x01)/*BITS(1)*/;\n        //--- DROPBITS(1) ---//\n        hold >>>= 1;\n        bits -= 1;\n        //---//\n\n        switch ((hold & 0x03)/*BITS(2)*/) {\n          case 0:                             /* stored block */\n            //Tracev((stderr, \"inflate:     stored block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = STORED;\n            break;\n          case 1:                             /* fixed block */\n            fixedtables(state);\n            //Tracev((stderr, \"inflate:     fixed codes block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = LEN_;             /* decode codes */\n            if (flush === Z_TREES) {\n              //--- DROPBITS(2) ---//\n              hold >>>= 2;\n              bits -= 2;\n              //---//\n              break inf_leave;\n            }\n            break;\n          case 2:                             /* dynamic block */\n            //Tracev((stderr, \"inflate:     dynamic codes block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = TABLE;\n            break;\n          case 3:\n            strm.msg = 'invalid block type';\n            state.mode = BAD;\n        }\n        //--- DROPBITS(2) ---//\n        hold >>>= 2;\n        bits -= 2;\n        //---//\n        break;\n      case STORED:\n        //--- BYTEBITS() ---// /* go to byte boundary */\n        hold >>>= bits & 7;\n        bits -= bits & 7;\n        //---//\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n          strm.msg = 'invalid stored block lengths';\n          state.mode = BAD;\n          break;\n        }\n        state.length = hold & 0xffff;\n        //Tracev((stderr, \"inflate:       stored length %u\\n\",\n        //        state.length));\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = COPY_;\n        if (flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case COPY_:\n        state.mode = COPY;\n        /* falls through */\n      case COPY:\n        copy = state.length;\n        if (copy) {\n          if (copy > have) { copy = have; }\n          if (copy > left) { copy = left; }\n          if (copy === 0) { break inf_leave; }\n          //--- zmemcpy(put, next, copy); ---\n          output.set(input.subarray(next, next + copy), put);\n          //---//\n          have -= copy;\n          next += copy;\n          left -= copy;\n          put += copy;\n          state.length -= copy;\n          break;\n        }\n        //Tracev((stderr, \"inflate:       stored end\\n\"));\n        state.mode = TYPE;\n        break;\n      case TABLE:\n        //=== NEEDBITS(14); */\n        while (bits < 14) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n        //--- DROPBITS(5) ---//\n        hold >>>= 5;\n        bits -= 5;\n        //---//\n        state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n        //--- DROPBITS(5) ---//\n        hold >>>= 5;\n        bits -= 5;\n        //---//\n        state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n        //--- DROPBITS(4) ---//\n        hold >>>= 4;\n        bits -= 4;\n        //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n        if (state.nlen > 286 || state.ndist > 30) {\n          strm.msg = 'too many length or distance symbols';\n          state.mode = BAD;\n          break;\n        }\n//#endif\n        //Tracev((stderr, \"inflate:       table sizes ok\\n\"));\n        state.have = 0;\n        state.mode = LENLENS;\n        /* falls through */\n      case LENLENS:\n        while (state.have < state.ncode) {\n          //=== NEEDBITS(3);\n          while (bits < 3) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n          //--- DROPBITS(3) ---//\n          hold >>>= 3;\n          bits -= 3;\n          //---//\n        }\n        while (state.have < 19) {\n          state.lens[order[state.have++]] = 0;\n        }\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        //state.next = state.codes;\n        //state.lencode = state.next;\n        // Switch to use dynamic table\n        state.lencode = state.lendyn;\n        state.lenbits = 7;\n\n        opts = { bits: state.lenbits };\n        ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n        state.lenbits = opts.bits;\n\n        if (ret) {\n          strm.msg = 'invalid code lengths set';\n          state.mode = BAD;\n          break;\n        }\n        //Tracev((stderr, \"inflate:       code lengths ok\\n\"));\n        state.have = 0;\n        state.mode = CODELENS;\n        /* falls through */\n      case CODELENS:\n        while (state.have < state.nlen + state.ndist) {\n          for (;;) {\n            here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          if (here_val < 16) {\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            state.lens[state.have++] = here_val;\n          }\n          else {\n            if (here_val === 16) {\n              //=== NEEDBITS(here.bits + 2);\n              n = here_bits + 2;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              if (state.have === 0) {\n                strm.msg = 'invalid bit length repeat';\n                state.mode = BAD;\n                break;\n              }\n              len = state.lens[state.have - 1];\n              copy = 3 + (hold & 0x03);//BITS(2);\n              //--- DROPBITS(2) ---//\n              hold >>>= 2;\n              bits -= 2;\n              //---//\n            }\n            else if (here_val === 17) {\n              //=== NEEDBITS(here.bits + 3);\n              n = here_bits + 3;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              len = 0;\n              copy = 3 + (hold & 0x07);//BITS(3);\n              //--- DROPBITS(3) ---//\n              hold >>>= 3;\n              bits -= 3;\n              //---//\n            }\n            else {\n              //=== NEEDBITS(here.bits + 7);\n              n = here_bits + 7;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              len = 0;\n              copy = 11 + (hold & 0x7f);//BITS(7);\n              //--- DROPBITS(7) ---//\n              hold >>>= 7;\n              bits -= 7;\n              //---//\n            }\n            if (state.have + copy > state.nlen + state.ndist) {\n              strm.msg = 'invalid bit length repeat';\n              state.mode = BAD;\n              break;\n            }\n            while (copy--) {\n              state.lens[state.have++] = len;\n            }\n          }\n        }\n\n        /* handle error breaks in while */\n        if (state.mode === BAD) { break; }\n\n        /* check for end-of-block code (better have one) */\n        if (state.lens[256] === 0) {\n          strm.msg = 'invalid code -- missing end-of-block';\n          state.mode = BAD;\n          break;\n        }\n\n        /* build code tables -- note: do not change the lenbits or distbits\n           values here (9 and 6) without reading the comments in inftrees.h\n           concerning the ENOUGH constants, which depend on those values */\n        state.lenbits = 9;\n\n        opts = { bits: state.lenbits };\n        ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        // state.next_index = opts.table_index;\n        state.lenbits = opts.bits;\n        // state.lencode = state.next;\n\n        if (ret) {\n          strm.msg = 'invalid literal/lengths set';\n          state.mode = BAD;\n          break;\n        }\n\n        state.distbits = 6;\n        //state.distcode.copy(state.codes);\n        // Switch to use dynamic table\n        state.distcode = state.distdyn;\n        opts = { bits: state.distbits };\n        ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        // state.next_index = opts.table_index;\n        state.distbits = opts.bits;\n        // state.distcode = state.next;\n\n        if (ret) {\n          strm.msg = 'invalid distances set';\n          state.mode = BAD;\n          break;\n        }\n        //Tracev((stderr, 'inflate:       codes ok\\n'));\n        state.mode = LEN_;\n        if (flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case LEN_:\n        state.mode = LEN;\n        /* falls through */\n      case LEN:\n        if (have >= 6 && left >= 258) {\n          //--- RESTORE() ---\n          strm.next_out = put;\n          strm.avail_out = left;\n          strm.next_in = next;\n          strm.avail_in = have;\n          state.hold = hold;\n          state.bits = bits;\n          //---\n          inffast(strm, _out);\n          //--- LOAD() ---\n          put = strm.next_out;\n          output = strm.output;\n          left = strm.avail_out;\n          next = strm.next_in;\n          input = strm.input;\n          have = strm.avail_in;\n          hold = state.hold;\n          bits = state.bits;\n          //---\n\n          if (state.mode === TYPE) {\n            state.back = -1;\n          }\n          break;\n        }\n        state.back = 0;\n        for (;;) {\n          here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if (here_bits <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if (here_op && (here_op & 0xf0) === 0) {\n          last_bits = here_bits;\n          last_op = here_op;\n          last_val = here_val;\n          for (;;) {\n            here = state.lencode[last_val +\n                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((last_bits + here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          //--- DROPBITS(last.bits) ---//\n          hold >>>= last_bits;\n          bits -= last_bits;\n          //---//\n          state.back += last_bits;\n        }\n        //--- DROPBITS(here.bits) ---//\n        hold >>>= here_bits;\n        bits -= here_bits;\n        //---//\n        state.back += here_bits;\n        state.length = here_val;\n        if (here_op === 0) {\n          //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n          //        \"inflate:         literal '%c'\\n\" :\n          //        \"inflate:         literal 0x%02x\\n\", here.val));\n          state.mode = LIT;\n          break;\n        }\n        if (here_op & 32) {\n          //Tracevv((stderr, \"inflate:         end of block\\n\"));\n          state.back = -1;\n          state.mode = TYPE;\n          break;\n        }\n        if (here_op & 64) {\n          strm.msg = 'invalid literal/length code';\n          state.mode = BAD;\n          break;\n        }\n        state.extra = here_op & 15;\n        state.mode = LENEXT;\n        /* falls through */\n      case LENEXT:\n        if (state.extra) {\n          //=== NEEDBITS(state.extra);\n          n = state.extra;\n          while (bits < n) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n          //--- DROPBITS(state.extra) ---//\n          hold >>>= state.extra;\n          bits -= state.extra;\n          //---//\n          state.back += state.extra;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", state.length));\n        state.was = state.length;\n        state.mode = DIST;\n        /* falls through */\n      case DIST:\n        for (;;) {\n          here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if ((here_op & 0xf0) === 0) {\n          last_bits = here_bits;\n          last_op = here_op;\n          last_val = here_val;\n          for (;;) {\n            here = state.distcode[last_val +\n                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((last_bits + here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          //--- DROPBITS(last.bits) ---//\n          hold >>>= last_bits;\n          bits -= last_bits;\n          //---//\n          state.back += last_bits;\n        }\n        //--- DROPBITS(here.bits) ---//\n        hold >>>= here_bits;\n        bits -= here_bits;\n        //---//\n        state.back += here_bits;\n        if (here_op & 64) {\n          strm.msg = 'invalid distance code';\n          state.mode = BAD;\n          break;\n        }\n        state.offset = here_val;\n        state.extra = (here_op) & 15;\n        state.mode = DISTEXT;\n        /* falls through */\n      case DISTEXT:\n        if (state.extra) {\n          //=== NEEDBITS(state.extra);\n          n = state.extra;\n          while (bits < n) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n          //--- DROPBITS(state.extra) ---//\n          hold >>>= state.extra;\n          bits -= state.extra;\n          //---//\n          state.back += state.extra;\n        }\n//#ifdef INFLATE_STRICT\n        if (state.offset > state.dmax) {\n          strm.msg = 'invalid distance too far back';\n          state.mode = BAD;\n          break;\n        }\n//#endif\n        //Tracevv((stderr, \"inflate:         distance %u\\n\", state.offset));\n        state.mode = MATCH;\n        /* falls through */\n      case MATCH:\n        if (left === 0) { break inf_leave; }\n        copy = _out - left;\n        if (state.offset > copy) {         /* copy from window */\n          copy = state.offset - copy;\n          if (copy > state.whave) {\n            if (state.sane) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD;\n              break;\n            }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//          Trace((stderr, \"inflate.c too far\\n\"));\n//          copy -= state.whave;\n//          if (copy > state.length) { copy = state.length; }\n//          if (copy > left) { copy = left; }\n//          left -= copy;\n//          state.length -= copy;\n//          do {\n//            output[put++] = 0;\n//          } while (--copy);\n//          if (state.length === 0) { state.mode = LEN; }\n//          break;\n//#endif\n          }\n          if (copy > state.wnext) {\n            copy -= state.wnext;\n            from = state.wsize - copy;\n          }\n          else {\n            from = state.wnext - copy;\n          }\n          if (copy > state.length) { copy = state.length; }\n          from_source = state.window;\n        }\n        else {                              /* copy from output */\n          from_source = output;\n          from = put - state.offset;\n          copy = state.length;\n        }\n        if (copy > left) { copy = left; }\n        left -= copy;\n        state.length -= copy;\n        do {\n          output[put++] = from_source[from++];\n        } while (--copy);\n        if (state.length === 0) { state.mode = LEN; }\n        break;\n      case LIT:\n        if (left === 0) { break inf_leave; }\n        output[put++] = state.length;\n        left--;\n        state.mode = LEN;\n        break;\n      case CHECK:\n        if (state.wrap) {\n          //=== NEEDBITS(32);\n          while (bits < 32) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            // Use '|' instead of '+' to make sure that result is signed\n            hold |= input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          _out -= left;\n          strm.total_out += _out;\n          state.total += _out;\n          if ((state.wrap & 4) && _out) {\n            strm.adler = state.check =\n                /*UPDATE_CHECK(state.check, put - _out, _out);*/\n                (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out));\n\n          }\n          _out = left;\n          // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n          if ((state.wrap & 4) && (state.flags ? hold : zswap32(hold)) !== state.check) {\n            strm.msg = 'incorrect data check';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          //Tracev((stderr, \"inflate:   check matches trailer\\n\"));\n        }\n        state.mode = LENGTH;\n        /* falls through */\n      case LENGTH:\n        if (state.wrap && state.flags) {\n          //=== NEEDBITS(32);\n          while (bits < 32) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          if ((state.wrap & 4) && hold !== (state.total & 0xffffffff)) {\n            strm.msg = 'incorrect length check';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          //Tracev((stderr, \"inflate:   length matches trailer\\n\"));\n        }\n        state.mode = DONE;\n        /* falls through */\n      case DONE:\n        ret = Z_STREAM_END$1;\n        break inf_leave;\n      case BAD:\n        ret = Z_DATA_ERROR$1;\n        break inf_leave;\n      case MEM:\n        return Z_MEM_ERROR$1;\n      case SYNC:\n        /* falls through */\n      default:\n        return Z_STREAM_ERROR$1;\n    }\n  }\n\n  // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n  /*\n     Return from inflate(), updating the total counts and the check value.\n     If there was no progress during the inflate() call, return a buffer\n     error.  Call updatewindow() to create and/or update the window state.\n     Note: a memory error from inflate() is non-recoverable.\n   */\n\n  //--- RESTORE() ---\n  strm.next_out = put;\n  strm.avail_out = left;\n  strm.next_in = next;\n  strm.avail_in = have;\n  state.hold = hold;\n  state.bits = bits;\n  //---\n\n  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n                      (state.mode < CHECK || flush !== Z_FINISH$1))) {\n    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;\n  }\n  _in -= strm.avail_in;\n  _out -= strm.avail_out;\n  strm.total_in += _in;\n  strm.total_out += _out;\n  state.total += _out;\n  if ((state.wrap & 4) && _out) {\n    strm.adler = state.check = /*UPDATE_CHECK(state.check, strm.next_out - _out, _out);*/\n      (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out));\n  }\n  strm.data_type = state.bits + (state.last ? 64 : 0) +\n                    (state.mode === TYPE ? 128 : 0) +\n                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n  if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) {\n    ret = Z_BUF_ERROR;\n  }\n  return ret;\n};\n\n\nconst inflateEnd = (strm) => {\n\n  if (inflateStateCheck(strm)) {\n    return Z_STREAM_ERROR$1;\n  }\n\n  let state = strm.state;\n  if (state.window) {\n    state.window = null;\n  }\n  strm.state = null;\n  return Z_OK$1;\n};\n\n\nconst inflateGetHeader = (strm, head) => {\n\n  /* check state */\n  if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n  const state = strm.state;\n  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; }\n\n  /* save header structure */\n  state.head = head;\n  head.done = false;\n  return Z_OK$1;\n};\n\n\nconst inflateSetDictionary = (strm, dictionary) => {\n  const dictLength = dictionary.length;\n\n  let state;\n  let dictid;\n  let ret;\n\n  /* check state */\n  if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n  state = strm.state;\n\n  if (state.wrap !== 0 && state.mode !== DICT) {\n    return Z_STREAM_ERROR$1;\n  }\n\n  /* check for correct dictionary identifier */\n  if (state.mode === DICT) {\n    dictid = 1; /* adler32(0, null, 0)*/\n    /* dictid = adler32(dictid, dictionary, dictLength); */\n    dictid = adler32_1(dictid, dictionary, dictLength, 0);\n    if (dictid !== state.check) {\n      return Z_DATA_ERROR$1;\n    }\n  }\n  /* copy dictionary to window using updatewindow(), which will amend the\n   existing dictionary if appropriate */\n  ret = updatewindow(strm, dictionary, dictLength, dictLength);\n  if (ret) {\n    state.mode = MEM;\n    return Z_MEM_ERROR$1;\n  }\n  state.havedict = 1;\n  // Tracev((stderr, \"inflate:   dictionary set\\n\"));\n  return Z_OK$1;\n};\n\n\nvar inflateReset_1 = inflateReset;\nvar inflateReset2_1 = inflateReset2;\nvar inflateResetKeep_1 = inflateResetKeep;\nvar inflateInit_1 = inflateInit;\nvar inflateInit2_1 = inflateInit2;\nvar inflate_2$1 = inflate$2;\nvar inflateEnd_1 = inflateEnd;\nvar inflateGetHeader_1 = inflateGetHeader;\nvar inflateSetDictionary_1 = inflateSetDictionary;\nvar inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.inflateCodesUsed = inflateCodesUsed;\nmodule.exports.inflateCopy = inflateCopy;\nmodule.exports.inflateGetDictionary = inflateGetDictionary;\nmodule.exports.inflateMark = inflateMark;\nmodule.exports.inflatePrime = inflatePrime;\nmodule.exports.inflateSync = inflateSync;\nmodule.exports.inflateSyncPoint = inflateSyncPoint;\nmodule.exports.inflateUndermine = inflateUndermine;\nmodule.exports.inflateValidate = inflateValidate;\n*/\n\nvar inflate_1$2 = {\n\tinflateReset: inflateReset_1,\n\tinflateReset2: inflateReset2_1,\n\tinflateResetKeep: inflateResetKeep_1,\n\tinflateInit: inflateInit_1,\n\tinflateInit2: inflateInit2_1,\n\tinflate: inflate_2$1,\n\tinflateEnd: inflateEnd_1,\n\tinflateGetHeader: inflateGetHeader_1,\n\tinflateSetDictionary: inflateSetDictionary_1,\n\tinflateInfo: inflateInfo\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n  /* true if compressed data believed to be text */\n  this.text       = 0;\n  /* modification time */\n  this.time       = 0;\n  /* extra flags (not used when writing a gzip file) */\n  this.xflags     = 0;\n  /* operating system */\n  this.os         = 0;\n  /* pointer to extra field or Z_NULL if none */\n  this.extra      = null;\n  /* extra field length (valid if extra != Z_NULL) */\n  this.extra_len  = 0; // Actually, we don't need it in JS,\n                       // but leave for few code modifications\n\n  //\n  // Setup limits is not necessary because in js we should not preallocate memory\n  // for inflate use constant limit in 65536 bytes\n  //\n\n  /* space at extra (only when reading header) */\n  // this.extra_max  = 0;\n  /* pointer to zero-terminated file name or Z_NULL */\n  this.name       = '';\n  /* space at name (only when reading header) */\n  // this.name_max   = 0;\n  /* pointer to zero-terminated comment or Z_NULL */\n  this.comment    = '';\n  /* space at comment (only when reading header) */\n  // this.comm_max   = 0;\n  /* true if there was or will be a header crc */\n  this.hcrc       = 0;\n  /* true when done reading gzip header (not used when writing a gzip file) */\n  this.done       = false;\n}\n\nvar gzheader = GZheader;\n\nconst toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n  Z_NO_FLUSH, Z_FINISH,\n  Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR\n} = constants$2;\n\n/* ===========================================================================*/\n\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true);  // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate$1(options) {\n  this.options = common.assign({\n    chunkSize: 1024 * 64,\n    windowBits: 15,\n    to: ''\n  }, options || {});\n\n  const opt = this.options;\n\n  // Force window size for `raw` data, if not set directly,\n  // because we have no header for autodetect.\n  if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n    opt.windowBits = -opt.windowBits;\n    if (opt.windowBits === 0) { opt.windowBits = -15; }\n  }\n\n  // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n  if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n      !(options && options.windowBits)) {\n    opt.windowBits += 32;\n  }\n\n  // Gzip header has no info about windows size, we can do autodetect only\n  // for deflate. So, if window size not set, force it to max when gzip possible\n  if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n    // bit 3 (16) -> gzipped data\n    // bit 4 (32) -> autodetect gzip/deflate\n    if ((opt.windowBits & 15) === 0) {\n      opt.windowBits |= 15;\n    }\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm   = new zstream();\n  this.strm.avail_out = 0;\n\n  let status  = inflate_1$2.inflateInit2(\n    this.strm,\n    opt.windowBits\n  );\n\n  if (status !== Z_OK) {\n    throw new Error(messages[status]);\n  }\n\n  this.header = new gzheader();\n\n  inflate_1$2.inflateGetHeader(this.strm, this.header);\n\n  // Setup dictionary\n  if (opt.dictionary) {\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      opt.dictionary = strings.string2buf(opt.dictionary);\n    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n      opt.dictionary = new Uint8Array(opt.dictionary);\n    }\n    if (opt.raw) { //In raw mode we need to set the dictionary early\n      status = inflate_1$2.inflateSetDictionary(this.strm, opt.dictionary);\n      if (status !== Z_OK) {\n        throw new Error(messages[status]);\n      }\n    }\n  }\n}\n\n/**\n * Inflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer): input data\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE\n *   flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,\n *   `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. If end of stream detected,\n * [[Inflate#onEnd]] will be called.\n *\n * `flush_mode` is not needed for normal operation, because end of stream\n * detected automatically. You may try to use it for advanced things, but\n * this functionality was not tested.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nInflate$1.prototype.push = function (data, flush_mode) {\n  const strm = this.strm;\n  const chunkSize = this.options.chunkSize;\n  const dictionary = this.options.dictionary;\n  let status, _flush_mode, last_avail_out;\n\n  if (this.ended) return false;\n\n  if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n  else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH;\n\n  // Convert data if needed\n  if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  for (;;) {\n    if (strm.avail_out === 0) {\n      strm.output = new Uint8Array(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n\n    status = inflate_1$2.inflate(strm, _flush_mode);\n\n    if (status === Z_NEED_DICT && dictionary) {\n      status = inflate_1$2.inflateSetDictionary(strm, dictionary);\n\n      if (status === Z_OK) {\n        status = inflate_1$2.inflate(strm, _flush_mode);\n      } else if (status === Z_DATA_ERROR) {\n        // Replace code with more verbose\n        status = Z_NEED_DICT;\n      }\n    }\n\n    // Skip snyc markers if more data follows and not raw mode\n    while (strm.avail_in > 0 &&\n           status === Z_STREAM_END &&\n           strm.state.wrap > 0 &&\n           data[strm.next_in] !== 0)\n    {\n      inflate_1$2.inflateReset(strm);\n      status = inflate_1$2.inflate(strm, _flush_mode);\n    }\n\n    switch (status) {\n      case Z_STREAM_ERROR:\n      case Z_DATA_ERROR:\n      case Z_NEED_DICT:\n      case Z_MEM_ERROR:\n        this.onEnd(status);\n        this.ended = true;\n        return false;\n    }\n\n    // Remember real `avail_out` value, because we may patch out buffer content\n    // to align utf8 strings boundaries.\n    last_avail_out = strm.avail_out;\n\n    if (strm.next_out) {\n      if (strm.avail_out === 0 || status === Z_STREAM_END) {\n\n        if (this.options.to === 'string') {\n\n          let next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n          let tail = strm.next_out - next_out_utf8;\n          let utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n          // move tail & realign counters\n          strm.next_out = tail;\n          strm.avail_out = chunkSize - tail;\n          if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);\n\n          this.onData(utf8str);\n\n        } else {\n          this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));\n        }\n      }\n    }\n\n    // Must repeat iteration if out buffer is full\n    if (status === Z_OK && last_avail_out === 0) continue;\n\n    // Finalize if end of stream reached.\n    if (status === Z_STREAM_END) {\n      status = inflate_1$2.inflateEnd(this.strm);\n      this.onEnd(status);\n      this.ended = true;\n      return true;\n    }\n\n    if (strm.avail_in === 0) break;\n  }\n\n  return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|String): output data. When string output requested,\n *   each chunk will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate$1.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate$1.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === Z_OK) {\n    if (this.options.to === 'string') {\n      this.result = this.chunks.join('');\n    } else {\n      this.result = common.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako');\n * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));\n * let output;\n *\n * try {\n *   output = pako.inflate(input);\n * } catch (err) {\n *   console.log(err);\n * }\n * ```\n **/\nfunction inflate$1(input, options) {\n  const inflator = new Inflate$1(options);\n\n  inflator.push(input);\n\n  // That will never happens, if you don't cheat with options :)\n  if (inflator.err) throw inflator.msg || messages[inflator.err];\n\n  return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw$1(input, options) {\n  options = options || {};\n  options.raw = true;\n  return inflate$1(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nvar Inflate_1$1 = Inflate$1;\nvar inflate_2 = inflate$1;\nvar inflateRaw_1$1 = inflateRaw$1;\nvar ungzip$1 = inflate$1;\nvar constants = constants$2;\n\nvar inflate_1$1 = {\n\tInflate: Inflate_1$1,\n\tinflate: inflate_2,\n\tinflateRaw: inflateRaw_1$1,\n\tungzip: ungzip$1,\n\tconstants: constants\n};\n\nconst { Deflate, deflate, deflateRaw, gzip } = deflate_1$1;\n\nconst { Inflate, inflate, inflateRaw, ungzip } = inflate_1$1;\n\n\n\nvar Deflate_1 = Deflate;\nvar deflate_1 = deflate;\nvar deflateRaw_1 = deflateRaw;\nvar gzip_1 = gzip;\nvar Inflate_1 = Inflate;\nvar inflate_1 = inflate;\nvar inflateRaw_1 = inflateRaw;\nvar ungzip_1 = ungzip;\nvar constants_1 = constants$2;\n\nvar pako = {\n\tDeflate: Deflate_1,\n\tdeflate: deflate_1,\n\tdeflateRaw: deflateRaw_1,\n\tgzip: gzip_1,\n\tInflate: Inflate_1,\n\tinflate: inflate_1,\n\tinflateRaw: inflateRaw_1,\n\tungzip: ungzip_1,\n\tconstants: constants_1\n};\n\nexport { Deflate_1 as Deflate, Inflate_1 as Inflate, constants_1 as constants, pako as default, deflate_1 as deflate, deflateRaw_1 as deflateRaw, gzip_1 as gzip, inflate_1 as inflate, inflateRaw_1 as inflateRaw, ungzip_1 as ungzip };\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nexport class Attribute {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):Attribute {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nstatic getRootAsAttribute(bb:flatbuffers.ByteBuffer, obj?:Attribute):Attribute {\r\n  return (obj || new Attribute()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nstatic getSizePrefixedRootAsAttribute(bb:flatbuffers.ByteBuffer, obj?:Attribute):Attribute {\r\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\r\n  return (obj || new Attribute()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\ndata(index: number):string\r\ndata(index: number,optionalEncoding:flatbuffers.Encoding):string|Uint8Array\r\ndata(index: number,optionalEncoding?:any):string|Uint8Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\r\n}\r\n\r\ndataLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nstatic startAttribute(builder:flatbuffers.Builder) {\r\n  builder.startObject(1);\r\n}\r\n\r\nstatic addData(builder:flatbuffers.Builder, dataOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(0, dataOffset, 0);\r\n}\r\n\r\nstatic createDataVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startDataVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic endAttribute(builder:flatbuffers.Builder):flatbuffers.Offset {\r\n  const offset = builder.endObject();\r\n  builder.requiredField(offset, 4) // data\r\n  return offset;\r\n}\r\n\r\nstatic createAttribute(builder:flatbuffers.Builder, dataOffset:flatbuffers.Offset):flatbuffers.Offset {\r\n  Attribute.startAttribute(builder);\r\n  Attribute.addData(builder, dataOffset);\r\n  return Attribute.endAttribute(builder);\r\n}\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nexport class FloatVector {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):FloatVector {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nx():number {\r\n  return this.bb!.readFloat32(this.bb_pos);\r\n}\r\n\r\nmutate_x(value:number):boolean {\r\n  this.bb!.writeFloat32(this.bb_pos + 0, value);\r\n  return true;\r\n}\r\n\r\ny():number {\r\n  return this.bb!.readFloat32(this.bb_pos + 4);\r\n}\r\n\r\nmutate_y(value:number):boolean {\r\n  this.bb!.writeFloat32(this.bb_pos + 4, value);\r\n  return true;\r\n}\r\n\r\nz():number {\r\n  return this.bb!.readFloat32(this.bb_pos + 8);\r\n}\r\n\r\nmutate_z(value:number):boolean {\r\n  this.bb!.writeFloat32(this.bb_pos + 8, value);\r\n  return true;\r\n}\r\n\r\nstatic sizeOf():number {\r\n  return 12;\r\n}\r\n\r\nstatic createFloatVector(builder:flatbuffers.Builder, x: number, y: number, z: number):flatbuffers.Offset {\r\n  builder.prep(4, 12);\r\n  builder.writeFloat32(z);\r\n  builder.writeFloat32(y);\r\n  builder.writeFloat32(x);\r\n  return builder.offset();\r\n}\r\n\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nimport { FloatVector } from './float-vector.js';\r\n\r\n\r\nexport class CircleCurve {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):CircleCurve {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\naperture():number {\r\n  return this.bb!.readFloat32(this.bb_pos);\r\n}\r\n\r\nmutate_aperture(value:number):boolean {\r\n  this.bb!.writeFloat32(this.bb_pos + 0, value);\r\n  return true;\r\n}\r\n\r\nposition(obj?:FloatVector):FloatVector|null {\r\n  return (obj || new FloatVector()).__init(this.bb_pos + 4, this.bb!);\r\n}\r\n\r\nradius():number {\r\n  return this.bb!.readFloat32(this.bb_pos + 16);\r\n}\r\n\r\nmutate_radius(value:number):boolean {\r\n  this.bb!.writeFloat32(this.bb_pos + 16, value);\r\n  return true;\r\n}\r\n\r\nxDirection(obj?:FloatVector):FloatVector|null {\r\n  return (obj || new FloatVector()).__init(this.bb_pos + 20, this.bb!);\r\n}\r\n\r\nyDirection(obj?:FloatVector):FloatVector|null {\r\n  return (obj || new FloatVector()).__init(this.bb_pos + 32, this.bb!);\r\n}\r\n\r\nstatic sizeOf():number {\r\n  return 44;\r\n}\r\n\r\nstatic createCircleCurve(builder:flatbuffers.Builder, aperture: number, position_x: number, position_y: number, position_z: number, radius: number, x_direction_x: number, x_direction_y: number, x_direction_z: number, y_direction_x: number, y_direction_y: number, y_direction_z: number):flatbuffers.Offset {\r\n  builder.prep(4, 44);\r\n  builder.prep(4, 12);\r\n  builder.writeFloat32(y_direction_z);\r\n  builder.writeFloat32(y_direction_y);\r\n  builder.writeFloat32(y_direction_x);\r\n  builder.prep(4, 12);\r\n  builder.writeFloat32(x_direction_z);\r\n  builder.writeFloat32(x_direction_y);\r\n  builder.writeFloat32(x_direction_x);\r\n  builder.writeFloat32(radius);\r\n  builder.prep(4, 12);\r\n  builder.writeFloat32(position_z);\r\n  builder.writeFloat32(position_y);\r\n  builder.writeFloat32(position_x);\r\n  builder.writeFloat32(aperture);\r\n  return builder.offset();\r\n}\r\n\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nimport { FloatVector } from './float-vector.js';\r\n\r\n\r\nexport class Wire {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):Wire {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\np1(obj?:FloatVector):FloatVector|null {\r\n  return (obj || new FloatVector()).__init(this.bb_pos, this.bb!);\r\n}\r\n\r\np2(obj?:FloatVector):FloatVector|null {\r\n  return (obj || new FloatVector()).__init(this.bb_pos + 12, this.bb!);\r\n}\r\n\r\nstatic sizeOf():number {\r\n  return 24;\r\n}\r\n\r\nstatic createWire(builder:flatbuffers.Builder, p1_x: number, p1_y: number, p1_z: number, p2_x: number, p2_y: number, p2_z: number):flatbuffers.Offset {\r\n  builder.prep(4, 24);\r\n  builder.prep(4, 12);\r\n  builder.writeFloat32(p2_z);\r\n  builder.writeFloat32(p2_y);\r\n  builder.writeFloat32(p2_x);\r\n  builder.prep(4, 12);\r\n  builder.writeFloat32(p1_z);\r\n  builder.writeFloat32(p1_y);\r\n  builder.writeFloat32(p1_x);\r\n  return builder.offset();\r\n}\r\n\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nimport { FloatVector } from './float-vector.js';\r\n\r\n\r\nexport class WireSet {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):WireSet {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nstatic getRootAsWireSet(bb:flatbuffers.ByteBuffer, obj?:WireSet):WireSet {\r\n  return (obj || new WireSet()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nstatic getSizePrefixedRootAsWireSet(bb:flatbuffers.ByteBuffer, obj?:WireSet):WireSet {\r\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\r\n  return (obj || new WireSet()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nps(index: number, obj?:FloatVector):FloatVector|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? (obj || new FloatVector()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 12, this.bb!) : null;\r\n}\r\n\r\npsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nstatic startWireSet(builder:flatbuffers.Builder) {\r\n  builder.startObject(1);\r\n}\r\n\r\nstatic addPs(builder:flatbuffers.Builder, psOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(0, psOffset, 0);\r\n}\r\n\r\nstatic startPsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(12, numElems, 4);\r\n}\r\n\r\nstatic endWireSet(builder:flatbuffers.Builder):flatbuffers.Offset {\r\n  const offset = builder.endObject();\r\n  return offset;\r\n}\r\n\r\nstatic createWireSet(builder:flatbuffers.Builder, psOffset:flatbuffers.Offset):flatbuffers.Offset {\r\n  WireSet.startWireSet(builder);\r\n  WireSet.addPs(builder, psOffset);\r\n  return WireSet.endWireSet(builder);\r\n}\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nimport { AxisPartClass } from './axis-part-class.js';\r\nimport { CircleCurve } from './circle-curve.js';\r\nimport { Wire } from './wire.js';\r\nimport { WireSet } from './wire-set.js';\r\n\r\n\r\nexport class Axis {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):Axis {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nstatic getRootAsAxis(bb:flatbuffers.ByteBuffer, obj?:Axis):Axis {\r\n  return (obj || new Axis()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nstatic getSizePrefixedRootAsAxis(bb:flatbuffers.ByteBuffer, obj?:Axis):Axis {\r\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\r\n  return (obj || new Axis()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nwires(index: number, obj?:Wire):Wire|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? (obj || new Wire()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 24, this.bb!) : null;\r\n}\r\n\r\nwiresLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\norder(index: number):number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n  return offset ? this.bb!.readUint32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\r\n}\r\n\r\norderLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\norderArray():Uint32Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n  return offset ? new Uint32Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\nparts(index: number):AxisPartClass|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 8);\r\n  return offset ? this.bb!.readInt8(this.bb!.__vector(this.bb_pos + offset) + index) : 0;\r\n}\r\n\r\npartsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 8);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\npartsArray():Int8Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 8);\r\n  return offset ? new Int8Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\nwireSets(index: number, obj?:WireSet):WireSet|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 10);\r\n  return offset ? (obj || new WireSet()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\r\n}\r\n\r\nwireSetsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 10);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\ncircleCurves(index: number, obj?:CircleCurve):CircleCurve|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 12);\r\n  return offset ? (obj || new CircleCurve()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 44, this.bb!) : null;\r\n}\r\n\r\ncircleCurvesLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 12);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nstatic startAxis(builder:flatbuffers.Builder) {\r\n  builder.startObject(5);\r\n}\r\n\r\nstatic addWires(builder:flatbuffers.Builder, wiresOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(0, wiresOffset, 0);\r\n}\r\n\r\nstatic startWiresVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(24, numElems, 4);\r\n}\r\n\r\nstatic addOrder(builder:flatbuffers.Builder, orderOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(1, orderOffset, 0);\r\n}\r\n\r\nstatic createOrderVector(builder:flatbuffers.Builder, data:number[]|Uint32Array):flatbuffers.Offset;\r\n/**\r\n * @deprecated This Uint8Array overload will be removed in the future.\r\n */\r\nstatic createOrderVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\r\nstatic createOrderVector(builder:flatbuffers.Builder, data:number[]|Uint32Array|Uint8Array):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addInt32(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startOrderVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addParts(builder:flatbuffers.Builder, partsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(2, partsOffset, 0);\r\n}\r\n\r\nstatic createPartsVector(builder:flatbuffers.Builder, data:AxisPartClass[]):flatbuffers.Offset {\r\n  builder.startVector(1, data.length, 1);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addInt8(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startPartsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(1, numElems, 1);\r\n}\r\n\r\nstatic addWireSets(builder:flatbuffers.Builder, wireSetsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(3, wireSetsOffset, 0);\r\n}\r\n\r\nstatic createWireSetsVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startWireSetsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addCircleCurves(builder:flatbuffers.Builder, circleCurvesOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(4, circleCurvesOffset, 0);\r\n}\r\n\r\nstatic startCircleCurvesVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(44, numElems, 4);\r\n}\r\n\r\nstatic endAxis(builder:flatbuffers.Builder):flatbuffers.Offset {\r\n  const offset = builder.endObject();\r\n  builder.requiredField(offset, 4) // wires\r\n  builder.requiredField(offset, 6) // order\r\n  builder.requiredField(offset, 8) // parts\r\n  builder.requiredField(offset, 10) // wire_sets\r\n  builder.requiredField(offset, 12) // circle_curves\r\n  return offset;\r\n}\r\n\r\nstatic createAxis(builder:flatbuffers.Builder, wiresOffset:flatbuffers.Offset, orderOffset:flatbuffers.Offset, partsOffset:flatbuffers.Offset, wireSetsOffset:flatbuffers.Offset, circleCurvesOffset:flatbuffers.Offset):flatbuffers.Offset {\r\n  Axis.startAxis(builder);\r\n  Axis.addWires(builder, wiresOffset);\r\n  Axis.addOrder(builder, orderOffset);\r\n  Axis.addParts(builder, partsOffset);\r\n  Axis.addWireSets(builder, wireSetsOffset);\r\n  Axis.addCircleCurves(builder, circleCurvesOffset);\r\n  return Axis.endAxis(builder);\r\n}\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nexport enum AxisPartClass {\r\n  NONE = 0,\r\n  WIRE = 1,\r\n  WIRE_SET = 2,\r\n  CIRCLE_CURVE = 3\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nexport class BigShellHole {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):BigShellHole {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nstatic getRootAsBigShellHole(bb:flatbuffers.ByteBuffer, obj?:BigShellHole):BigShellHole {\r\n  return (obj || new BigShellHole()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nstatic getSizePrefixedRootAsBigShellHole(bb:flatbuffers.ByteBuffer, obj?:BigShellHole):BigShellHole {\r\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\r\n  return (obj || new BigShellHole()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nindices(index: number):number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.readUint32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\r\n}\r\n\r\nindicesLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nindicesArray():Uint32Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? new Uint32Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\nprofileId():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n  return offset ? this.bb!.readUint16(this.bb_pos + offset) : 0;\r\n}\r\n\r\nmutate_profile_id(value:number):boolean {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n\r\n  if (offset === 0) {\r\n    return false;\r\n  }\r\n\r\n  this.bb!.writeUint16(this.bb_pos + offset, value);\r\n  return true;\r\n}\r\n\r\nstatic startBigShellHole(builder:flatbuffers.Builder) {\r\n  builder.startObject(2);\r\n}\r\n\r\nstatic addIndices(builder:flatbuffers.Builder, indicesOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(0, indicesOffset, 0);\r\n}\r\n\r\nstatic createIndicesVector(builder:flatbuffers.Builder, data:number[]|Uint32Array):flatbuffers.Offset;\r\n/**\r\n * @deprecated This Uint8Array overload will be removed in the future.\r\n */\r\nstatic createIndicesVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\r\nstatic createIndicesVector(builder:flatbuffers.Builder, data:number[]|Uint32Array|Uint8Array):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addInt32(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startIndicesVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addProfileId(builder:flatbuffers.Builder, profileId:number) {\r\n  builder.addFieldInt16(1, profileId, 0);\r\n}\r\n\r\nstatic endBigShellHole(builder:flatbuffers.Builder):flatbuffers.Offset {\r\n  const offset = builder.endObject();\r\n  builder.requiredField(offset, 4) // indices\r\n  return offset;\r\n}\r\n\r\nstatic createBigShellHole(builder:flatbuffers.Builder, indicesOffset:flatbuffers.Offset, profileId:number):flatbuffers.Offset {\r\n  BigShellHole.startBigShellHole(builder);\r\n  BigShellHole.addIndices(builder, indicesOffset);\r\n  BigShellHole.addProfileId(builder, profileId);\r\n  return BigShellHole.endBigShellHole(builder);\r\n}\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nexport class BigShellProfile {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):BigShellProfile {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nstatic getRootAsBigShellProfile(bb:flatbuffers.ByteBuffer, obj?:BigShellProfile):BigShellProfile {\r\n  return (obj || new BigShellProfile()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nstatic getSizePrefixedRootAsBigShellProfile(bb:flatbuffers.ByteBuffer, obj?:BigShellProfile):BigShellProfile {\r\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\r\n  return (obj || new BigShellProfile()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nindices(index: number):number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.readUint32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\r\n}\r\n\r\nindicesLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nindicesArray():Uint32Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? new Uint32Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\nstatic startBigShellProfile(builder:flatbuffers.Builder) {\r\n  builder.startObject(1);\r\n}\r\n\r\nstatic addIndices(builder:flatbuffers.Builder, indicesOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(0, indicesOffset, 0);\r\n}\r\n\r\nstatic createIndicesVector(builder:flatbuffers.Builder, data:number[]|Uint32Array):flatbuffers.Offset;\r\n/**\r\n * @deprecated This Uint8Array overload will be removed in the future.\r\n */\r\nstatic createIndicesVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\r\nstatic createIndicesVector(builder:flatbuffers.Builder, data:number[]|Uint32Array|Uint8Array):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addInt32(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startIndicesVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic endBigShellProfile(builder:flatbuffers.Builder):flatbuffers.Offset {\r\n  const offset = builder.endObject();\r\n  builder.requiredField(offset, 4) // indices\r\n  return offset;\r\n}\r\n\r\nstatic createBigShellProfile(builder:flatbuffers.Builder, indicesOffset:flatbuffers.Offset):flatbuffers.Offset {\r\n  BigShellProfile.startBigShellProfile(builder);\r\n  BigShellProfile.addIndices(builder, indicesOffset);\r\n  return BigShellProfile.endBigShellProfile(builder);\r\n}\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nimport { FloatVector } from './float-vector.js';\r\n\r\n\r\nexport class BoundingBox {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):BoundingBox {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nmin(obj?:FloatVector):FloatVector|null {\r\n  return (obj || new FloatVector()).__init(this.bb_pos, this.bb!);\r\n}\r\n\r\nmax(obj?:FloatVector):FloatVector|null {\r\n  return (obj || new FloatVector()).__init(this.bb_pos + 12, this.bb!);\r\n}\r\n\r\nstatic sizeOf():number {\r\n  return 24;\r\n}\r\n\r\nstatic createBoundingBox(builder:flatbuffers.Builder, min_x: number, min_y: number, min_z: number, max_x: number, max_y: number, max_z: number):flatbuffers.Offset {\r\n  builder.prep(4, 24);\r\n  builder.prep(4, 12);\r\n  builder.writeFloat32(max_z);\r\n  builder.writeFloat32(max_y);\r\n  builder.writeFloat32(max_x);\r\n  builder.prep(4, 12);\r\n  builder.writeFloat32(min_z);\r\n  builder.writeFloat32(min_y);\r\n  builder.writeFloat32(min_x);\r\n  return builder.offset();\r\n}\r\n\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nimport { Axis } from './axis.js';\r\n\r\n\r\nexport class CircleExtrusion {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):CircleExtrusion {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nstatic getRootAsCircleExtrusion(bb:flatbuffers.ByteBuffer, obj?:CircleExtrusion):CircleExtrusion {\r\n  return (obj || new CircleExtrusion()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nstatic getSizePrefixedRootAsCircleExtrusion(bb:flatbuffers.ByteBuffer, obj?:CircleExtrusion):CircleExtrusion {\r\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\r\n  return (obj || new CircleExtrusion()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nradius(index: number):number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.readFloat64(this.bb!.__vector(this.bb_pos + offset) + index * 8) : 0;\r\n}\r\n\r\nradiusLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nradiusArray():Float64Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? new Float64Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\naxes(index: number, obj?:Axis):Axis|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n  return offset ? (obj || new Axis()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\r\n}\r\n\r\naxesLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nstatic startCircleExtrusion(builder:flatbuffers.Builder) {\r\n  builder.startObject(2);\r\n}\r\n\r\nstatic addRadius(builder:flatbuffers.Builder, radiusOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(0, radiusOffset, 0);\r\n}\r\n\r\nstatic createRadiusVector(builder:flatbuffers.Builder, data:number[]|Float64Array):flatbuffers.Offset;\r\n/**\r\n * @deprecated This Uint8Array overload will be removed in the future.\r\n */\r\nstatic createRadiusVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\r\nstatic createRadiusVector(builder:flatbuffers.Builder, data:number[]|Float64Array|Uint8Array):flatbuffers.Offset {\r\n  builder.startVector(8, data.length, 8);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addFloat64(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startRadiusVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(8, numElems, 8);\r\n}\r\n\r\nstatic addAxes(builder:flatbuffers.Builder, axesOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(1, axesOffset, 0);\r\n}\r\n\r\nstatic createAxesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startAxesVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic endCircleExtrusion(builder:flatbuffers.Builder):flatbuffers.Offset {\r\n  const offset = builder.endObject();\r\n  builder.requiredField(offset, 4) // radius\r\n  builder.requiredField(offset, 6) // axes\r\n  return offset;\r\n}\r\n\r\nstatic createCircleExtrusion(builder:flatbuffers.Builder, radiusOffset:flatbuffers.Offset, axesOffset:flatbuffers.Offset):flatbuffers.Offset {\r\n  CircleExtrusion.startCircleExtrusion(builder);\r\n  CircleExtrusion.addRadius(builder, radiusOffset);\r\n  CircleExtrusion.addAxes(builder, axesOffset);\r\n  return CircleExtrusion.endCircleExtrusion(builder);\r\n}\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nexport class DoubleVector {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):DoubleVector {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nx():number {\r\n  return this.bb!.readFloat64(this.bb_pos);\r\n}\r\n\r\nmutate_x(value:number):boolean {\r\n  this.bb!.writeFloat64(this.bb_pos + 0, value);\r\n  return true;\r\n}\r\n\r\ny():number {\r\n  return this.bb!.readFloat64(this.bb_pos + 8);\r\n}\r\n\r\nmutate_y(value:number):boolean {\r\n  this.bb!.writeFloat64(this.bb_pos + 8, value);\r\n  return true;\r\n}\r\n\r\nz():number {\r\n  return this.bb!.readFloat64(this.bb_pos + 16);\r\n}\r\n\r\nmutate_z(value:number):boolean {\r\n  this.bb!.writeFloat64(this.bb_pos + 16, value);\r\n  return true;\r\n}\r\n\r\nstatic sizeOf():number {\r\n  return 24;\r\n}\r\n\r\nstatic createDoubleVector(builder:flatbuffers.Builder, x: number, y: number, z: number):flatbuffers.Offset {\r\n  builder.prep(8, 24);\r\n  builder.writeFloat64(z);\r\n  builder.writeFloat64(y);\r\n  builder.writeFloat64(x);\r\n  return builder.offset();\r\n}\r\n\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nimport { RenderedFaces } from './rendered-faces.js';\r\nimport { Stroke } from './stroke.js';\r\n\r\n\r\nexport class Material {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):Material {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nr():number {\r\n  return this.bb!.readUint8(this.bb_pos);\r\n}\r\n\r\nmutate_r(value:number):boolean {\r\n  this.bb!.writeUint8(this.bb_pos + 0, value);\r\n  return true;\r\n}\r\n\r\ng():number {\r\n  return this.bb!.readUint8(this.bb_pos + 1);\r\n}\r\n\r\nmutate_g(value:number):boolean {\r\n  this.bb!.writeUint8(this.bb_pos + 1, value);\r\n  return true;\r\n}\r\n\r\nb():number {\r\n  return this.bb!.readUint8(this.bb_pos + 2);\r\n}\r\n\r\nmutate_b(value:number):boolean {\r\n  this.bb!.writeUint8(this.bb_pos + 2, value);\r\n  return true;\r\n}\r\n\r\na():number {\r\n  return this.bb!.readUint8(this.bb_pos + 3);\r\n}\r\n\r\nmutate_a(value:number):boolean {\r\n  this.bb!.writeUint8(this.bb_pos + 3, value);\r\n  return true;\r\n}\r\n\r\nrenderedFaces():RenderedFaces {\r\n  return this.bb!.readInt8(this.bb_pos + 4);\r\n}\r\n\r\nmutate_rendered_faces(value:RenderedFaces):boolean {\r\n  this.bb!.writeInt8(this.bb_pos + 4, value);\r\n  return true;\r\n}\r\n\r\nstroke():Stroke {\r\n  return this.bb!.readInt8(this.bb_pos + 5);\r\n}\r\n\r\nmutate_stroke(value:Stroke):boolean {\r\n  this.bb!.writeInt8(this.bb_pos + 5, value);\r\n  return true;\r\n}\r\n\r\nstatic sizeOf():number {\r\n  return 6;\r\n}\r\n\r\nstatic createMaterial(builder:flatbuffers.Builder, r: number, g: number, b: number, a: number, rendered_faces: RenderedFaces, stroke: Stroke):flatbuffers.Offset {\r\n  builder.prep(1, 6);\r\n  builder.writeInt8(stroke);\r\n  builder.writeInt8(rendered_faces);\r\n  builder.writeInt8(a);\r\n  builder.writeInt8(b);\r\n  builder.writeInt8(g);\r\n  builder.writeInt8(r);\r\n  return builder.offset();\r\n}\r\n\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nimport { BoundingBox } from './bounding-box.js';\r\nimport { RepresentationClass } from './representation-class.js';\r\n\r\n\r\nexport class Representation {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):Representation {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nid():number {\r\n  return this.bb!.readUint32(this.bb_pos);\r\n}\r\n\r\nmutate_id(value:number):boolean {\r\n  this.bb!.writeUint32(this.bb_pos + 0, value);\r\n  return true;\r\n}\r\n\r\nbbox(obj?:BoundingBox):BoundingBox|null {\r\n  return (obj || new BoundingBox()).__init(this.bb_pos + 4, this.bb!);\r\n}\r\n\r\nrepresentationClass():RepresentationClass {\r\n  return this.bb!.readInt8(this.bb_pos + 28);\r\n}\r\n\r\nmutate_representation_class(value:RepresentationClass):boolean {\r\n  this.bb!.writeInt8(this.bb_pos + 28, value);\r\n  return true;\r\n}\r\n\r\nstatic sizeOf():number {\r\n  return 32;\r\n}\r\n\r\nstatic createRepresentation(builder:flatbuffers.Builder, id: number, bbox_min_x: number, bbox_min_y: number, bbox_min_z: number, bbox_max_x: number, bbox_max_y: number, bbox_max_z: number, representation_class: RepresentationClass):flatbuffers.Offset {\r\n  builder.prep(4, 32);\r\n  builder.pad(3);\r\n  builder.writeInt8(representation_class);\r\n  builder.prep(4, 24);\r\n  builder.prep(4, 12);\r\n  builder.writeFloat32(bbox_max_z);\r\n  builder.writeFloat32(bbox_max_y);\r\n  builder.writeFloat32(bbox_max_x);\r\n  builder.prep(4, 12);\r\n  builder.writeFloat32(bbox_min_z);\r\n  builder.writeFloat32(bbox_min_y);\r\n  builder.writeFloat32(bbox_min_x);\r\n  builder.writeInt32(id);\r\n  return builder.offset();\r\n}\r\n\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nexport class Sample {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):Sample {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nitem():number {\r\n  return this.bb!.readUint32(this.bb_pos);\r\n}\r\n\r\nmutate_item(value:number):boolean {\r\n  this.bb!.writeUint32(this.bb_pos + 0, value);\r\n  return true;\r\n}\r\n\r\nmaterial():number {\r\n  return this.bb!.readUint32(this.bb_pos + 4);\r\n}\r\n\r\nmutate_material(value:number):boolean {\r\n  this.bb!.writeUint32(this.bb_pos + 4, value);\r\n  return true;\r\n}\r\n\r\nrepresentation():number {\r\n  return this.bb!.readUint32(this.bb_pos + 8);\r\n}\r\n\r\nmutate_representation(value:number):boolean {\r\n  this.bb!.writeUint32(this.bb_pos + 8, value);\r\n  return true;\r\n}\r\n\r\nlocalTransform():number {\r\n  return this.bb!.readUint32(this.bb_pos + 12);\r\n}\r\n\r\nmutate_local_transform(value:number):boolean {\r\n  this.bb!.writeUint32(this.bb_pos + 12, value);\r\n  return true;\r\n}\r\n\r\nstatic sizeOf():number {\r\n  return 16;\r\n}\r\n\r\nstatic createSample(builder:flatbuffers.Builder, item: number, material: number, representation: number, local_transform: number):flatbuffers.Offset {\r\n  builder.prep(4, 16);\r\n  builder.writeInt32(local_transform);\r\n  builder.writeInt32(representation);\r\n  builder.writeInt32(material);\r\n  builder.writeInt32(item);\r\n  return builder.offset();\r\n}\r\n\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nexport class ShellHole {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):ShellHole {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nstatic getRootAsShellHole(bb:flatbuffers.ByteBuffer, obj?:ShellHole):ShellHole {\r\n  return (obj || new ShellHole()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nstatic getSizePrefixedRootAsShellHole(bb:flatbuffers.ByteBuffer, obj?:ShellHole):ShellHole {\r\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\r\n  return (obj || new ShellHole()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nindices(index: number):number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.readUint16(this.bb!.__vector(this.bb_pos + offset) + index * 2) : 0;\r\n}\r\n\r\nindicesLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nindicesArray():Uint16Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? new Uint16Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\nprofileId():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n  return offset ? this.bb!.readUint16(this.bb_pos + offset) : 0;\r\n}\r\n\r\nmutate_profile_id(value:number):boolean {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n\r\n  if (offset === 0) {\r\n    return false;\r\n  }\r\n\r\n  this.bb!.writeUint16(this.bb_pos + offset, value);\r\n  return true;\r\n}\r\n\r\nstatic startShellHole(builder:flatbuffers.Builder) {\r\n  builder.startObject(2);\r\n}\r\n\r\nstatic addIndices(builder:flatbuffers.Builder, indicesOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(0, indicesOffset, 0);\r\n}\r\n\r\nstatic createIndicesVector(builder:flatbuffers.Builder, data:number[]|Uint16Array):flatbuffers.Offset;\r\n/**\r\n * @deprecated This Uint8Array overload will be removed in the future.\r\n */\r\nstatic createIndicesVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\r\nstatic createIndicesVector(builder:flatbuffers.Builder, data:number[]|Uint16Array|Uint8Array):flatbuffers.Offset {\r\n  builder.startVector(2, data.length, 2);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addInt16(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startIndicesVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(2, numElems, 2);\r\n}\r\n\r\nstatic addProfileId(builder:flatbuffers.Builder, profileId:number) {\r\n  builder.addFieldInt16(1, profileId, 0);\r\n}\r\n\r\nstatic endShellHole(builder:flatbuffers.Builder):flatbuffers.Offset {\r\n  const offset = builder.endObject();\r\n  builder.requiredField(offset, 4) // indices\r\n  return offset;\r\n}\r\n\r\nstatic createShellHole(builder:flatbuffers.Builder, indicesOffset:flatbuffers.Offset, profileId:number):flatbuffers.Offset {\r\n  ShellHole.startShellHole(builder);\r\n  ShellHole.addIndices(builder, indicesOffset);\r\n  ShellHole.addProfileId(builder, profileId);\r\n  return ShellHole.endShellHole(builder);\r\n}\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nexport class ShellProfile {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):ShellProfile {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nstatic getRootAsShellProfile(bb:flatbuffers.ByteBuffer, obj?:ShellProfile):ShellProfile {\r\n  return (obj || new ShellProfile()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nstatic getSizePrefixedRootAsShellProfile(bb:flatbuffers.ByteBuffer, obj?:ShellProfile):ShellProfile {\r\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\r\n  return (obj || new ShellProfile()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nindices(index: number):number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.readUint16(this.bb!.__vector(this.bb_pos + offset) + index * 2) : 0;\r\n}\r\n\r\nindicesLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nindicesArray():Uint16Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? new Uint16Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\nstatic startShellProfile(builder:flatbuffers.Builder) {\r\n  builder.startObject(1);\r\n}\r\n\r\nstatic addIndices(builder:flatbuffers.Builder, indicesOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(0, indicesOffset, 0);\r\n}\r\n\r\nstatic createIndicesVector(builder:flatbuffers.Builder, data:number[]|Uint16Array):flatbuffers.Offset;\r\n/**\r\n * @deprecated This Uint8Array overload will be removed in the future.\r\n */\r\nstatic createIndicesVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\r\nstatic createIndicesVector(builder:flatbuffers.Builder, data:number[]|Uint16Array|Uint8Array):flatbuffers.Offset {\r\n  builder.startVector(2, data.length, 2);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addInt16(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startIndicesVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(2, numElems, 2);\r\n}\r\n\r\nstatic endShellProfile(builder:flatbuffers.Builder):flatbuffers.Offset {\r\n  const offset = builder.endObject();\r\n  builder.requiredField(offset, 4) // indices\r\n  return offset;\r\n}\r\n\r\nstatic createShellProfile(builder:flatbuffers.Builder, indicesOffset:flatbuffers.Offset):flatbuffers.Offset {\r\n  ShellProfile.startShellProfile(builder);\r\n  ShellProfile.addIndices(builder, indicesOffset);\r\n  return ShellProfile.endShellProfile(builder);\r\n}\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nexport enum ShellType {\r\n  NONE = 0,\r\n  BIG = 1\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nimport { BigShellHole } from './big-shell-hole.js';\r\nimport { BigShellProfile } from './big-shell-profile.js';\r\nimport { FloatVector } from './float-vector.js';\r\nimport { ShellHole } from './shell-hole.js';\r\nimport { ShellProfile } from './shell-profile.js';\r\nimport { ShellType } from './shell-type.js';\r\n\r\n\r\nexport class Shell {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):Shell {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nstatic getRootAsShell(bb:flatbuffers.ByteBuffer, obj?:Shell):Shell {\r\n  return (obj || new Shell()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nstatic getSizePrefixedRootAsShell(bb:flatbuffers.ByteBuffer, obj?:Shell):Shell {\r\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\r\n  return (obj || new Shell()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nprofiles(index: number, obj?:ShellProfile):ShellProfile|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? (obj || new ShellProfile()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\r\n}\r\n\r\nprofilesLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nholes(index: number, obj?:ShellHole):ShellHole|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n  return offset ? (obj || new ShellHole()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\r\n}\r\n\r\nholesLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\npoints(index: number, obj?:FloatVector):FloatVector|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 8);\r\n  return offset ? (obj || new FloatVector()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 12, this.bb!) : null;\r\n}\r\n\r\npointsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 8);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nbigProfiles(index: number, obj?:BigShellProfile):BigShellProfile|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 10);\r\n  return offset ? (obj || new BigShellProfile()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\r\n}\r\n\r\nbigProfilesLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 10);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nbigHoles(index: number, obj?:BigShellHole):BigShellHole|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 12);\r\n  return offset ? (obj || new BigShellHole()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\r\n}\r\n\r\nbigHolesLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 12);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\ntype():ShellType {\r\n  const offset = this.bb!.__offset(this.bb_pos, 14);\r\n  return offset ? this.bb!.readInt8(this.bb_pos + offset) : ShellType.NONE;\r\n}\r\n\r\nmutate_type(value:ShellType):boolean {\r\n  const offset = this.bb!.__offset(this.bb_pos, 14);\r\n\r\n  if (offset === 0) {\r\n    return false;\r\n  }\r\n\r\n  this.bb!.writeInt8(this.bb_pos + offset, value);\r\n  return true;\r\n}\r\n\r\nprofilesFaceIds(index: number):number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 16);\r\n  return offset ? this.bb!.readUint16(this.bb!.__vector(this.bb_pos + offset) + index * 2) : 0;\r\n}\r\n\r\nprofilesFaceIdsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 16);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nprofilesFaceIdsArray():Uint16Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 16);\r\n  return offset ? new Uint16Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\nstatic startShell(builder:flatbuffers.Builder) {\r\n  builder.startObject(7);\r\n}\r\n\r\nstatic addProfiles(builder:flatbuffers.Builder, profilesOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(0, profilesOffset, 0);\r\n}\r\n\r\nstatic createProfilesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startProfilesVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addHoles(builder:flatbuffers.Builder, holesOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(1, holesOffset, 0);\r\n}\r\n\r\nstatic createHolesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startHolesVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addPoints(builder:flatbuffers.Builder, pointsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(2, pointsOffset, 0);\r\n}\r\n\r\nstatic startPointsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(12, numElems, 4);\r\n}\r\n\r\nstatic addBigProfiles(builder:flatbuffers.Builder, bigProfilesOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(3, bigProfilesOffset, 0);\r\n}\r\n\r\nstatic createBigProfilesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startBigProfilesVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addBigHoles(builder:flatbuffers.Builder, bigHolesOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(4, bigHolesOffset, 0);\r\n}\r\n\r\nstatic createBigHolesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startBigHolesVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addType(builder:flatbuffers.Builder, type:ShellType) {\r\n  builder.addFieldInt8(5, type, ShellType.NONE);\r\n}\r\n\r\nstatic addProfilesFaceIds(builder:flatbuffers.Builder, profilesFaceIdsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(6, profilesFaceIdsOffset, 0);\r\n}\r\n\r\nstatic createProfilesFaceIdsVector(builder:flatbuffers.Builder, data:number[]|Uint16Array):flatbuffers.Offset;\r\n/**\r\n * @deprecated This Uint8Array overload will be removed in the future.\r\n */\r\nstatic createProfilesFaceIdsVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\r\nstatic createProfilesFaceIdsVector(builder:flatbuffers.Builder, data:number[]|Uint16Array|Uint8Array):flatbuffers.Offset {\r\n  builder.startVector(2, data.length, 2);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addInt16(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startProfilesFaceIdsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(2, numElems, 2);\r\n}\r\n\r\nstatic endShell(builder:flatbuffers.Builder):flatbuffers.Offset {\r\n  const offset = builder.endObject();\r\n  builder.requiredField(offset, 4) // profiles\r\n  builder.requiredField(offset, 6) // holes\r\n  builder.requiredField(offset, 8) // points\r\n  builder.requiredField(offset, 10) // big_profiles\r\n  builder.requiredField(offset, 12) // big_holes\r\n  builder.requiredField(offset, 16) // profiles_face_ids\r\n  return offset;\r\n}\r\n\r\nstatic createShell(builder:flatbuffers.Builder, profilesOffset:flatbuffers.Offset, holesOffset:flatbuffers.Offset, pointsOffset:flatbuffers.Offset, bigProfilesOffset:flatbuffers.Offset, bigHolesOffset:flatbuffers.Offset, type:ShellType, profilesFaceIdsOffset:flatbuffers.Offset):flatbuffers.Offset {\r\n  Shell.startShell(builder);\r\n  Shell.addProfiles(builder, profilesOffset);\r\n  Shell.addHoles(builder, holesOffset);\r\n  Shell.addPoints(builder, pointsOffset);\r\n  Shell.addBigProfiles(builder, bigProfilesOffset);\r\n  Shell.addBigHoles(builder, bigHolesOffset);\r\n  Shell.addType(builder, type);\r\n  Shell.addProfilesFaceIds(builder, profilesFaceIdsOffset);\r\n  return Shell.endShell(builder);\r\n}\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nimport { DoubleVector } from './double-vector.js';\r\nimport { FloatVector } from './float-vector.js';\r\n\r\n\r\nexport class Transform {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):Transform {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nposition(obj?:DoubleVector):DoubleVector|null {\r\n  return (obj || new DoubleVector()).__init(this.bb_pos, this.bb!);\r\n}\r\n\r\nxDirection(obj?:FloatVector):FloatVector|null {\r\n  return (obj || new FloatVector()).__init(this.bb_pos + 24, this.bb!);\r\n}\r\n\r\nyDirection(obj?:FloatVector):FloatVector|null {\r\n  return (obj || new FloatVector()).__init(this.bb_pos + 36, this.bb!);\r\n}\r\n\r\nstatic sizeOf():number {\r\n  return 48;\r\n}\r\n\r\nstatic createTransform(builder:flatbuffers.Builder, position_x: number, position_y: number, position_z: number, x_direction_x: number, x_direction_y: number, x_direction_z: number, y_direction_x: number, y_direction_y: number, y_direction_z: number):flatbuffers.Offset {\r\n  builder.prep(8, 48);\r\n  builder.prep(4, 12);\r\n  builder.writeFloat32(y_direction_z);\r\n  builder.writeFloat32(y_direction_y);\r\n  builder.writeFloat32(y_direction_x);\r\n  builder.prep(4, 12);\r\n  builder.writeFloat32(x_direction_z);\r\n  builder.writeFloat32(x_direction_y);\r\n  builder.writeFloat32(x_direction_x);\r\n  builder.prep(8, 24);\r\n  builder.writeFloat64(position_z);\r\n  builder.writeFloat64(position_y);\r\n  builder.writeFloat64(position_x);\r\n  return builder.offset();\r\n}\r\n\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nimport { CircleExtrusion } from './circle-extrusion.js';\r\nimport { Material } from './material.js';\r\nimport { Representation } from './representation.js';\r\nimport { Sample } from './sample.js';\r\nimport { Shell } from './shell.js';\r\nimport { Transform } from './transform.js';\r\n\r\n\r\nexport class Meshes {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):Meshes {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nstatic getRootAsMeshes(bb:flatbuffers.ByteBuffer, obj?:Meshes):Meshes {\r\n  return (obj || new Meshes()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nstatic getSizePrefixedRootAsMeshes(bb:flatbuffers.ByteBuffer, obj?:Meshes):Meshes {\r\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\r\n  return (obj || new Meshes()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\ncoordinates(obj?:Transform):Transform|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? (obj || new Transform()).__init(this.bb_pos + offset, this.bb!) : null;\r\n}\r\n\r\nmeshesItems(index: number):number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n  return offset ? this.bb!.readUint32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\r\n}\r\n\r\nmeshesItemsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nmeshesItemsArray():Uint32Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n  return offset ? new Uint32Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\nsamples(index: number, obj?:Sample):Sample|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 8);\r\n  return offset ? (obj || new Sample()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 16, this.bb!) : null;\r\n}\r\n\r\nsamplesLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 8);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nrepresentations(index: number, obj?:Representation):Representation|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 10);\r\n  return offset ? (obj || new Representation()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 32, this.bb!) : null;\r\n}\r\n\r\nrepresentationsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 10);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nmaterials(index: number, obj?:Material):Material|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 12);\r\n  return offset ? (obj || new Material()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 6, this.bb!) : null;\r\n}\r\n\r\nmaterialsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 12);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\ncircleExtrusions(index: number, obj?:CircleExtrusion):CircleExtrusion|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 14);\r\n  return offset ? (obj || new CircleExtrusion()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\r\n}\r\n\r\ncircleExtrusionsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 14);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nshells(index: number, obj?:Shell):Shell|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 16);\r\n  return offset ? (obj || new Shell()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\r\n}\r\n\r\nshellsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 16);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nlocalTransforms(index: number, obj?:Transform):Transform|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 18);\r\n  return offset ? (obj || new Transform()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 48, this.bb!) : null;\r\n}\r\n\r\nlocalTransformsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 18);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nglobalTransforms(index: number, obj?:Transform):Transform|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 20);\r\n  return offset ? (obj || new Transform()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 48, this.bb!) : null;\r\n}\r\n\r\nglobalTransformsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 20);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nmaterialIds(index: number):number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 22);\r\n  return offset ? this.bb!.readUint32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\r\n}\r\n\r\nmaterialIdsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 22);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nmaterialIdsArray():Uint32Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 22);\r\n  return offset ? new Uint32Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\nrepresentationIds(index: number):number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 24);\r\n  return offset ? this.bb!.readUint32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\r\n}\r\n\r\nrepresentationIdsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 24);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nrepresentationIdsArray():Uint32Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 24);\r\n  return offset ? new Uint32Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\nsampleIds(index: number):number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 26);\r\n  return offset ? this.bb!.readUint32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\r\n}\r\n\r\nsampleIdsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 26);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nsampleIdsArray():Uint32Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 26);\r\n  return offset ? new Uint32Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\nlocalTransformIds(index: number):number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 28);\r\n  return offset ? this.bb!.readUint32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\r\n}\r\n\r\nlocalTransformIdsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 28);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nlocalTransformIdsArray():Uint32Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 28);\r\n  return offset ? new Uint32Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\nglobalTransformIds(index: number):number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 30);\r\n  return offset ? this.bb!.readUint32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\r\n}\r\n\r\nglobalTransformIdsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 30);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nglobalTransformIdsArray():Uint32Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 30);\r\n  return offset ? new Uint32Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\nstatic startMeshes(builder:flatbuffers.Builder) {\r\n  builder.startObject(14);\r\n}\r\n\r\nstatic addCoordinates(builder:flatbuffers.Builder, coordinatesOffset:flatbuffers.Offset) {\r\n  builder.addFieldStruct(0, coordinatesOffset, 0);\r\n}\r\n\r\nstatic addMeshesItems(builder:flatbuffers.Builder, meshesItemsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(1, meshesItemsOffset, 0);\r\n}\r\n\r\nstatic createMeshesItemsVector(builder:flatbuffers.Builder, data:number[]|Uint32Array):flatbuffers.Offset;\r\n/**\r\n * @deprecated This Uint8Array overload will be removed in the future.\r\n */\r\nstatic createMeshesItemsVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\r\nstatic createMeshesItemsVector(builder:flatbuffers.Builder, data:number[]|Uint32Array|Uint8Array):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addInt32(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startMeshesItemsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addSamples(builder:flatbuffers.Builder, samplesOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(2, samplesOffset, 0);\r\n}\r\n\r\nstatic startSamplesVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(16, numElems, 4);\r\n}\r\n\r\nstatic addRepresentations(builder:flatbuffers.Builder, representationsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(3, representationsOffset, 0);\r\n}\r\n\r\nstatic startRepresentationsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(32, numElems, 4);\r\n}\r\n\r\nstatic addMaterials(builder:flatbuffers.Builder, materialsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(4, materialsOffset, 0);\r\n}\r\n\r\nstatic startMaterialsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(6, numElems, 1);\r\n}\r\n\r\nstatic addCircleExtrusions(builder:flatbuffers.Builder, circleExtrusionsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(5, circleExtrusionsOffset, 0);\r\n}\r\n\r\nstatic createCircleExtrusionsVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startCircleExtrusionsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addShells(builder:flatbuffers.Builder, shellsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(6, shellsOffset, 0);\r\n}\r\n\r\nstatic createShellsVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startShellsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addLocalTransforms(builder:flatbuffers.Builder, localTransformsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(7, localTransformsOffset, 0);\r\n}\r\n\r\nstatic startLocalTransformsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(48, numElems, 8);\r\n}\r\n\r\nstatic addGlobalTransforms(builder:flatbuffers.Builder, globalTransformsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(8, globalTransformsOffset, 0);\r\n}\r\n\r\nstatic startGlobalTransformsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(48, numElems, 8);\r\n}\r\n\r\nstatic addMaterialIds(builder:flatbuffers.Builder, materialIdsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(9, materialIdsOffset, 0);\r\n}\r\n\r\nstatic createMaterialIdsVector(builder:flatbuffers.Builder, data:number[]|Uint32Array):flatbuffers.Offset;\r\n/**\r\n * @deprecated This Uint8Array overload will be removed in the future.\r\n */\r\nstatic createMaterialIdsVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\r\nstatic createMaterialIdsVector(builder:flatbuffers.Builder, data:number[]|Uint32Array|Uint8Array):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addInt32(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startMaterialIdsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addRepresentationIds(builder:flatbuffers.Builder, representationIdsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(10, representationIdsOffset, 0);\r\n}\r\n\r\nstatic createRepresentationIdsVector(builder:flatbuffers.Builder, data:number[]|Uint32Array):flatbuffers.Offset;\r\n/**\r\n * @deprecated This Uint8Array overload will be removed in the future.\r\n */\r\nstatic createRepresentationIdsVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\r\nstatic createRepresentationIdsVector(builder:flatbuffers.Builder, data:number[]|Uint32Array|Uint8Array):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addInt32(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startRepresentationIdsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addSampleIds(builder:flatbuffers.Builder, sampleIdsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(11, sampleIdsOffset, 0);\r\n}\r\n\r\nstatic createSampleIdsVector(builder:flatbuffers.Builder, data:number[]|Uint32Array):flatbuffers.Offset;\r\n/**\r\n * @deprecated This Uint8Array overload will be removed in the future.\r\n */\r\nstatic createSampleIdsVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\r\nstatic createSampleIdsVector(builder:flatbuffers.Builder, data:number[]|Uint32Array|Uint8Array):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addInt32(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startSampleIdsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addLocalTransformIds(builder:flatbuffers.Builder, localTransformIdsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(12, localTransformIdsOffset, 0);\r\n}\r\n\r\nstatic createLocalTransformIdsVector(builder:flatbuffers.Builder, data:number[]|Uint32Array):flatbuffers.Offset;\r\n/**\r\n * @deprecated This Uint8Array overload will be removed in the future.\r\n */\r\nstatic createLocalTransformIdsVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\r\nstatic createLocalTransformIdsVector(builder:flatbuffers.Builder, data:number[]|Uint32Array|Uint8Array):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addInt32(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startLocalTransformIdsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addGlobalTransformIds(builder:flatbuffers.Builder, globalTransformIdsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(13, globalTransformIdsOffset, 0);\r\n}\r\n\r\nstatic createGlobalTransformIdsVector(builder:flatbuffers.Builder, data:number[]|Uint32Array):flatbuffers.Offset;\r\n/**\r\n * @deprecated This Uint8Array overload will be removed in the future.\r\n */\r\nstatic createGlobalTransformIdsVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\r\nstatic createGlobalTransformIdsVector(builder:flatbuffers.Builder, data:number[]|Uint32Array|Uint8Array):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addInt32(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startGlobalTransformIdsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic endMeshes(builder:flatbuffers.Builder):flatbuffers.Offset {\r\n  const offset = builder.endObject();\r\n  builder.requiredField(offset, 4) // coordinates\r\n  builder.requiredField(offset, 6) // meshes_items\r\n  builder.requiredField(offset, 8) // samples\r\n  builder.requiredField(offset, 10) // representations\r\n  builder.requiredField(offset, 12) // materials\r\n  builder.requiredField(offset, 14) // circle_extrusions\r\n  builder.requiredField(offset, 16) // shells\r\n  builder.requiredField(offset, 18) // local_transforms\r\n  builder.requiredField(offset, 20) // global_transforms\r\n  return offset;\r\n}\r\n\r\nstatic createMeshes(builder:flatbuffers.Builder, coordinatesOffset:flatbuffers.Offset, meshesItemsOffset:flatbuffers.Offset, samplesOffset:flatbuffers.Offset, representationsOffset:flatbuffers.Offset, materialsOffset:flatbuffers.Offset, circleExtrusionsOffset:flatbuffers.Offset, shellsOffset:flatbuffers.Offset, localTransformsOffset:flatbuffers.Offset, globalTransformsOffset:flatbuffers.Offset, materialIdsOffset:flatbuffers.Offset, representationIdsOffset:flatbuffers.Offset, sampleIdsOffset:flatbuffers.Offset, localTransformIdsOffset:flatbuffers.Offset, globalTransformIdsOffset:flatbuffers.Offset):flatbuffers.Offset {\r\n  Meshes.startMeshes(builder);\r\n  Meshes.addCoordinates(builder, coordinatesOffset);\r\n  Meshes.addMeshesItems(builder, meshesItemsOffset);\r\n  Meshes.addSamples(builder, samplesOffset);\r\n  Meshes.addRepresentations(builder, representationsOffset);\r\n  Meshes.addMaterials(builder, materialsOffset);\r\n  Meshes.addCircleExtrusions(builder, circleExtrusionsOffset);\r\n  Meshes.addShells(builder, shellsOffset);\r\n  Meshes.addLocalTransforms(builder, localTransformsOffset);\r\n  Meshes.addGlobalTransforms(builder, globalTransformsOffset);\r\n  Meshes.addMaterialIds(builder, materialIdsOffset);\r\n  Meshes.addRepresentationIds(builder, representationIdsOffset);\r\n  Meshes.addSampleIds(builder, sampleIdsOffset);\r\n  Meshes.addLocalTransformIds(builder, localTransformIdsOffset);\r\n  Meshes.addGlobalTransformIds(builder, globalTransformIdsOffset);\r\n  return Meshes.endMeshes(builder);\r\n}\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nexport class Relation {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):Relation {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nstatic getRootAsRelation(bb:flatbuffers.ByteBuffer, obj?:Relation):Relation {\r\n  return (obj || new Relation()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nstatic getSizePrefixedRootAsRelation(bb:flatbuffers.ByteBuffer, obj?:Relation):Relation {\r\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\r\n  return (obj || new Relation()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\ndata(index: number):string\r\ndata(index: number,optionalEncoding:flatbuffers.Encoding):string|Uint8Array\r\ndata(index: number,optionalEncoding?:any):string|Uint8Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\r\n}\r\n\r\ndataLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nstatic startRelation(builder:flatbuffers.Builder) {\r\n  builder.startObject(1);\r\n}\r\n\r\nstatic addData(builder:flatbuffers.Builder, dataOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(0, dataOffset, 0);\r\n}\r\n\r\nstatic createDataVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startDataVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic endRelation(builder:flatbuffers.Builder):flatbuffers.Offset {\r\n  const offset = builder.endObject();\r\n  builder.requiredField(offset, 4) // data\r\n  return offset;\r\n}\r\n\r\nstatic createRelation(builder:flatbuffers.Builder, dataOffset:flatbuffers.Offset):flatbuffers.Offset {\r\n  Relation.startRelation(builder);\r\n  Relation.addData(builder, dataOffset);\r\n  return Relation.endRelation(builder);\r\n}\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\n\r\n\r\nexport class SpatialStructure {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):SpatialStructure {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nstatic getRootAsSpatialStructure(bb:flatbuffers.ByteBuffer, obj?:SpatialStructure):SpatialStructure {\r\n  return (obj || new SpatialStructure()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nstatic getSizePrefixedRootAsSpatialStructure(bb:flatbuffers.ByteBuffer, obj?:SpatialStructure):SpatialStructure {\r\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\r\n  return (obj || new SpatialStructure()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nlocalId():number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.readUint32(this.bb_pos + offset) : null;\r\n}\r\n\r\nmutate_local_id(value:number):boolean {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n\r\n  if (offset === 0) {\r\n    return false;\r\n  }\r\n\r\n  this.bb!.writeUint32(this.bb_pos + offset, value);\r\n  return true;\r\n}\r\n\r\ncategory():string|null\r\ncategory(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\r\ncategory(optionalEncoding?:any):string|Uint8Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n  return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\r\n}\r\n\r\nchildren(index: number, obj?:SpatialStructure):SpatialStructure|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 8);\r\n  return offset ? (obj || new SpatialStructure()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\r\n}\r\n\r\nchildrenLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 8);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nstatic startSpatialStructure(builder:flatbuffers.Builder) {\r\n  builder.startObject(3);\r\n}\r\n\r\nstatic addLocalId(builder:flatbuffers.Builder, localId:number) {\r\n  builder.addFieldInt32(0, localId, null);\r\n}\r\n\r\nstatic addCategory(builder:flatbuffers.Builder, categoryOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(1, categoryOffset, 0);\r\n}\r\n\r\nstatic addChildren(builder:flatbuffers.Builder, childrenOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(2, childrenOffset, 0);\r\n}\r\n\r\nstatic createChildrenVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startChildrenVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic endSpatialStructure(builder:flatbuffers.Builder):flatbuffers.Offset {\r\n  const offset = builder.endObject();\r\n  return offset;\r\n}\r\n\r\nstatic createSpatialStructure(builder:flatbuffers.Builder, localId:number|null, categoryOffset:flatbuffers.Offset, childrenOffset:flatbuffers.Offset):flatbuffers.Offset {\r\n  SpatialStructure.startSpatialStructure(builder);\r\n  if (localId !== null)\r\n    SpatialStructure.addLocalId(builder, localId);\r\n  SpatialStructure.addCategory(builder, categoryOffset);\r\n  SpatialStructure.addChildren(builder, childrenOffset);\r\n  return SpatialStructure.endSpatialStructure(builder);\r\n}\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nimport * as flatbuffers from 'flatbuffers';\r\n\r\nimport { Attribute } from './attribute.js';\r\nimport { Meshes } from './meshes.js';\r\nimport { Relation } from './relation.js';\r\nimport { SpatialStructure } from './spatial-structure.js';\r\n\r\n\r\nexport class Model {\r\n  bb: flatbuffers.ByteBuffer|null = null;\r\n  bb_pos = 0;\r\n  __init(i:number, bb:flatbuffers.ByteBuffer):Model {\r\n  this.bb_pos = i;\r\n  this.bb = bb;\r\n  return this;\r\n}\r\n\r\nstatic getRootAsModel(bb:flatbuffers.ByteBuffer, obj?:Model):Model {\r\n  return (obj || new Model()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nstatic getSizePrefixedRootAsModel(bb:flatbuffers.ByteBuffer, obj?:Model):Model {\r\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\r\n  return (obj || new Model()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\r\n}\r\n\r\nstatic bufferHasIdentifier(bb:flatbuffers.ByteBuffer):boolean {\r\n  return bb.__has_identifier('0001');\r\n}\r\n\r\nmetadata():string|null\r\nmetadata(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\r\nmetadata(optionalEncoding?:any):string|Uint8Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 4);\r\n  return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\r\n}\r\n\r\nguids(index: number):string\r\nguids(index: number,optionalEncoding:flatbuffers.Encoding):string|Uint8Array\r\nguids(index: number,optionalEncoding?:any):string|Uint8Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n  return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\r\n}\r\n\r\nguidsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 6);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nguidsItems(index: number):number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 8);\r\n  return offset ? this.bb!.readUint32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\r\n}\r\n\r\nguidsItemsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 8);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nguidsItemsArray():Uint32Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 8);\r\n  return offset ? new Uint32Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\nmaxLocalId():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 10);\r\n  return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\r\n}\r\n\r\nmutate_max_local_id(value:number):boolean {\r\n  const offset = this.bb!.__offset(this.bb_pos, 10);\r\n\r\n  if (offset === 0) {\r\n    return false;\r\n  }\r\n\r\n  this.bb!.writeUint32(this.bb_pos + offset, value);\r\n  return true;\r\n}\r\n\r\nlocalIds(index: number):number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 12);\r\n  return offset ? this.bb!.readUint32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\r\n}\r\n\r\nlocalIdsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 12);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nlocalIdsArray():Uint32Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 12);\r\n  return offset ? new Uint32Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\ncategories(index: number):string\r\ncategories(index: number,optionalEncoding:flatbuffers.Encoding):string|Uint8Array\r\ncategories(index: number,optionalEncoding?:any):string|Uint8Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 14);\r\n  return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\r\n}\r\n\r\ncategoriesLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 14);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nmeshes(obj?:Meshes):Meshes|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 16);\r\n  return offset ? (obj || new Meshes()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;\r\n}\r\n\r\nattributes(index: number, obj?:Attribute):Attribute|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 18);\r\n  return offset ? (obj || new Attribute()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\r\n}\r\n\r\nattributesLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 18);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nrelations(index: number, obj?:Relation):Relation|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 20);\r\n  return offset ? (obj || new Relation()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\r\n}\r\n\r\nrelationsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 20);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nrelationsItems(index: number):number|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 22);\r\n  return offset ? this.bb!.readInt32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\r\n}\r\n\r\nrelationsItemsLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 22);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nrelationsItemsArray():Int32Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 22);\r\n  return offset ? new Int32Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\r\n}\r\n\r\nguid():string|null\r\nguid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\r\nguid(optionalEncoding?:any):string|Uint8Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 24);\r\n  return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\r\n}\r\n\r\nspatialStructure(obj?:SpatialStructure):SpatialStructure|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 26);\r\n  return offset ? (obj || new SpatialStructure()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;\r\n}\r\n\r\nuniqueAttributes(index: number):string\r\nuniqueAttributes(index: number,optionalEncoding:flatbuffers.Encoding):string|Uint8Array\r\nuniqueAttributes(index: number,optionalEncoding?:any):string|Uint8Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 28);\r\n  return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\r\n}\r\n\r\nuniqueAttributesLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 28);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nrelationNames(index: number):string\r\nrelationNames(index: number,optionalEncoding:flatbuffers.Encoding):string|Uint8Array\r\nrelationNames(index: number,optionalEncoding?:any):string|Uint8Array|null {\r\n  const offset = this.bb!.__offset(this.bb_pos, 30);\r\n  return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\r\n}\r\n\r\nrelationNamesLength():number {\r\n  const offset = this.bb!.__offset(this.bb_pos, 30);\r\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\r\n}\r\n\r\nstatic startModel(builder:flatbuffers.Builder) {\r\n  builder.startObject(14);\r\n}\r\n\r\nstatic addMetadata(builder:flatbuffers.Builder, metadataOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(0, metadataOffset, 0);\r\n}\r\n\r\nstatic addGuids(builder:flatbuffers.Builder, guidsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(1, guidsOffset, 0);\r\n}\r\n\r\nstatic createGuidsVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startGuidsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addGuidsItems(builder:flatbuffers.Builder, guidsItemsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(2, guidsItemsOffset, 0);\r\n}\r\n\r\nstatic createGuidsItemsVector(builder:flatbuffers.Builder, data:number[]|Uint32Array):flatbuffers.Offset;\r\n/**\r\n * @deprecated This Uint8Array overload will be removed in the future.\r\n */\r\nstatic createGuidsItemsVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\r\nstatic createGuidsItemsVector(builder:flatbuffers.Builder, data:number[]|Uint32Array|Uint8Array):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addInt32(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startGuidsItemsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addMaxLocalId(builder:flatbuffers.Builder, maxLocalId:number) {\r\n  builder.addFieldInt32(3, maxLocalId, 0);\r\n}\r\n\r\nstatic addLocalIds(builder:flatbuffers.Builder, localIdsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(4, localIdsOffset, 0);\r\n}\r\n\r\nstatic createLocalIdsVector(builder:flatbuffers.Builder, data:number[]|Uint32Array):flatbuffers.Offset;\r\n/**\r\n * @deprecated This Uint8Array overload will be removed in the future.\r\n */\r\nstatic createLocalIdsVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\r\nstatic createLocalIdsVector(builder:flatbuffers.Builder, data:number[]|Uint32Array|Uint8Array):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addInt32(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startLocalIdsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addCategories(builder:flatbuffers.Builder, categoriesOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(5, categoriesOffset, 0);\r\n}\r\n\r\nstatic createCategoriesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startCategoriesVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addMeshes(builder:flatbuffers.Builder, meshesOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(6, meshesOffset, 0);\r\n}\r\n\r\nstatic addAttributes(builder:flatbuffers.Builder, attributesOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(7, attributesOffset, 0);\r\n}\r\n\r\nstatic createAttributesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startAttributesVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addRelations(builder:flatbuffers.Builder, relationsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(8, relationsOffset, 0);\r\n}\r\n\r\nstatic createRelationsVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startRelationsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addRelationsItems(builder:flatbuffers.Builder, relationsItemsOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(9, relationsItemsOffset, 0);\r\n}\r\n\r\nstatic createRelationsItemsVector(builder:flatbuffers.Builder, data:number[]|Int32Array):flatbuffers.Offset;\r\n/**\r\n * @deprecated This Uint8Array overload will be removed in the future.\r\n */\r\nstatic createRelationsItemsVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\r\nstatic createRelationsItemsVector(builder:flatbuffers.Builder, data:number[]|Int32Array|Uint8Array):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addInt32(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startRelationsItemsVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addGuid(builder:flatbuffers.Builder, guidOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(10, guidOffset, 0);\r\n}\r\n\r\nstatic addSpatialStructure(builder:flatbuffers.Builder, spatialStructureOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(11, spatialStructureOffset, 0);\r\n}\r\n\r\nstatic addUniqueAttributes(builder:flatbuffers.Builder, uniqueAttributesOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(12, uniqueAttributesOffset, 0);\r\n}\r\n\r\nstatic createUniqueAttributesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startUniqueAttributesVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic addRelationNames(builder:flatbuffers.Builder, relationNamesOffset:flatbuffers.Offset) {\r\n  builder.addFieldOffset(13, relationNamesOffset, 0);\r\n}\r\n\r\nstatic createRelationNamesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\r\n  builder.startVector(4, data.length, 4);\r\n  for (let i = data.length - 1; i >= 0; i--) {\r\n    builder.addOffset(data[i]!);\r\n  }\r\n  return builder.endVector();\r\n}\r\n\r\nstatic startRelationNamesVector(builder:flatbuffers.Builder, numElems:number) {\r\n  builder.startVector(4, numElems, 4);\r\n}\r\n\r\nstatic endModel(builder:flatbuffers.Builder):flatbuffers.Offset {\r\n  const offset = builder.endObject();\r\n  builder.requiredField(offset, 6) // guids\r\n  builder.requiredField(offset, 8) // guids_items\r\n  builder.requiredField(offset, 12) // local_ids\r\n  builder.requiredField(offset, 14) // categories\r\n  builder.requiredField(offset, 16) // meshes\r\n  builder.requiredField(offset, 24) // guid\r\n  return offset;\r\n}\r\n\r\nstatic finishModelBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\r\n  builder.finish(offset, '0001');\r\n}\r\n\r\nstatic finishSizePrefixedModelBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\r\n  builder.finish(offset, '0001', true);\r\n}\r\n\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nexport enum RenderedFaces {\r\n  ONE = 0,\r\n  TWO = 1\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nexport enum RepresentationClass {\r\n  NONE = 0,\r\n  SHELL = 1,\r\n  CIRCLE_EXTRUSION = 2\r\n}\r\n","// automatically generated by the FlatBuffers compiler, do not modify\r\n\r\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\r\n\r\nexport enum Stroke {\r\n  DEFAULT = 0\r\n}\r\n","import * as THREE from \"three\";\r\nimport * as TFB from \"../../Schema\";\r\nimport {\r\n  ItemAttribute,\r\n  ItemData,\r\n  SpatialTreeItem,\r\n} from \"../../FragmentsModels\";\r\n\r\n/**\r\n * Data defining a fragments material.\r\n */\r\nexport type RawMaterial = {\r\n  /** The red component of the material. */\r\n  r: number;\r\n  /** The green component of the material. */\r\n  g: number;\r\n  /** The blue component of the material. */\r\n  b: number;\r\n  /** The alpha component of the material. */\r\n  a: number;\r\n  /** The number of rendered faces of the material. */\r\n  renderedFaces: TFB.RenderedFaces;\r\n  /** The stroke type of the material. */\r\n  stroke: TFB.Stroke;\r\n};\r\n\r\n/**\r\n * Data defining a fragments item. It can be anything, from a property to property set or a physical element like a wall or a beam.\r\n */\r\nexport type RawItemData = {\r\n  /** The attributes of the item. */\r\n  data: Record<string, ItemAttribute>;\r\n  /** The category of the item. */\r\n  category: string;\r\n  /** The GUID of the item (optional). */\r\n  guid?: string;\r\n};\r\n\r\n/**\r\n * Data defining a fragments relation.\r\n */\r\nexport type RawRelationData = {\r\n  /** The relations of the item. */\r\n  data: Record<string, number[]>;\r\n};\r\n\r\n/**\r\n * Data defining metadata of the fragments model.\r\n */\r\nexport type RawMetadataData = Record<string, any>;\r\n\r\n/**\r\n * Data defining a transform (local or global) of a mesh.\r\n */\r\nexport type RawTransformData = {\r\n  /** The position of the transform. */\r\n  position: number[];\r\n  /** The x direction of the transform coordinates. */\r\n  xDirection: number[];\r\n  /** The y direction of the transform coordinates. */\r\n  yDirection: number[];\r\n};\r\n\r\n/**\r\n * Data defining a global transform of a mesh.\r\n */\r\nexport type RawGlobalTransformData = RawTransformData & {\r\n  /** The ID of the item the global transform is associated with. */\r\n  itemId: number | string;\r\n};\r\n\r\n/**\r\n * Data defining a sample (instance) of a mesh.\r\n */\r\nexport type RawSample = {\r\n  /** The ID of the global transform the sample is associated with. */\r\n  item: number;\r\n  /** The ID of the material the sample is associated with. */\r\n  material: number;\r\n  /** The ID of the representation the sample is associated with. */\r\n  representation: number;\r\n  /** The ID of the local transform the sample is associated with. */\r\n  localTransform: number;\r\n};\r\n\r\n/**\r\n * Data defining a circle extrusion geometry (e.g. reinforcement bars).\r\n */\r\nexport type RawCircleExtrusion = {\r\n  /** The radius of the circle extrusion. */\r\n  radius: number[];\r\n  /** The axes of the circle extrusion. */\r\n  axes: {\r\n    /** The wires of the axis. */\r\n    wires: number[][];\r\n    /**\r\n     * The order of the axis parts. E.g. order [0, 0, 1, 1] and parts\r\n     * [WIRE, CIRCLE_CURVE, WIRE, CIRCLE_CURVE] means that the axis has\r\n     * the first wire, the first circle curve, the second wire and the\r\n     * second circle curve.\r\n     * */\r\n    order: number[];\r\n    /**\r\n     * The parts of the axis parts. E.g. order [0, 0, 1, 1] and parts\r\n     * [WIRE, CIRCLE_CURVE, WIRE, CIRCLE_CURVE] means that the axis has\r\n     * the first wire, the first circle curve, the second wire and the\r\n     * second circle curve.\r\n     * */\r\n    parts: TFB.AxisPartClass[];\r\n    /** The wire sets of the axis. */\r\n    wireSets: number[][];\r\n    /** The circle curves of the axis. */\r\n    circleCurves: {\r\n      /** The aperture of the circle curve. */\r\n      aperture: number;\r\n      /** The position of the circle curve. */\r\n      position: number[];\r\n      /** The radius of the circle curve. */\r\n      radius: number;\r\n      /** The x direction of the circle curve. */\r\n      xDirection: number[];\r\n      /** The y direction of the circle curve. */\r\n      yDirection: number[];\r\n    }[];\r\n  }[];\r\n};\r\n\r\n/**\r\n * Data defining a shell geometry (e.g. a brep).\r\n */\r\nexport type RawShell = {\r\n  /** The points of the shell. */\r\n  points: number[][];\r\n  /** The profiles of the shell. */\r\n  profiles: Map<number, number[]>;\r\n  /** The holes of the shell. */\r\n  holes: Map<number, number[][]>;\r\n  /** The big profiles of the shell. */\r\n  bigProfiles: Map<number, number[]>;\r\n  /** The big holes of the shell. */\r\n  bigHoles: Map<number, number[][]>;\r\n  /** The type of the shell. */\r\n  type: TFB.ShellType;\r\n  /** The profile face IDs of the shell. */\r\n  profilesFaceIds: number[];\r\n};\r\n\r\n/**\r\n * Data defining a representation of a geometry.\r\n */\r\nexport type RawRepresentation = {\r\n  /** The ID of the representation (optional). */\r\n  id?: number;\r\n  /** The bounding box of the representation. */\r\n  bbox: number[];\r\n  /** The class of the representation. */\r\n  representationClass: number;\r\n  /** The definition of the representation's geometry. */\r\n  geometry?: RawShell | RawCircleExtrusion;\r\n};\r\n\r\n/**\r\n * Container of all the data of an element of a fragments model.\r\n */\r\nexport type ElementData = {\r\n  /** The samples of the elements. */\r\n  samples: { [id: number]: RawSample };\r\n  /** The local transforms of the elements. */\r\n  localTransforms: { [id: number]: RawTransformData };\r\n  /** The global transforms of the elements. */\r\n  globalTransforms: { [id: number]: RawGlobalTransformData };\r\n  /** The representations of the elements. */\r\n  representations: { [id: number]: RawRepresentation };\r\n  /** The materials of the elements. */\r\n  materials: { [id: number]: RawMaterial };\r\n};\r\n\r\n/**\r\n * Data defining a new element of a fragments model.\r\n */\r\nexport type NewElementData = {\r\n  /** The attributes of the element. */\r\n  attributes: ItemData;\r\n  /** The global transform of the element. */\r\n  globalTransform: THREE.Matrix4;\r\n  /** The samples of the element. */\r\n  samples: {\r\n    /** The local transform of the sample. */\r\n    localTransform: THREE.Matrix4 | number | string;\r\n    /** The representation of the sample. */\r\n    representation: THREE.BufferGeometry | number | string;\r\n    /** The material of the sample. */\r\n    material: THREE.MeshLambertMaterial | number | string;\r\n  }[];\r\n};\r\n\r\n/**\r\n * Types of edit requests.\r\n */\r\nexport enum EditRequestType {\r\n  CREATE_MATERIAL,\r\n  CREATE_REPRESENTATION,\r\n  CREATE_SAMPLE,\r\n  CREATE_GLOBAL_TRANSFORM,\r\n  CREATE_LOCAL_TRANSFORM,\r\n  CREATE_ITEM,\r\n  CREATE_RELATION,\r\n\r\n  UPDATE_MATERIAL,\r\n  UPDATE_REPRESENTATION,\r\n  UPDATE_SAMPLE,\r\n  UPDATE_GLOBAL_TRANSFORM,\r\n  UPDATE_LOCAL_TRANSFORM,\r\n  UPDATE_ITEM,\r\n  UPDATE_MAX_LOCAL_ID,\r\n  UPDATE_RELATION,\r\n  UPDATE_METADATA,\r\n  UPDATE_SPATIAL_STRUCTURE,\r\n\r\n  DELETE_MATERIAL,\r\n  DELETE_REPRESENTATION,\r\n  DELETE_SAMPLE,\r\n  DELETE_GLOBAL_TRANSFORM,\r\n  DELETE_LOCAL_TRANSFORM,\r\n  DELETE_ITEM,\r\n  DELETE_RELATION,\r\n}\r\n\r\n/**\r\n * Names of the edit request types (e.g. to display in a history UI).\r\n */\r\nexport const EditRequestTypeNames: Record<EditRequestType, string> = {\r\n  [EditRequestType.CREATE_MATERIAL]: \"Create Material\",\r\n  [EditRequestType.CREATE_REPRESENTATION]: \"Create Representation\",\r\n  [EditRequestType.CREATE_SAMPLE]: \"Create Sample\",\r\n  [EditRequestType.CREATE_GLOBAL_TRANSFORM]: \"Create Global Transform\",\r\n  [EditRequestType.CREATE_LOCAL_TRANSFORM]: \"Create Local Transform\",\r\n  [EditRequestType.CREATE_ITEM]: \"Create Item\",\r\n  [EditRequestType.CREATE_RELATION]: \"Create Relation\",\r\n\r\n  [EditRequestType.UPDATE_MATERIAL]: \"Update Material\",\r\n  [EditRequestType.UPDATE_REPRESENTATION]: \"Update Representation\",\r\n  [EditRequestType.UPDATE_SAMPLE]: \"Update Sample\",\r\n  [EditRequestType.UPDATE_GLOBAL_TRANSFORM]: \"Update Global Transform\",\r\n  [EditRequestType.UPDATE_LOCAL_TRANSFORM]: \"Update Local Transform\",\r\n  [EditRequestType.UPDATE_ITEM]: \"Update Item\",\r\n  [EditRequestType.UPDATE_MAX_LOCAL_ID]: \"Update Max Local Id\",\r\n  [EditRequestType.UPDATE_RELATION]: \"Update Relation\",\r\n  [EditRequestType.UPDATE_METADATA]: \"Update Metadata\",\r\n  [EditRequestType.UPDATE_SPATIAL_STRUCTURE]: \"Update Spatial Structure\",\r\n\r\n  [EditRequestType.DELETE_MATERIAL]: \"Delete Material\",\r\n  [EditRequestType.DELETE_REPRESENTATION]: \"Delete Representation\",\r\n  [EditRequestType.DELETE_SAMPLE]: \"Delete Sample\",\r\n  [EditRequestType.DELETE_GLOBAL_TRANSFORM]: \"Delete Global Transform\",\r\n  [EditRequestType.DELETE_LOCAL_TRANSFORM]: \"Delete Local Transform\",\r\n  [EditRequestType.DELETE_ITEM]: \"Delete Item\",\r\n  [EditRequestType.DELETE_RELATION]: \"Delete Relation\",\r\n};\r\n\r\nexport type EditKey =\r\n  | \"MATERIAL\"\r\n  | \"GLOBAL_TRANSFORM\"\r\n  | \"LOCAL_TRANSFORM\"\r\n  | \"SAMPLE\"\r\n  | \"ITEM\"\r\n  | \"REPRESENTATION\"\r\n  | \"RELATION\";\r\n\r\n/**\r\n * Base interface for all edit requests.\r\n */\r\nexport interface BaseEditRequest {\r\n  /** The type of the edit request. */\r\n  type: EditRequestType;\r\n  /**\r\n   * The temporary ID of the edit request (optional). This is used to\r\n   * identify the edit request before having a local id (e.g. when\r\n   * chaining requests).\r\n   * */\r\n  tempId?: string;\r\n}\r\n\r\n/**\r\n * Base interface for all update edit requests.\r\n */\r\nexport interface BaseUpdateRequest extends BaseEditRequest {\r\n  /** The local ID of the edit request. */\r\n  localId: number | string;\r\n}\r\n\r\n/**\r\n * Interface for update material edit requests.\r\n */\r\nexport interface UpdateMaterialRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.UPDATE_MATERIAL;\r\n  data: RawMaterial;\r\n}\r\n\r\n/**\r\n * Interface for update representation edit requests.\r\n */\r\nexport interface UpdateRepresentationRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.UPDATE_REPRESENTATION;\r\n  data: RawRepresentation;\r\n}\r\n\r\n// We define this type to allow to use temp ids\r\n// More info in the implementation of the edit logic\r\nexport type SampleRequestData = Omit<\r\n  RawSample,\r\n  \"material\" | \"representation\" | \"localTransform\" | \"item\"\r\n> & {\r\n  item: number | string;\r\n  material: number | string;\r\n  representation: number | string;\r\n  localTransform: number | string;\r\n};\r\n\r\n/**\r\n * Interface for update sample edit requests.\r\n */\r\nexport interface UpdateSampleRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.UPDATE_SAMPLE;\r\n  data: SampleRequestData;\r\n}\r\n\r\n/**\r\n * Interface for update global transform edit requests.\r\n */\r\nexport interface UpdateGlobalTransformRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.UPDATE_GLOBAL_TRANSFORM;\r\n  data: RawGlobalTransformData;\r\n}\r\n\r\n/**\r\n * Interface for update local transform edit requests.\r\n */\r\nexport interface UpdateLocalTransformRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.UPDATE_LOCAL_TRANSFORM;\r\n  data: RawTransformData;\r\n}\r\n\r\n/**\r\n * Interface for update item edit requests.\r\n */\r\nexport interface UpdateItemRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.UPDATE_ITEM;\r\n  data: RawItemData;\r\n}\r\n\r\n/**\r\n * Interface for update max local id edit requests.\r\n */\r\nexport interface UpdateMaxLocalIdRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.UPDATE_MAX_LOCAL_ID;\r\n}\r\n\r\n/**\r\n * Interface for update relation edit requests.\r\n */\r\nexport interface UpdateRelationRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.UPDATE_RELATION;\r\n  data: RawRelationData;\r\n}\r\n\r\n/**\r\n * Interface for update metadata edit requests.\r\n */\r\nexport interface UpdateMetadataRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.UPDATE_METADATA;\r\n  data: RawMetadataData;\r\n}\r\n\r\n/**\r\n * Interface for update spatial structure edit requests.\r\n */\r\nexport interface UpdateSpatialStructureRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.UPDATE_SPATIAL_STRUCTURE;\r\n  data: SpatialTreeItem;\r\n}\r\n\r\n/**\r\n * Base interface for all create edit requests.\r\n */\r\nexport interface BaseCreateRequest extends BaseEditRequest {\r\n  // If given, use this local id. If the local id exists, the object is not created.\r\n  localId?: number | string;\r\n}\r\n\r\n/**\r\n * Interface for create sample edit requests.\r\n */\r\nexport interface CreateSampleRequest extends BaseCreateRequest {\r\n  type: EditRequestType.CREATE_SAMPLE;\r\n  data: SampleRequestData;\r\n}\r\n\r\n/**\r\n * Interface for create material edit requests.\r\n */\r\nexport interface CreateMaterialRequest extends BaseCreateRequest {\r\n  type: EditRequestType.CREATE_MATERIAL;\r\n  data: RawMaterial;\r\n}\r\n\r\n/**\r\n * Interface for create representation edit requests.\r\n */\r\nexport interface CreateRepresentationRequest extends BaseCreateRequest {\r\n  type: EditRequestType.CREATE_REPRESENTATION;\r\n  data: RawRepresentation;\r\n}\r\n\r\n/**\r\n * Interface for create global transform edit requests.\r\n */\r\nexport interface CreateGlobalTransformRequest extends BaseCreateRequest {\r\n  type: EditRequestType.CREATE_GLOBAL_TRANSFORM;\r\n  data: RawGlobalTransformData;\r\n}\r\n\r\n/**\r\n * Interface for create local transform edit requests.\r\n */\r\nexport interface CreateLocalTransformRequest extends BaseCreateRequest {\r\n  type: EditRequestType.CREATE_LOCAL_TRANSFORM;\r\n  data: RawTransformData;\r\n}\r\n\r\n/**\r\n * Interface for create item edit requests.\r\n */\r\nexport interface CreateItemRequest extends BaseCreateRequest {\r\n  type: EditRequestType.CREATE_ITEM;\r\n  data: RawItemData;\r\n}\r\n\r\n/**\r\n * Interface for create relation edit requests.\r\n */\r\nexport interface CreateRelationRequest extends BaseCreateRequest {\r\n  type: EditRequestType.CREATE_RELATION;\r\n  data: RawRelationData;\r\n}\r\n\r\n/**\r\n * Interface for delete material edit requests.\r\n */\r\nexport interface DeleteMaterialRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.DELETE_MATERIAL;\r\n}\r\n\r\n/**\r\n * Interface for delete representation edit requests.\r\n */\r\nexport interface DeleteRepresentationRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.DELETE_REPRESENTATION;\r\n}\r\n\r\n/**\r\n * Interface for delete sample edit requests.\r\n */\r\nexport interface DeleteSampleRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.DELETE_SAMPLE;\r\n}\r\n\r\n/**\r\n * Interface for delete global transform edit requests.\r\n */\r\nexport interface DeleteGlobalTransformRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.DELETE_GLOBAL_TRANSFORM;\r\n}\r\n\r\n/**\r\n * Interface for delete local transform edit requests.\r\n */\r\nexport interface DeleteLocalTransformRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.DELETE_LOCAL_TRANSFORM;\r\n}\r\n\r\n/**\r\n * Interface for delete item edit requests.\r\n */\r\nexport interface DeleteItemRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.DELETE_ITEM;\r\n}\r\n\r\n/**\r\n * Interface for delete relation edit requests.\r\n */\r\nexport interface DeleteRelationRequest extends BaseUpdateRequest {\r\n  type: EditRequestType.DELETE_RELATION;\r\n}\r\n\r\n/**\r\n * Type for update edit requests.\r\n */\r\nexport type UpdateRequest =\r\n  | UpdateMaterialRequest\r\n  | UpdateRepresentationRequest\r\n  | UpdateSampleRequest\r\n  | UpdateGlobalTransformRequest\r\n  | UpdateLocalTransformRequest\r\n  | UpdateItemRequest\r\n  | UpdateMaxLocalIdRequest\r\n  | UpdateRelationRequest\r\n  | UpdateMetadataRequest\r\n  | UpdateSpatialStructureRequest;\r\n\r\n/**\r\n * Type for create edit requests.\r\n */\r\nexport type CreateRequest =\r\n  | CreateMaterialRequest\r\n  | CreateRepresentationRequest\r\n  | CreateSampleRequest\r\n  | CreateGlobalTransformRequest\r\n  | CreateLocalTransformRequest\r\n  | CreateItemRequest\r\n  | CreateRelationRequest;\r\n\r\n/**\r\n * Type for delete edit requests.\r\n */\r\nexport type DeleteRequest =\r\n  | DeleteMaterialRequest\r\n  | DeleteRepresentationRequest\r\n  | DeleteSampleRequest\r\n  | DeleteGlobalTransformRequest\r\n  | DeleteLocalTransformRequest\r\n  | DeleteItemRequest\r\n  | DeleteRelationRequest;\r\n\r\n/**\r\n * Type for all edit requests.\r\n */\r\nexport type EditRequest = UpdateRequest | CreateRequest | DeleteRequest;\r\n","import * as FB from \"flatbuffers\";\r\nimport * as TFB from \"../../Schema\";\r\nimport * as ET from \"./edit-types\";\r\n\r\nexport function createTransform(\r\n  transform: ET.RawTransformData,\r\n  builder: FB.Builder,\r\n) {\r\n  const meshesPos = transform.position;\r\n  const meshesDx = transform.xDirection;\r\n  const meshesDy = transform.yDirection;\r\n\r\n  // prettier-ignore\r\n  const coordinatesOffset = TFB.Transform.createTransform(builder,\r\n            meshesPos[0], meshesPos[1], meshesPos[2],\r\n            meshesDx[0], meshesDx[1], meshesDx[2],\r\n            meshesDy[0], meshesDy[1], meshesDy[2]);\r\n\r\n  return coordinatesOffset;\r\n}\r\n\r\nexport function copyTransform(builder: FB.Builder, transform: TFB.Transform) {\r\n  const meshesPos = transform.position() as TFB.DoubleVector;\r\n  const meshesDx = transform.xDirection() as TFB.FloatVector;\r\n  const meshesDy = transform.yDirection() as TFB.FloatVector;\r\n\r\n  // prettier-ignore\r\n  const coordinatesOffset = TFB.Transform.createTransform(builder,\r\n            meshesPos.x(), meshesPos.y(), meshesPos.z(),\r\n            meshesDx.x(), meshesDx.y(), meshesDx.z(),\r\n            meshesDy.x(), meshesDy.y(), meshesDy.z());\r\n\r\n  return coordinatesOffset;\r\n}\r\n","import * as FB from \"flatbuffers\";\r\nimport * as TFB from \"../../Schema\";\r\n\r\nexport function copyFloatVector(builder: FB.Builder, vector: TFB.FloatVector) {\r\n  return TFB.FloatVector.createFloatVector(\r\n    builder,\r\n    vector.x(),\r\n    vector.y(),\r\n    vector.z(),\r\n  );\r\n}\r\n","import * as FB from \"flatbuffers\";\r\nimport * as TFB from \"../../Schema\";\r\nimport * as ET from \"./edit-types\";\r\nimport { copyFloatVector } from \"./misc-functions\";\r\n\r\nexport function createShell(builder: FB.Builder, shell: ET.RawShell) {\r\n  const shellType = shell.type;\r\n\r\n  const profiles: number[] = [];\r\n  const holes: number[] = [];\r\n  const bigProfiles: number[] = [];\r\n  const bigHoles: number[] = [];\r\n\r\n  // Meshes.shells.points\r\n  const pointsLength = shell.points.length;\r\n  TFB.Shell.startPointsVector(builder, pointsLength);\r\n  for (let i = 0; i < pointsLength; i++) {\r\n    const j = pointsLength - 1 - i;\r\n    const currentPoint = shell.points[j];\r\n    TFB.FloatVector.createFloatVector(\r\n      builder,\r\n      currentPoint[0],\r\n      currentPoint[1],\r\n      currentPoint[2],\r\n    );\r\n  }\r\n  const pointsOffset = builder.endVector();\r\n\r\n  // Meshes.shells.profiles\r\n  for (const [, current] of shell.profiles) {\r\n    const indicesOffset = TFB.ShellProfile.createIndicesVector(\r\n      builder,\r\n      current,\r\n    );\r\n    const profileOffset = TFB.ShellProfile.createShellProfile(\r\n      builder,\r\n      indicesOffset,\r\n    );\r\n    profiles.push(profileOffset);\r\n  }\r\n\r\n  const shellProfilesOffset = TFB.Shell.createProfilesVector(builder, profiles);\r\n\r\n  // Meshes.shells.holes\r\n  for (const [profileId, currents] of shell.holes) {\r\n    for (const current of currents) {\r\n      const indicesOffset = TFB.ShellHole.createIndicesVector(builder, current);\r\n      const holeOffset = TFB.ShellHole.createShellHole(\r\n        builder,\r\n        indicesOffset,\r\n        profileId,\r\n      );\r\n      holes.push(holeOffset);\r\n    }\r\n  }\r\n\r\n  const shellHolesOffset = TFB.Shell.createHolesVector(builder, holes);\r\n\r\n  // Meshes.shells.bigProfiles\r\n  for (const [, current] of shell.bigProfiles) {\r\n    const bigIndicesOffset = TFB.BigShellProfile.createIndicesVector(\r\n      builder,\r\n      current,\r\n    );\r\n    const bigProfileOffset = TFB.BigShellProfile.createBigShellProfile(\r\n      builder,\r\n      bigIndicesOffset,\r\n    );\r\n    bigProfiles.push(bigProfileOffset);\r\n  }\r\n\r\n  const bigShellProfilesOffset = TFB.Shell.createBigProfilesVector(\r\n    builder,\r\n    bigProfiles,\r\n  );\r\n\r\n  // Meshes.shells.bigHoles\r\n  for (const [profileId, currents] of shell.bigHoles) {\r\n    for (const current of currents) {\r\n      const bigIndicesOffset = TFB.BigShellHole.createIndicesVector(\r\n        builder,\r\n        current,\r\n      );\r\n      const bigHoleOffset = TFB.BigShellHole.createBigShellHole(\r\n        builder,\r\n        bigIndicesOffset,\r\n        profileId,\r\n      );\r\n      bigHoles.push(bigHoleOffset);\r\n    }\r\n  }\r\n\r\n  const bigShellHolesOffset = TFB.Shell.createBigHolesVector(builder, bigHoles);\r\n\r\n  const shellFaceIdsOffset = TFB.Shell.createProfilesFaceIdsVector(\r\n    builder,\r\n    shell.profilesFaceIds,\r\n  );\r\n\r\n  const shellOffset = TFB.Shell.createShell(\r\n    builder,\r\n    shellProfilesOffset,\r\n    shellHolesOffset,\r\n    pointsOffset,\r\n    bigShellProfilesOffset,\r\n    bigShellHolesOffset,\r\n    shellType,\r\n    shellFaceIdsOffset,\r\n  );\r\n  return shellOffset;\r\n}\r\n\r\nexport function copyShell(builder: FB.Builder, shell: TFB.Shell) {\r\n  const shellType = shell.type();\r\n\r\n  const profiles: number[] = [];\r\n  const holes: number[] = [];\r\n  const bigProfiles: number[] = [];\r\n  const bigHoles: number[] = [];\r\n\r\n  // Meshes.shells.points\r\n  const pointsLength = shell.pointsLength();\r\n  TFB.Shell.startPointsVector(builder, pointsLength);\r\n  for (let i = 0; i < pointsLength; i++) {\r\n    const j = pointsLength - 1 - i;\r\n    const currentPoint = shell.points(j) as TFB.FloatVector;\r\n    copyFloatVector(builder, currentPoint);\r\n  }\r\n  const pointsOffset = builder.endVector();\r\n\r\n  // Meshes.shells.profiles\r\n  const profilesLength = shell.profilesLength();\r\n  for (let i = 0; i < profilesLength; i++) {\r\n    const current = shell.profiles(i) as TFB.ShellProfile;\r\n    const indices = current.indicesArray() as Uint16Array;\r\n    const indicesOffset = TFB.ShellProfile.createIndicesVector(\r\n      builder,\r\n      indices,\r\n    );\r\n    const profileOffset = TFB.ShellProfile.createShellProfile(\r\n      builder,\r\n      indicesOffset,\r\n    );\r\n    profiles.push(profileOffset);\r\n  }\r\n\r\n  const shellProfilesOffset = TFB.Shell.createProfilesVector(builder, profiles);\r\n\r\n  // Meshes.shells.holes\r\n  const holesLength = shell.holesLength();\r\n  for (let i = 0; i < holesLength; i++) {\r\n    const current = shell.holes(i) as TFB.ShellHole;\r\n    const indices = current.indicesArray() as Uint16Array;\r\n    const profileId = current.profileId();\r\n    const indicesOffset = TFB.ShellHole.createIndicesVector(builder, indices);\r\n    const holeOffset = TFB.ShellHole.createShellHole(\r\n      builder,\r\n      indicesOffset,\r\n      profileId,\r\n    );\r\n    holes.push(holeOffset);\r\n  }\r\n\r\n  const shellHolesOffset = TFB.Shell.createHolesVector(builder, holes);\r\n\r\n  // Meshes.shells.bigProfiles\r\n  const bigProfilesLength = shell.bigProfilesLength();\r\n  for (let i = 0; i < bigProfilesLength; i++) {\r\n    const current = shell.bigProfiles(i) as TFB.BigShellProfile;\r\n    const indices = current.indicesArray() as Uint32Array;\r\n    const indicesOffset = TFB.BigShellProfile.createIndicesVector(\r\n      builder,\r\n      indices,\r\n    );\r\n    const bigProfileOffset = TFB.BigShellProfile.createBigShellProfile(\r\n      builder,\r\n      indicesOffset,\r\n    );\r\n    bigProfiles.push(bigProfileOffset);\r\n  }\r\n\r\n  const bigShellProfilesOffset = TFB.Shell.createBigProfilesVector(\r\n    builder,\r\n    bigProfiles,\r\n  );\r\n\r\n  // Meshes.shells.bigHoles\r\n  const bigHolesLength = shell.bigHolesLength();\r\n  for (let i = 0; i < bigHolesLength; i++) {\r\n    const current = shell.bigHoles(i) as TFB.BigShellHole;\r\n    const indices = current.indicesArray() as Uint32Array;\r\n    const profileId = current.profileId();\r\n    const indicesOffset = TFB.BigShellHole.createIndicesVector(\r\n      builder,\r\n      indices,\r\n    );\r\n    const bigHoleOffset = TFB.BigShellHole.createBigShellHole(\r\n      builder,\r\n      indicesOffset,\r\n      profileId,\r\n    );\r\n    bigHoles.push(bigHoleOffset);\r\n  }\r\n\r\n  const bigShellHolesOffset = TFB.Shell.createBigHolesVector(builder, bigHoles);\r\n\r\n  const shellFaceIdsOffset = TFB.Shell.createProfilesFaceIdsVector(\r\n    builder,\r\n    shell.profilesFaceIdsArray() || [],\r\n  );\r\n\r\n  const shellOffset = TFB.Shell.createShell(\r\n    builder,\r\n    shellProfilesOffset,\r\n    shellHolesOffset,\r\n    pointsOffset,\r\n    bigShellProfilesOffset,\r\n    bigShellHolesOffset,\r\n    shellType,\r\n    shellFaceIdsOffset,\r\n  );\r\n  return shellOffset;\r\n}\r\n","import * as FB from \"flatbuffers\";\r\nimport * as TFB from \"../../Schema\";\r\nimport * as ET from \"./edit-types\";\r\n\r\nexport function copyCircleExtrusion(\r\n  builder: FB.Builder,\r\n  current: TFB.CircleExtrusion,\r\n) {\r\n  const radiuses = current.radiusArray() as Float64Array;\r\n  const radiusRef = TFB.CircleExtrusion.createRadiusVector(builder, radiuses);\r\n\r\n  // Meshes.circleExtrusions.axes\r\n  const axesLength = current.axesLength();\r\n  const axesOffsets: number[] = [];\r\n\r\n  for (let j = 0; j < axesLength; j++) {\r\n    const currentAxis = current.axes(j) as TFB.Axis;\r\n\r\n    // Meshes.circleExtrusions.axes.circleCurves\r\n    const circleCurvesLength = currentAxis.circleCurvesLength();\r\n    TFB.Axis.startCircleCurvesVector(builder, circleCurvesLength);\r\n    for (let k = 0; k < circleCurvesLength; k++) {\r\n      const h = circleCurvesLength - 1 - k;\r\n      const currentCc = currentAxis.circleCurves(h) as TFB.CircleCurve;\r\n\r\n      const position = currentCc.position() as TFB.DoubleVector;\r\n      const radius = currentCc.radius();\r\n      const aperture = currentCc.aperture();\r\n      const xDir = currentCc.xDirection() as TFB.FloatVector;\r\n      const yDir = currentCc.yDirection() as TFB.FloatVector;\r\n      const px = position.x();\r\n      const py = position.y();\r\n      const pz = position.z();\r\n      const dxx = xDir.x();\r\n      const dxy = xDir.y();\r\n      const dxz = xDir.z();\r\n      const dyx = yDir.x();\r\n      const dyy = yDir.y();\r\n      const dyz = yDir.z();\r\n\r\n      // prettier-ignore\r\n      TFB.CircleCurve.createCircleCurve(\r\n          builder, aperture, px, py, pz, radius,\r\n          dxx, dxy, dxz, dyx, dyy, dyz\r\n        );\r\n    }\r\n\r\n    const circleCurvesOffset = builder.endVector();\r\n\r\n    // Meshes.circleExtrusions.axes.wires\r\n    const wiresLength = currentAxis.wiresLength();\r\n    TFB.Axis.startWiresVector(builder, wiresLength);\r\n    for (let k = 0; k < wiresLength; k++) {\r\n      const h = wiresLength - 1 - k;\r\n      const currentWire = currentAxis.wires(h) as TFB.Wire;\r\n      const p1 = currentWire.p1() as TFB.FloatVector;\r\n      const p2 = currentWire.p2() as TFB.FloatVector;\r\n      // prettier-ignore\r\n      TFB.Wire.createWire(builder,\r\n          p1.x(), p1.y(), p1.z(),\r\n          p2.x(), p2.y(), p2.z()\r\n        );\r\n    }\r\n\r\n    const wiresOffset = builder.endVector();\r\n\r\n    // Meshes.circleExtrusions.axes.wireSets\r\n    // TODO: Implement wire sets\r\n    TFB.Axis.startWireSetsVector(builder, 0);\r\n    const wireSetOffset = builder.endVector();\r\n\r\n    // Meshes.circleExtrusions.axes.order\r\n    const ordersArray = currentAxis.orderArray() as Uint32Array;\r\n    const ordersOffset = TFB.Axis.createOrderVector(builder, ordersArray);\r\n\r\n    // Meshes.circleExtrusions.axes.parts\r\n    const partsArray = Array.from(currentAxis.partsArray() as Int8Array);\r\n    const axisPartsOffset = TFB.Axis.createPartsVector(builder, partsArray);\r\n\r\n    TFB.Axis.startAxis(builder);\r\n    TFB.Axis.addCircleCurves(builder, circleCurvesOffset);\r\n    TFB.Axis.addOrder(builder, ordersOffset);\r\n    TFB.Axis.addWires(builder, wiresOffset);\r\n    TFB.Axis.addWireSets(builder, wireSetOffset);\r\n    TFB.Axis.addParts(builder, axisPartsOffset);\r\n    const axisOffset = TFB.Axis.endAxis(builder);\r\n    axesOffsets.push(axisOffset);\r\n  }\r\n\r\n  const axesRef = TFB.CircleExtrusion.createAxesVector(builder, axesOffsets);\r\n\r\n  TFB.CircleExtrusion.startCircleExtrusion(builder);\r\n  TFB.CircleExtrusion.addAxes(builder, axesRef);\r\n  TFB.CircleExtrusion.addRadius(builder, radiusRef);\r\n  const ceOffset = TFB.CircleExtrusion.endCircleExtrusion(builder);\r\n  return ceOffset;\r\n}\r\n\r\nexport function createCircleExtrusion(\r\n  builder: FB.Builder,\r\n  circleExtrusion: ET.RawCircleExtrusion,\r\n) {\r\n  const radiuses = circleExtrusion.radius;\r\n  const radiusRef = TFB.CircleExtrusion.createRadiusVector(builder, radiuses);\r\n\r\n  const axesOffsets: number[] = [];\r\n  for (const axis of circleExtrusion.axes) {\r\n    const circleCurvesLength = axis.circleCurves.length;\r\n    TFB.Axis.startCircleCurvesVector(builder, circleCurvesLength);\r\n    for (const circleCurve of axis.circleCurves) {\r\n      TFB.CircleCurve.createCircleCurve(\r\n        builder,\r\n        circleCurve.aperture,\r\n        circleCurve.position[0],\r\n        circleCurve.position[1],\r\n        circleCurve.position[2],\r\n        circleCurve.radius,\r\n        circleCurve.xDirection[0],\r\n        circleCurve.xDirection[1],\r\n        circleCurve.xDirection[2],\r\n        circleCurve.yDirection[0],\r\n        circleCurve.yDirection[1],\r\n        circleCurve.yDirection[2],\r\n      );\r\n    }\r\n\r\n    const circleCurvesOffset = builder.endVector();\r\n\r\n    const wiresLength = axis.wires.length;\r\n    TFB.Axis.startWiresVector(builder, wiresLength);\r\n    for (const wire of axis.wires) {\r\n      TFB.Wire.createWire(\r\n        builder,\r\n        wire[0],\r\n        wire[1],\r\n        wire[2],\r\n        wire[3],\r\n        wire[4],\r\n        wire[5],\r\n      );\r\n    }\r\n    const wiresOffset = builder.endVector();\r\n\r\n    const allWireSetsOffsets: number[] = [];\r\n    for (const wireSet of axis.wireSets) {\r\n      TFB.WireSet.startPsVector(builder, wireSet.length / 3);\r\n      for (let i = 0; i < wireSet.length - 2; i += 3) {\r\n        TFB.FloatVector.createFloatVector(\r\n          builder,\r\n          wireSet[i],\r\n          wireSet[i + 1],\r\n          wireSet[i + 2],\r\n        );\r\n      }\r\n      const psOffset = builder.endVector();\r\n\r\n      TFB.WireSet.startWireSet(builder);\r\n      TFB.WireSet.addPs(builder, psOffset);\r\n      const wireSetOffset = TFB.WireSet.endWireSet(builder);\r\n      allWireSetsOffsets.push(wireSetOffset);\r\n    }\r\n\r\n    const wireSetOffset = TFB.Axis.createWireSetsVector(\r\n      builder,\r\n      allWireSetsOffsets,\r\n    );\r\n\r\n    const ordersOffset = TFB.Axis.createOrderVector(builder, axis.order);\r\n    const axisPartsOffset = TFB.Axis.createPartsVector(builder, axis.parts);\r\n\r\n    TFB.Axis.startAxis(builder);\r\n    TFB.Axis.addCircleCurves(builder, circleCurvesOffset);\r\n    TFB.Axis.addOrder(builder, ordersOffset);\r\n    TFB.Axis.addWires(builder, wiresOffset);\r\n    TFB.Axis.addWireSets(builder, wireSetOffset);\r\n    TFB.Axis.addParts(builder, axisPartsOffset);\r\n    const axisOffset = TFB.Axis.endAxis(builder);\r\n    axesOffsets.push(axisOffset);\r\n  }\r\n\r\n  const axesRef = TFB.CircleExtrusion.createAxesVector(builder, axesOffsets);\r\n\r\n  TFB.CircleExtrusion.startCircleExtrusion(builder);\r\n  TFB.CircleExtrusion.addAxes(builder, axesRef);\r\n  TFB.CircleExtrusion.addRadius(builder, radiusRef);\r\n  const ceOffset = TFB.CircleExtrusion.endCircleExtrusion(builder);\r\n  return ceOffset;\r\n}\r\n","import * as FB from \"flatbuffers\";\r\nimport * as TFB from \"../../Schema\";\r\nimport { SpatialTreeItem } from \"../../FragmentsModels\";\r\n\r\nexport function copySpatialStructure(\r\n  builder: FB.Builder,\r\n  spatialStructure: TFB.SpatialStructure | null,\r\n) {\r\n  if (!spatialStructure) return null;\r\n  const childrenLength = spatialStructure.childrenLength();\r\n  const childrenOffsets: number[] = [];\r\n  for (let i = 0; i < childrenLength; i++) {\r\n    const current = spatialStructure.children(i) as TFB.SpatialStructure;\r\n    const childOffset = copySpatialStructure(builder, current);\r\n    if (childOffset === null) continue;\r\n    childrenOffsets.push(childOffset);\r\n  }\r\n  const childrenOffset = TFB.SpatialStructure.createChildrenVector(\r\n    builder,\r\n    childrenOffsets,\r\n  );\r\n\r\n  const localId = spatialStructure.localId();\r\n  const category = spatialStructure.category();\r\n\r\n  if (localId !== null) {\r\n    TFB.SpatialStructure.startSpatialStructure(builder);\r\n    TFB.SpatialStructure.addLocalId(builder, localId);\r\n    TFB.SpatialStructure.addChildren(builder, childrenOffset);\r\n    return TFB.SpatialStructure.endSpatialStructure(builder);\r\n  }\r\n\r\n  if (category !== null) {\r\n    const categoryOffset = builder.createSharedString(category);\r\n    TFB.SpatialStructure.startSpatialStructure(builder);\r\n    TFB.SpatialStructure.addCategory(builder, categoryOffset);\r\n    TFB.SpatialStructure.addChildren(builder, childrenOffset);\r\n    return TFB.SpatialStructure.endSpatialStructure(builder);\r\n  }\r\n\r\n  throw new Error(\"Spatial structure must have a local id or a category\");\r\n}\r\n\r\nexport function createSpatialStructure(\r\n  builder: FB.Builder,\r\n  spatialStructure: SpatialTreeItem,\r\n) {\r\n  const children = spatialStructure.children ?? [];\r\n  const childrenLength = children ? children.length : 0;\r\n\r\n  const childrenOffsets: number[] = [];\r\n\r\n  for (let i = 0; i < childrenLength; i++) {\r\n    const current = children[i] as SpatialTreeItem;\r\n    const childOffset = createSpatialStructure(builder, current);\r\n    if (childOffset === null) continue;\r\n    childrenOffsets.push(childOffset);\r\n  }\r\n\r\n  const childrenOffset = TFB.SpatialStructure.createChildrenVector(\r\n    builder,\r\n    childrenOffsets,\r\n  );\r\n\r\n  const localId = spatialStructure.localId;\r\n  const category = spatialStructure.category;\r\n\r\n  if (localId !== null) {\r\n    TFB.SpatialStructure.startSpatialStructure(builder);\r\n    TFB.SpatialStructure.addLocalId(builder, localId);\r\n    TFB.SpatialStructure.addChildren(builder, childrenOffset);\r\n    return TFB.SpatialStructure.endSpatialStructure(builder);\r\n  }\r\n\r\n  if (category !== null) {\r\n    const categoryOffset = builder.createSharedString(category);\r\n    TFB.SpatialStructure.startSpatialStructure(builder);\r\n    TFB.SpatialStructure.addCategory(builder, categoryOffset);\r\n    TFB.SpatialStructure.addChildren(builder, childrenOffset);\r\n    return TFB.SpatialStructure.endSpatialStructure(builder);\r\n  }\r\n\r\n  throw new Error(\"Spatial structure must have a local id or a category\");\r\n}\r\n","import * as FB from \"flatbuffers\";\r\nimport * as TFB from \"../../Schema\";\r\n\r\nexport function buildSample(\r\n  builder: FB.Builder,\r\n  localIdToIndex: Map<number, number>,\r\n  itemId: number,\r\n  matId: number,\r\n  reprId: number,\r\n  ltId: number,\r\n) {\r\n  if (!localIdToIndex.has(itemId)) {\r\n    throw new Error(\"Invalid sample: item id not found\");\r\n  }\r\n  if (!localIdToIndex.has(matId)) {\r\n    throw new Error(\"Invalid sample: mat id not found\");\r\n  }\r\n  if (!localIdToIndex.has(reprId)) {\r\n    throw new Error(\"Invalid sample: repr id not found\");\r\n  }\r\n  if (!localIdToIndex.has(ltId)) {\r\n    throw new Error(\"Invalid sample: lt id not found\");\r\n  }\r\n\r\n  const itemIndex = localIdToIndex.get(itemId) as number;\r\n  const matIndex = localIdToIndex.get(matId) as number;\r\n  const reprIndex = localIdToIndex.get(reprId) as number;\r\n  const ltIndex = localIdToIndex.get(ltId) as number;\r\n\r\n  TFB.Sample.createSample(builder, itemIndex, matIndex, reprIndex, ltIndex);\r\n}\r\n","import * as TFB from \"../../Schema\";\r\nimport * as ET from \"./edit-types\";\r\nimport { EditUtils } from \"./edit-utils\";\r\n\r\nexport function getIdsDelta(model: TFB.Model, requests: ET.EditRequest[]) {\r\n  const itemIds = new Set<number>();\r\n  const globalTranforms = new Set<number>();\r\n  const localTransforms = new Set<number>();\r\n  const samples = new Set<number>();\r\n  const materials = new Set<number>();\r\n  const representations = new Set<number>();\r\n  const shells = new Set<number>(); // Indices\r\n  const circleExtrusions = new Set<number>(); // Indices\r\n\r\n  let createNewSample = false;\r\n\r\n  // Compute new deleted elements to know how many items we will create in flatbuffers\r\n  // Existing elements don't count because they are already excluded in this function\r\n  // We will only account deleted elements that did not exist in the previous model\r\n  let detaDeletedGtsCount = 0;\r\n  let detaDeletedLtsCount = 0;\r\n  let detaDeletedSamplesCount = 0;\r\n  let detaDeletedMaterialsCount = 0;\r\n  let detaDeletedRepresentationsCount = 0;\r\n  let detaDeletedShellsCount = 0;\r\n  let detaDeletedCircleExtrusionsCount = 0;\r\n\r\n  const deletedSamples = new Set<number>();\r\n\r\n  // These ids are used to store ids so that are not taken into account when\r\n  // fetching samples (e.g. when a sample has a material, we don't necessarily\r\n  // want all samples with that material)\r\n  const samplesGtIds = new Set<number>();\r\n  const samplesLtIds = new Set<number>();\r\n  const samplesMaterialIds = new Set<number>();\r\n  const samplesRepIds = new Set<number>();\r\n  const samplesSamplesIds = new Set<number>();\r\n  const samplesItemsIds = new Set<number>();\r\n\r\n  const meshes = model.meshes()!;\r\n\r\n  const prevGts = new Set(meshes.globalTransformIdsArray());\r\n  const prevLts = new Set(meshes.localTransformIdsArray());\r\n  const prevMaterials = new Set(meshes.materialIdsArray());\r\n  const prevRepresentations = new Set(meshes.representationIdsArray());\r\n  const prevItems = new Set(model.localIdsArray());\r\n  const prevSamples = new Set(meshes.sampleIdsArray());\r\n\r\n  const createdSamplesIds = new Set<number>();\r\n\r\n  for (const request of requests) {\r\n    if (request.type === ET.EditRequestType.CREATE_SAMPLE) {\r\n      createNewSample = true;\r\n    }\r\n\r\n    if (request.type === ET.EditRequestType.UPDATE_LOCAL_TRANSFORM) {\r\n      localTransforms.add(request.localId as number);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.UPDATE_MATERIAL) {\r\n      materials.add(request.localId as number);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.UPDATE_REPRESENTATION) {\r\n      representations.add(request.localId as number);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.UPDATE_ITEM) {\r\n      itemIds.add(request.localId as number);\r\n      continue;\r\n    }\r\n\r\n    // When we create a global transform, it can reference an existing item id\r\n    // We want to include it in the delta\r\n    if (request.type === ET.EditRequestType.CREATE_GLOBAL_TRANSFORM) {\r\n      if (prevItems.has(request.data.itemId as number)) {\r\n        itemIds.add(request.data.itemId as number);\r\n      }\r\n      continue;\r\n    }\r\n\r\n    // We also want to include any items referenced by updated global transforms\r\n    if (request.type === ET.EditRequestType.UPDATE_GLOBAL_TRANSFORM) {\r\n      globalTranforms.add(request.localId as number);\r\n      if (prevItems.has(request.data.itemId as number)) {\r\n        itemIds.add(request.data.itemId as number);\r\n      }\r\n      continue;\r\n    }\r\n\r\n    // Samples can reference new elements, and here we only want existing elements\r\n    if (request.type === ET.EditRequestType.UPDATE_SAMPLE) {\r\n      // If the updated sample was created in a previous request, then skip this\r\n      // just like we do in the CREATE_SAMPLE logic\r\n      if (!createdSamplesIds.has(request.localId as number)) {\r\n        samples.add(request.localId as number);\r\n      }\r\n\r\n      // We add the global transform here because when a sample involes an item\r\n      // We also want all the samples of the same item\r\n      if (prevGts.has(request.data.item as number)) {\r\n        globalTranforms.add(request.data.item as number);\r\n      }\r\n\r\n      // For other sample elements, we don't want to include them in the delta\r\n      // e.g. when a sample has a material, we don't want all samples with that material\r\n      if (prevLts.has(request.data.localTransform as number)) {\r\n        samplesLtIds.add(request.data.localTransform as number);\r\n      }\r\n      if (prevMaterials.has(request.data.material as number)) {\r\n        samplesMaterialIds.add(request.data.material as number);\r\n      }\r\n      if (prevRepresentations.has(request.data.representation as number)) {\r\n        samplesRepIds.add(request.data.representation as number);\r\n      }\r\n      continue;\r\n    }\r\n\r\n    // When a new sample reference existing elements, we also want them\r\n    if (request.type === ET.EditRequestType.CREATE_SAMPLE) {\r\n      createdSamplesIds.add(request.localId as number);\r\n\r\n      // We add the global transform here because when a sample involes an item\r\n      // We also want all the samples of the same item\r\n      if (prevGts.has(request.data.item as number)) {\r\n        globalTranforms.add(request.data.item as number);\r\n      }\r\n      // For other sample elements, we don't want to include them in the delta\r\n      // e.g. when a sample has a material, we don't want all samples with that material\r\n      if (prevLts.has(request.data.localTransform as number)) {\r\n        samplesLtIds.add(request.data.localTransform as number);\r\n      }\r\n      if (prevMaterials.has(request.data.material as number)) {\r\n        samplesMaterialIds.add(request.data.material as number);\r\n      }\r\n      if (prevRepresentations.has(request.data.representation as number)) {\r\n        samplesRepIds.add(request.data.representation as number);\r\n      }\r\n      continue;\r\n    }\r\n  }\r\n\r\n  const deletedRepsIds = new Set<number>();\r\n  for (const request of requests) {\r\n    if (request.type === ET.EditRequestType.DELETE_GLOBAL_TRANSFORM) {\r\n      globalTranforms.delete(request.localId as number);\r\n      if (!prevGts.has(request.localId as number)) {\r\n        detaDeletedGtsCount++;\r\n      }\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.DELETE_LOCAL_TRANSFORM) {\r\n      localTransforms.delete(request.localId as number);\r\n      if (!prevLts.has(request.localId as number)) {\r\n        detaDeletedLtsCount++;\r\n      }\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.DELETE_SAMPLE) {\r\n      samples.delete(request.localId as number);\r\n      deletedSamples.add(request.localId as number);\r\n      if (!prevSamples.has(request.localId as number)) {\r\n        detaDeletedSamplesCount++;\r\n      }\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.DELETE_MATERIAL) {\r\n      materials.delete(request.localId as number);\r\n      if (!prevMaterials.has(request.localId as number)) {\r\n        detaDeletedMaterialsCount++;\r\n      }\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.DELETE_REPRESENTATION) {\r\n      representations.delete(request.localId as number);\r\n      deletedRepsIds.add(request.localId as number);\r\n      if (!prevRepresentations.has(request.localId as number)) {\r\n        detaDeletedRepresentationsCount++;\r\n      }\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.DELETE_ITEM) {\r\n      itemIds.delete(request.localId as number);\r\n      continue;\r\n    }\r\n  }\r\n\r\n  // Also count deleted shells and circle extrusions\r\n  // Only count representations that were NOT in the base model (i.e., created\r\n  // in a previous edit request). Base-model representations are not included\r\n  // in the delta, so deleting them must not affect the delta's shell/extrusion count.\r\n\r\n  const deletedReprs = EditUtils.getRepresentations(model, deletedRepsIds);\r\n  for (const [id, repr] of deletedReprs) {\r\n    if (prevRepresentations.has(id)) continue;\r\n    if (repr.representationClass === TFB.RepresentationClass.SHELL) {\r\n      detaDeletedShellsCount++;\r\n    } else if (\r\n      repr.representationClass === TFB.RepresentationClass.CIRCLE_EXTRUSION\r\n    ) {\r\n      detaDeletedCircleExtrusionsCount++;\r\n    } else {\r\n      throw new Error(\"Unsupported representation class\");\r\n    }\r\n  }\r\n\r\n  // This is for representations that were both created and deleted\r\n  for (const request of requests) {\r\n    if (request.type === ET.EditRequestType.CREATE_REPRESENTATION) {\r\n      if (deletedRepsIds.has(request.localId as number)) {\r\n        if (\r\n          request.data.representationClass === TFB.RepresentationClass.SHELL\r\n        ) {\r\n          detaDeletedShellsCount++;\r\n        } else if (\r\n          request.data.representationClass ===\r\n          TFB.RepresentationClass.CIRCLE_EXTRUSION\r\n        ) {\r\n          detaDeletedCircleExtrusionsCount++;\r\n        } else {\r\n          throw new Error(\"Unsupported representation class\");\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  // We also need to include any sample that is referenced by the gathered items\r\n\r\n  // First gather the item ids referenced by samples\r\n\r\n  for (let i = 0; i < meshes.samplesLength(); i++) {\r\n    const sample = meshes.samples(i)!;\r\n    const gtIndex = sample.item()!;\r\n    const ltIndex = sample.localTransform()!;\r\n    const materialIndex = sample.material()!;\r\n    const repIndex = sample.representation()!;\r\n\r\n    const gtId = meshes.globalTransformIds(gtIndex)!;\r\n    const ltId = meshes.localTransformIds(ltIndex)!;\r\n    const materialId = meshes.materialIds(materialIndex)!;\r\n    const repId = meshes.representationIds(repIndex)!;\r\n    const itemIndex = meshes.meshesItems(gtIndex)!;\r\n    const itemId = model.localIds(itemIndex)!;\r\n\r\n    if (\r\n      globalTranforms.has(gtId) ||\r\n      localTransforms.has(ltId) ||\r\n      materials.has(materialId) ||\r\n      representations.has(repId) ||\r\n      itemIds.has(itemId)\r\n    ) {\r\n      if (prevItems.has(itemId)) {\r\n        itemIds.add(itemId);\r\n      }\r\n    }\r\n  }\r\n\r\n  // Now gather the rest of elements\r\n\r\n  for (let i = 0; i < meshes.samplesLength(); i++) {\r\n    // If this sample was deleted, don't include it in the delta\r\n    const sampleId = meshes.sampleIds(i)!;\r\n    if (deletedSamples.has(sampleId)) {\r\n      continue;\r\n    }\r\n\r\n    const sample = meshes.samples(i)!;\r\n    const gtIndex = sample.item()!;\r\n    const ltIndex = sample.localTransform()!;\r\n    const materialIndex = sample.material()!;\r\n    const repIndex = sample.representation()!;\r\n\r\n    const gtId = meshes.globalTransformIds(gtIndex)!;\r\n    const ltId = meshes.localTransformIds(ltIndex)!;\r\n    const materialId = meshes.materialIds(materialIndex)!;\r\n    const repId = meshes.representationIds(repIndex)!;\r\n    const itemIndex = meshes.meshesItems(gtIndex)!;\r\n    const itemId = model.localIds(itemIndex)!;\r\n\r\n    if (\r\n      globalTranforms.has(gtId) ||\r\n      localTransforms.has(ltId) ||\r\n      materials.has(materialId) ||\r\n      representations.has(repId) ||\r\n      itemIds.has(itemId)\r\n    ) {\r\n      if (prevGts.has(gtId)) {\r\n        samplesGtIds.add(gtId);\r\n      }\r\n      if (prevLts.has(ltId)) {\r\n        samplesLtIds.add(ltId);\r\n      }\r\n      if (prevMaterials.has(materialId)) {\r\n        samplesMaterialIds.add(materialId);\r\n      }\r\n      if (prevRepresentations.has(repId)) {\r\n        samplesRepIds.add(repId);\r\n      }\r\n      if (prevItems.has(itemId)) {\r\n        samplesItemsIds.add(itemId);\r\n      }\r\n      samplesSamplesIds.add(sampleId);\r\n    }\r\n  }\r\n\r\n  prevGts.clear();\r\n  prevLts.clear();\r\n  prevMaterials.clear();\r\n  prevRepresentations.clear();\r\n  prevItems.clear();\r\n  prevSamples.clear();\r\n\r\n  for (const id of samplesGtIds) {\r\n    globalTranforms.add(id);\r\n  }\r\n\r\n  for (const id of samplesLtIds) {\r\n    localTransforms.add(id);\r\n  }\r\n\r\n  for (const id of samplesMaterialIds) {\r\n    materials.add(id);\r\n  }\r\n\r\n  for (const id of samplesRepIds) {\r\n    representations.add(id);\r\n  }\r\n\r\n  for (const id of samplesSamplesIds) {\r\n    samples.add(id);\r\n  }\r\n\r\n  for (const id of samplesItemsIds) {\r\n    itemIds.add(id);\r\n  }\r\n\r\n  samplesGtIds.clear();\r\n  samplesLtIds.clear();\r\n  samplesMaterialIds.clear();\r\n  samplesRepIds.clear();\r\n  samplesSamplesIds.clear();\r\n  samplesItemsIds.clear();\r\n\r\n  const indices = EditUtils.getGeometryIndicesFromRepresentations(\r\n    model,\r\n    representations,\r\n  );\r\n\r\n  for (const index of indices.shellsIndices) {\r\n    shells.add(index);\r\n  }\r\n\r\n  for (const index of indices.rebarsIndices) {\r\n    circleExtrusions.add(index);\r\n  }\r\n\r\n  return {\r\n    itemIds,\r\n    globalTranforms,\r\n    localTransforms,\r\n    samples,\r\n    materials,\r\n    representations,\r\n    shells, // Indices\r\n    circleExtrusions, // Indices\r\n    detaDeletedGts: detaDeletedGtsCount,\r\n    detaDeletedLts: detaDeletedLtsCount,\r\n    detaDeletedSamples: detaDeletedSamplesCount,\r\n    detaDeletedMaterials: detaDeletedMaterialsCount,\r\n    detaDeletedRepresentations: detaDeletedRepresentationsCount,\r\n    detaDeletedShells: detaDeletedShellsCount,\r\n    detaDeletedCircleExtrusions: detaDeletedCircleExtrusionsCount,\r\n    createNewSample,\r\n  };\r\n}\r\n","import * as FB from \"flatbuffers\";\r\nimport * as THREE from \"three\";\r\nimport pako from \"pako\";\r\nimport * as TFB from \"../../Schema\";\r\nimport { createTransform } from \"./transfom-functions\";\r\n\r\nexport function newModel(config: { raw: boolean }) {\r\n  const builder = new FB.Builder(1024);\r\n\r\n  // Meshes.globalTransforms\r\n\r\n  TFB.Meshes.startGlobalTransformsVector(builder, 0);\r\n  const globalTransformsRef = builder.endVector();\r\n\r\n  // Meshes.shells\r\n\r\n  const shells = TFB.Meshes.createShellsVector(builder, []);\r\n\r\n  // Meshes.representations\r\n\r\n  TFB.Meshes.startRepresentationsVector(builder, 0);\r\n  const representationsRef = builder.endVector();\r\n\r\n  // Meshes.samples\r\n\r\n  TFB.Meshes.startSamplesVector(builder, 0);\r\n  const samplesOffset = builder.endVector();\r\n\r\n  // Meshes.localTransforms\r\n\r\n  TFB.Meshes.startLocalTransformsVector(builder, 0);\r\n  const localTransformRef = builder.endVector();\r\n\r\n  // Meshes.materials\r\n\r\n  TFB.Meshes.startMaterialsVector(builder, 0);\r\n  const materialsRef = builder.endVector();\r\n\r\n  // Meshes.circleExtrusions\r\n\r\n  const circleExtrusions = TFB.Meshes.createCircleExtrusionsVector(builder, []);\r\n\r\n  // Meshes.meshesItems\r\n\r\n  const meshesItemsOffset = TFB.Meshes.createMeshesItemsVector(builder, []);\r\n\r\n  // Meshes.representationIds\r\n\r\n  const reprLocalIdsOffset = TFB.Meshes.createRepresentationIdsVector(\r\n    builder,\r\n    [],\r\n  );\r\n\r\n  // Meshes.sampleIds\r\n\r\n  const sampleLocalIdsOffset = TFB.Meshes.createSampleIdsVector(builder, []);\r\n\r\n  // Meshes.materialIds\r\n\r\n  const materialLocalIdsOffset = TFB.Meshes.createMaterialIdsVector(\r\n    builder,\r\n    [],\r\n  );\r\n\r\n  // Meshes.localTransformIds\r\n\r\n  const ltLocalIdsOffset = TFB.Meshes.createLocalTransformIdsVector(\r\n    builder,\r\n    [],\r\n  );\r\n\r\n  // Meshes.globalTransformIds\r\n\r\n  const gtLocalIdsOffset = TFB.Meshes.createGlobalTransformIdsVector(\r\n    builder,\r\n    [],\r\n  );\r\n\r\n  // Meshes\r\n\r\n  TFB.Meshes.startMeshes(builder);\r\n\r\n  const coordinatesRef = createTransform(\r\n    {\r\n      position: [0, 0, 0],\r\n      xDirection: [1, 0, 0],\r\n      yDirection: [0, 1, 0],\r\n    },\r\n    builder,\r\n  );\r\n\r\n  TFB.Meshes.addCoordinates(builder, coordinatesRef);\r\n  TFB.Meshes.addGlobalTransforms(builder, globalTransformsRef);\r\n  TFB.Meshes.addShells(builder, shells);\r\n  TFB.Meshes.addRepresentations(builder, representationsRef);\r\n  TFB.Meshes.addSamples(builder, samplesOffset);\r\n  TFB.Meshes.addLocalTransforms(builder, localTransformRef);\r\n  TFB.Meshes.addMaterials(builder, materialsRef);\r\n  TFB.Meshes.addCircleExtrusions(builder, circleExtrusions);\r\n  TFB.Meshes.addMeshesItems(builder, meshesItemsOffset);\r\n  TFB.Meshes.addRepresentationIds(builder, reprLocalIdsOffset);\r\n  TFB.Meshes.addSampleIds(builder, sampleLocalIdsOffset);\r\n  TFB.Meshes.addMaterialIds(builder, materialLocalIdsOffset);\r\n  TFB.Meshes.addLocalTransformIds(builder, ltLocalIdsOffset);\r\n  TFB.Meshes.addGlobalTransformIds(builder, gtLocalIdsOffset);\r\n  const modelMesh = TFB.Meshes.endMeshes(builder);\r\n\r\n  // Metadata\r\n\r\n  const metadataOffset = builder.createString(\"{}\");\r\n\r\n  // Attributes\r\n\r\n  const attributesVector = TFB.Model.createAttributesVector(builder, []);\r\n\r\n  // UniqueAttributes\r\n\r\n  const uniqueAttributesVector = TFB.Model.createUniqueAttributesVector(\r\n    builder,\r\n    [],\r\n  );\r\n\r\n  // RelationNames\r\n\r\n  const relNamesVector = TFB.Model.createRelationNamesVector(builder, []);\r\n\r\n  // LocalIds\r\n\r\n  const localIdsVector = TFB.Model.createLocalIdsVector(builder, []);\r\n\r\n  // Categories\r\n\r\n  const categoriesVector = TFB.Model.createCategoriesVector(builder, []);\r\n\r\n  // RelationsItems\r\n\r\n  const relIndicesVector = TFB.Model.createRelationsItemsVector(builder, []);\r\n\r\n  // Relations\r\n\r\n  const relsVector = TFB.Model.createRelationsVector(builder, []);\r\n\r\n  // GuidsItems\r\n\r\n  const guidsItemsVector = TFB.Model.createGuidsItemsVector(builder, []);\r\n\r\n  // Guids\r\n\r\n  const guidsVector = TFB.Model.createGuidsVector(builder, []);\r\n\r\n  // Guid\r\n\r\n  const guidRef = builder.createString(THREE.MathUtils.generateUUID());\r\n\r\n  // Model\r\n\r\n  TFB.Model.startModel(builder);\r\n  TFB.Model.addMeshes(builder, modelMesh);\r\n  TFB.Model.addMetadata(builder, metadataOffset);\r\n  TFB.Model.addAttributes(builder, attributesVector);\r\n  TFB.Model.addUniqueAttributes(builder, uniqueAttributesVector);\r\n  TFB.Model.addRelationNames(builder, relNamesVector);\r\n  TFB.Model.addLocalIds(builder, localIdsVector);\r\n  TFB.Model.addCategories(builder, categoriesVector);\r\n  TFB.Model.addRelationsItems(builder, relIndicesVector);\r\n  TFB.Model.addRelations(builder, relsVector);\r\n  TFB.Model.addGuidsItems(builder, guidsItemsVector);\r\n  TFB.Model.addGuids(builder, guidsVector);\r\n  TFB.Model.addGuid(builder, guidRef);\r\n  TFB.Model.addMaxLocalId(builder, 1);\r\n  const outData = TFB.Model.endModel(builder);\r\n\r\n  builder.finish(outData);\r\n  const outBytes = builder.asUint8Array();\r\n\r\n  builder.clear();\r\n\r\n  const result = config.raw ? outBytes : pako.deflate(outBytes);\r\n\r\n  return result;\r\n}\r\n","import * as FB from \"flatbuffers\";\r\nimport pako from \"pako\";\r\nimport * as TFB from \"../../Schema\";\r\nimport * as ET from \"./edit-types\";\r\nimport { copyTransform, createTransform } from \"./transfom-functions\";\r\nimport { copyShell, createShell } from \"./shell-functions\";\r\nimport {\r\n  copyCircleExtrusion,\r\n  createCircleExtrusion,\r\n} from \"./circle-extrusion-functions\";\r\nimport {\r\n  copySpatialStructure,\r\n  createSpatialStructure,\r\n} from \"./spatial-structure-functions\";\r\nimport { buildSample } from \"./sample-functions\";\r\nimport { getIdsDelta } from \"./id-delta-getter\";\r\nimport { newModel } from \"./new-model-function\";\r\nimport { EditUtils } from \"./edit-utils\";\r\nimport { SpatialTreeItem } from \"../../FragmentsModels\";\r\n// import { getObject } from \"../flatbuffers-json-converter\";\r\n\r\nfunction getAffectedItems(\r\n  requests: ET.EditRequest[],\r\n  editedSamples: Set<number>,\r\n  meshes: TFB.Meshes,\r\n  model: TFB.Model,\r\n  affectedItems: Set<number>,\r\n) {\r\n  for (const request of requests) {\r\n    if (\r\n      request.type === ET.EditRequestType.UPDATE_SAMPLE ||\r\n      request.type === ET.EditRequestType.DELETE_SAMPLE\r\n    ) {\r\n      editedSamples.add(request.localId as number);\r\n    }\r\n  }\r\n\r\n  for (let i = 0; i < meshes.sampleIdsLength(); i++) {\r\n    const sampleId = meshes.sampleIds(i) as number;\r\n    if (editedSamples.has(sampleId)) {\r\n      const sample = meshes.samples(i) as TFB.Sample;\r\n      const itemIndex = sample.item();\r\n      const ltIndex = meshes.meshesItems(itemIndex) as number;\r\n      const localId = model.localIds(ltIndex) as number;\r\n      affectedItems.add(localId);\r\n    }\r\n  }\r\n}\r\n\r\nexport function edit(\r\n  model: TFB.Model,\r\n  requests: ET.EditRequest[],\r\n  config?: { raw?: boolean; delta?: boolean },\r\n) {\r\n  // Strategy: we will copy all the data from the given model to create a new one\r\n  // while applying all the edits defined in the requests\r\n\r\n  // Note that structs arrays need to be created in reverse order\r\n\r\n  const meshes = model.meshes() as TFB.Meshes;\r\n\r\n  const raw = config?.raw ?? false;\r\n\r\n  // Now, if it's delta mode, we gather the items that will be affected by the edits to just return them\r\n  const delta = config?.delta ?? false;\r\n\r\n  let deltaItemIds = new Set<number>();\r\n  let deltaGts = new Set<number>();\r\n  let deltaLts = new Set<number>();\r\n  let deltaSamples = new Set<number>();\r\n  let deltaMaterials = new Set<number>();\r\n  let deltaReps = new Set<number>();\r\n  let deltaShells = new Set<number>();\r\n  let deltaCircleExtrusions = new Set<number>();\r\n  let deltaDeletedGts = 0;\r\n  let deltaDeletedLts = 0;\r\n  let deltaDeletedSamples = 0;\r\n  let deltaDeletedMaterials = 0;\r\n  let deltaDeletedRepresentations = 0;\r\n  let deltaDeletedShells = 0;\r\n  let deltaDeletedCircleExtrusions = 0;\r\n\r\n  if (delta) {\r\n    const itemsToInclude = getIdsDelta(model, requests);\r\n    deltaItemIds = itemsToInclude.itemIds;\r\n    deltaGts = itemsToInclude.globalTranforms;\r\n    deltaLts = itemsToInclude.localTransforms;\r\n    deltaSamples = itemsToInclude.samples;\r\n    deltaMaterials = itemsToInclude.materials;\r\n    deltaReps = itemsToInclude.representations;\r\n    deltaShells = itemsToInclude.shells;\r\n    deltaCircleExtrusions = itemsToInclude.circleExtrusions;\r\n    deltaDeletedGts = itemsToInclude.detaDeletedGts;\r\n    deltaDeletedLts = itemsToInclude.detaDeletedLts;\r\n    deltaDeletedSamples = itemsToInclude.detaDeletedSamples;\r\n    deltaDeletedMaterials = itemsToInclude.detaDeletedMaterials;\r\n    deltaDeletedRepresentations = itemsToInclude.detaDeletedRepresentations;\r\n    deltaDeletedShells = itemsToInclude.detaDeletedShells;\r\n    deltaDeletedCircleExtrusions = itemsToInclude.detaDeletedCircleExtrusions;\r\n    const createNewSample = itemsToInclude.createNewSample;\r\n    if (\r\n      !createNewSample &&\r\n      deltaItemIds.size === 0 &&\r\n      deltaGts.size === 0 &&\r\n      deltaLts.size === 0 &&\r\n      deltaSamples.size === 0 &&\r\n      deltaMaterials.size === 0 &&\r\n      deltaReps.size === 0 &&\r\n      deltaShells.size === 0 &&\r\n      deltaCircleExtrusions.size === 0\r\n    ) {\r\n      // Emtpy delta model, but we need to return affected items\r\n      // e.g. if the user deleted some items\r\n\r\n      const affectedItems = new Set<number>();\r\n      const editedSamples = new Set<number>();\r\n      getAffectedItems(requests, editedSamples, meshes, model, affectedItems);\r\n\r\n      return { model: newModel({ raw }), items: Array.from(affectedItems) };\r\n    }\r\n  }\r\n\r\n  // Now, let's gather the data of all the edits we have to make\r\n\r\n  const matsToUpdate = new Map<number, ET.RawMaterial>();\r\n  const reprsToUpdate = new Map<number, ET.RawRepresentation>();\r\n  const samplesToUpdate = new Map<number, ET.RawSample>();\r\n  const gtsToUpdate = new Map<number, ET.RawGlobalTransformData>();\r\n  const ltsToUpdate = new Map<number, ET.RawTransformData>();\r\n  const shellsToUpdate = new Map<number, number>(); // Contains shells indices - representation id\r\n  const circleExtrusionsToUpdate = new Map<number, number>(); // Contains circle extrusions indices - representation id\r\n  const itemsToUpdate = new Map<number, ET.RawItemData>();\r\n  const relationsToUpdate = new Map<number, ET.RawRelationData>();\r\n\r\n  let metadataToUpdate: null | ET.RawMetadataData = null;\r\n  let spatialStructureToUpdate: null | SpatialTreeItem = null;\r\n\r\n  const matsToCreate = new Map<number, ET.RawMaterial>();\r\n  const reprsToCreate = new Map<number, ET.RawRepresentation>();\r\n  const shellsToCreate = new Map<number, ET.RawShell>();\r\n  const circleExtrusionsToCreate = new Map<number, ET.RawCircleExtrusion>();\r\n  const samplesToCreate = new Map<number, ET.RawSample>();\r\n  const gtsToCreate = new Map<number, ET.RawGlobalTransformData>();\r\n  const ltsToCreate = new Map<number, ET.RawTransformData>();\r\n  const itemsToCreate = new Map<number, ET.RawItemData>();\r\n  const relationsToCreate = new Map<number, ET.RawRelationData>();\r\n\r\n  const matsToDelete = new Set<number>();\r\n  const samplesToDelete = new Set<number>();\r\n  const reprsToDelete = new Set<number>();\r\n  const shellsToDelete = new Set<number>(); // Contains shells indices\r\n  const circleExtrusionsToDelete = new Set<number>(); // Contains circle extrusions indices\r\n  const gtsToDelete = new Set<number>();\r\n  const ltsToDelete = new Set<number>();\r\n  const itemsToDelete = new Set<number>();\r\n  const relationsToDelete = new Set<number>();\r\n\r\n  const prevMatIds = new Set<number>(meshes.materialIdsArray());\r\n  const prevReprIds = new Set<number>(meshes.representationIdsArray());\r\n  const prevSampleIds = new Set<number>(meshes.sampleIdsArray());\r\n  const prevGtIds = new Set<number>(meshes.globalTransformIdsArray());\r\n  const prevLtIds = new Set<number>(meshes.localTransformIdsArray());\r\n  const prevItemIds = new Set<number>(model.localIdsArray());\r\n\r\n  let newMaxLocalId = model.maxLocalId();\r\n\r\n  for (const request of requests) {\r\n    // UPDATE\r\n    if (request.type === ET.EditRequestType.UPDATE_MATERIAL) {\r\n      matsToUpdate.set(request.localId as number, request.data);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.UPDATE_REPRESENTATION) {\r\n      reprsToUpdate.set(request.localId as number, request.data);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.UPDATE_SAMPLE) {\r\n      // We solved the temp ids before, so we can cast the data to the correct type\r\n      samplesToUpdate.set(\r\n        request.localId as number,\r\n        request.data as ET.RawSample,\r\n      );\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.UPDATE_GLOBAL_TRANSFORM) {\r\n      gtsToUpdate.set(request.localId as number, request.data);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.UPDATE_LOCAL_TRANSFORM) {\r\n      ltsToUpdate.set(request.localId as number, request.data);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.UPDATE_ITEM) {\r\n      itemsToUpdate.set(request.localId as number, request.data);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.UPDATE_RELATION) {\r\n      relationsToUpdate.set(request.localId as number, request.data);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.UPDATE_METADATA) {\r\n      metadataToUpdate = request.data;\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.UPDATE_SPATIAL_STRUCTURE) {\r\n      spatialStructureToUpdate = request.data;\r\n      continue;\r\n    }\r\n    // CREATE\r\n    if (request.type === ET.EditRequestType.CREATE_MATERIAL) {\r\n      const localId = request.localId!;\r\n      if (prevMatIds.has(localId as number)) {\r\n        continue;\r\n      }\r\n      matsToCreate.set(localId as number, request.data);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.CREATE_REPRESENTATION) {\r\n      const localId = request.localId!;\r\n      if (prevReprIds.has(localId as number)) {\r\n        continue;\r\n      }\r\n      reprsToCreate.set(localId as number, request.data);\r\n      if (request.data.representationClass === TFB.RepresentationClass.SHELL) {\r\n        shellsToCreate.set(\r\n          localId as number,\r\n          request.data.geometry as ET.RawShell,\r\n        );\r\n      } else if (\r\n        request.data.representationClass ===\r\n        TFB.RepresentationClass.CIRCLE_EXTRUSION\r\n      ) {\r\n        circleExtrusionsToCreate.set(\r\n          localId as number,\r\n          request.data.geometry as ET.RawCircleExtrusion,\r\n        );\r\n      }\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.CREATE_SAMPLE) {\r\n      const localId = request.localId!;\r\n      if (prevSampleIds.has(localId as number)) {\r\n        continue;\r\n      }\r\n      samplesToCreate.set(localId as number, request.data as ET.RawSample);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.CREATE_GLOBAL_TRANSFORM) {\r\n      const localId = request.localId!;\r\n      if (prevGtIds.has(localId as number)) {\r\n        continue;\r\n      }\r\n      gtsToCreate.set(localId as number, request.data);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.CREATE_LOCAL_TRANSFORM) {\r\n      const localId = request.localId!;\r\n      if (prevLtIds.has(localId as number)) {\r\n        continue;\r\n      }\r\n      ltsToCreate.set(localId as number, request.data);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.CREATE_ITEM) {\r\n      const localId = request.localId!;\r\n      if (prevItemIds.has(localId as number)) {\r\n        continue;\r\n      }\r\n      itemsToCreate.set(localId as number, request.data);\r\n    }\r\n    if (request.type === ET.EditRequestType.CREATE_RELATION) {\r\n      const localId = request.localId!;\r\n      relationsToCreate.set(localId as number, request.data);\r\n    }\r\n    // DELETE\r\n    if (request.type === ET.EditRequestType.DELETE_MATERIAL) {\r\n      matsToDelete.add(request.localId as number);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.DELETE_REPRESENTATION) {\r\n      reprsToDelete.add(request.localId as number);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.DELETE_SAMPLE) {\r\n      samplesToDelete.add(request.localId as number);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.DELETE_GLOBAL_TRANSFORM) {\r\n      gtsToDelete.add(request.localId as number);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.DELETE_LOCAL_TRANSFORM) {\r\n      ltsToDelete.add(request.localId as number);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.DELETE_ITEM) {\r\n      itemsToDelete.add(request.localId as number);\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.UPDATE_MAX_LOCAL_ID) {\r\n      newMaxLocalId = request.localId as number;\r\n      continue;\r\n    }\r\n    if (request.type === ET.EditRequestType.DELETE_RELATION) {\r\n      relationsToDelete.add(request.localId as number);\r\n      continue;\r\n    }\r\n  }\r\n\r\n  for (let i = 0; i < meshes.representationsLength(); i++) {\r\n    const repr = meshes.representations(i) as TFB.Representation;\r\n    const geometryIndex = repr.id();\r\n    const reprId = meshes.representationIds(i) as number;\r\n\r\n    if (delta && !deltaReps.has(reprId)) {\r\n      continue;\r\n    }\r\n\r\n    if (reprsToDelete.has(reprId)) {\r\n      if (repr.representationClass() === TFB.RepresentationClass.SHELL) {\r\n        shellsToDelete.add(geometryIndex);\r\n      } else if (\r\n        repr.representationClass() === TFB.RepresentationClass.CIRCLE_EXTRUSION\r\n      ) {\r\n        circleExtrusionsToDelete.add(geometryIndex);\r\n      } else {\r\n        throw new Error(\"Representation class is not supported\");\r\n      }\r\n      continue;\r\n    }\r\n    if (!reprsToUpdate.has(reprId)) {\r\n      continue;\r\n    }\r\n    const reprClass = repr.representationClass();\r\n    if (reprClass === TFB.RepresentationClass.SHELL) {\r\n      shellsToUpdate.set(geometryIndex, reprId);\r\n    } else if (reprClass === TFB.RepresentationClass.CIRCLE_EXTRUSION) {\r\n      circleExtrusionsToUpdate.set(geometryIndex, reprId);\r\n    } else {\r\n      throw new Error(\"Representation class is not supported\");\r\n    }\r\n  }\r\n\r\n  // Let's clean up what we don't need anymore\r\n\r\n  prevMatIds.clear();\r\n  prevReprIds.clear();\r\n  prevSampleIds.clear();\r\n  prevGtIds.clear();\r\n  prevLtIds.clear();\r\n  prevItemIds.clear();\r\n\r\n  // Let's see what numbers do we have\r\n\r\n  const prevMatCount = meshes.materialsLength();\r\n  const includedMatCount = delta ? deltaMaterials.size : prevMatCount;\r\n  const deletedMatCount = delta ? deltaDeletedMaterials : matsToDelete.size;\r\n  const newMatCount = includedMatCount + matsToCreate.size - deletedMatCount;\r\n\r\n  const prevReprCount = meshes.representationsLength();\r\n  const includedReprCount = delta ? deltaReps.size : prevReprCount;\r\n  const deletedReprCount = delta\r\n    ? deltaDeletedRepresentations\r\n    : reprsToDelete.size;\r\n  // In delta mode, representations that exist in both deltaReps (from UPDATE)\r\n  // and reprsToCreate (from replayed CREATE) are double-counted. Subtract overlap.\r\n  let reprOverlap = 0;\r\n  if (delta) {\r\n    for (const [id] of reprsToCreate) {\r\n      if (deltaReps.has(id)) {\r\n        reprOverlap++;\r\n      }\r\n    }\r\n  }\r\n  const newReprCount =\r\n    includedReprCount + reprsToCreate.size - deletedReprCount - reprOverlap;\r\n\r\n  const prevShellCount = meshes.shellsLength();\r\n  const includedShellCount = delta ? deltaShells.size : prevShellCount;\r\n  const deletedShellCount = delta ? deltaDeletedShells : shellsToDelete.size;\r\n  const newShellCount =\r\n    includedShellCount + shellsToCreate.size - deletedShellCount;\r\n\r\n  const prevCircleExtrusionCount = meshes.circleExtrusionsLength();\r\n  const includedCircleExtrusionCount = delta\r\n    ? deltaCircleExtrusions.size\r\n    : prevCircleExtrusionCount;\r\n  const deletedCircleExtrusionCount = delta\r\n    ? deltaDeletedCircleExtrusions\r\n    : circleExtrusionsToDelete.size;\r\n  const newCircleExtrusionCount =\r\n    includedCircleExtrusionCount +\r\n    circleExtrusionsToCreate.size -\r\n    deletedCircleExtrusionCount;\r\n\r\n  const prevSampleCount = meshes.samplesLength();\r\n  const includedSampleCount = delta ? deltaSamples.size : prevSampleCount;\r\n  const deletedSampleCount = delta ? deltaDeletedSamples : samplesToDelete.size;\r\n  const newSampleCount =\r\n    includedSampleCount + samplesToCreate.size - deletedSampleCount;\r\n\r\n  const prevGtCount = meshes.globalTransformsLength();\r\n  const includedGtCount = delta ? deltaGts.size : prevGtCount;\r\n  const deletedGtCount = delta ? deltaDeletedGts : gtsToDelete.size;\r\n  const newGtCount = includedGtCount + gtsToCreate.size - deletedGtCount;\r\n\r\n  const prevLtCount = meshes.localTransformsLength();\r\n  const includedLtCount = delta ? deltaLts.size : prevLtCount;\r\n  const deletedLtCount = delta ? deltaDeletedLts : ltsToDelete.size;\r\n  const newLtCount = includedLtCount + ltsToCreate.size - deletedLtCount;\r\n\r\n  if (\r\n    newGtCount < 0 ||\r\n    newReprCount < 0 ||\r\n    newSampleCount < 0 ||\r\n    newLtCount < 0 ||\r\n    newMatCount < 0 ||\r\n    newShellCount < 0 ||\r\n    newCircleExtrusionCount < 0\r\n  ) {\r\n    throw new Error(\"Invalid number of elements\");\r\n  }\r\n\r\n  // Next we will make a map from local id to index\r\n  // We need to convert them to indices when copying the samples\r\n  // Incoming sample objects use local ids\r\n\r\n  // We will also store the new local ids to add them to the new model\r\n\r\n  const localIdToIndex = new Map<number, number>();\r\n  const finalMaterialIds: number[] = [];\r\n  const finalReprIds: number[] = [];\r\n  const finalSampleIds: number[] = [];\r\n  const finalGtIds: number[] = [];\r\n  const finalMeshesItems: number[] = [];\r\n  const finalLtIds: number[] = [];\r\n  const finalItemIds: number[] = [];\r\n\r\n  // Updated global transforms\r\n\r\n  let gtCounter = 0;\r\n  for (let i = 0; i < meshes.globalTransformsLength(); i++) {\r\n    const localId = meshes.globalTransformIds(i) as number;\r\n    if (gtsToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n    if (delta && !deltaGts.has(localId)) {\r\n      continue;\r\n    }\r\n    if (localIdToIndex.has(localId)) {\r\n      throw new Error(\"Local id already exists\");\r\n    }\r\n    localIdToIndex.set(localId, gtCounter++);\r\n    finalGtIds.push(localId);\r\n  }\r\n\r\n  // Created global transforms\r\n\r\n  for (const [localId] of gtsToCreate) {\r\n    if (gtsToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n    if (localIdToIndex.has(localId)) {\r\n      throw new Error(\"Local id already exists\");\r\n    }\r\n    localIdToIndex.set(localId, gtCounter++);\r\n    finalGtIds.push(localId);\r\n  }\r\n\r\n  // Updated materials\r\n\r\n  let matCounter = 0;\r\n  for (let i = 0; i < meshes.materialIdsLength(); i++) {\r\n    const localId = meshes.materialIds(i) as number;\r\n    if (matsToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n    if (delta && !deltaMaterials.has(localId)) {\r\n      continue;\r\n    }\r\n    if (localIdToIndex.has(localId)) {\r\n      throw new Error(\"Local id already exists\");\r\n    }\r\n    localIdToIndex.set(localId, matCounter++);\r\n    finalMaterialIds.push(localId);\r\n  }\r\n\r\n  // Created materials\r\n\r\n  for (const [localId] of matsToCreate) {\r\n    if (matsToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n    if (localIdToIndex.has(localId)) {\r\n      throw new Error(\"Local id already exists\");\r\n    }\r\n    localIdToIndex.set(localId, matCounter++);\r\n    finalMaterialIds.push(localId);\r\n  }\r\n\r\n  // Updated local transforms\r\n\r\n  let ltCounter = 0;\r\n  for (let i = 0; i < meshes.localTransformIdsLength(); i++) {\r\n    const localId = meshes.localTransformIds(i) as number;\r\n    if (ltsToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n    if (delta && !deltaLts.has(localId)) {\r\n      continue;\r\n    }\r\n    if (localIdToIndex.has(localId)) {\r\n      throw new Error(\"Local id already exists\");\r\n    }\r\n    localIdToIndex.set(localId, ltCounter++);\r\n    finalLtIds.push(localId);\r\n  }\r\n\r\n  // Created local transforms\r\n\r\n  for (const [localId] of ltsToCreate) {\r\n    if (ltsToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n    if (localIdToIndex.has(localId)) {\r\n      throw new Error(\"Local id already exists\");\r\n    }\r\n    localIdToIndex.set(localId, ltCounter++);\r\n    finalLtIds.push(localId);\r\n  }\r\n\r\n  // Updated representations\r\n\r\n  let reprCounter = 0;\r\n  for (let i = 0; i < meshes.representationIdsLength(); i++) {\r\n    const localId = meshes.representationIds(i) as number;\r\n    if (reprsToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n    if (delta && !deltaReps.has(localId)) {\r\n      continue;\r\n    }\r\n    if (localIdToIndex.has(localId)) {\r\n      throw new Error(\"Local id already exists\");\r\n    }\r\n    localIdToIndex.set(localId, reprCounter++);\r\n    finalReprIds.push(localId);\r\n  }\r\n\r\n  // Created representations\r\n\r\n  for (const [localId] of reprsToCreate) {\r\n    if (reprsToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n    if (localIdToIndex.has(localId)) {\r\n      throw new Error(\"Local id already exists\");\r\n    }\r\n    localIdToIndex.set(localId, reprCounter++);\r\n    finalReprIds.push(localId);\r\n  }\r\n\r\n  // Updated samples (we don't need to store the index because it's not used)\r\n\r\n  for (let i = 0; i < meshes.sampleIdsLength(); i++) {\r\n    const localId = meshes.sampleIds(i) as number;\r\n    if (samplesToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n    if (delta && !deltaSamples.has(localId)) {\r\n      continue;\r\n    }\r\n    finalSampleIds.push(localId);\r\n  }\r\n\r\n  // Created samples  (we don't need to store the index because it's not used`)\r\n\r\n  for (const [localId] of samplesToCreate) {\r\n    if (samplesToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n    finalSampleIds.push(localId);\r\n  }\r\n\r\n  // Updated items\r\n\r\n  let itemsCounter = 0;\r\n  for (let i = 0; i < model.localIdsLength(); i++) {\r\n    const localId = model.localIds(i) as number;\r\n    if (itemsToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n    if (delta && !deltaItemIds.has(localId)) {\r\n      continue;\r\n    }\r\n    localIdToIndex.set(localId, itemsCounter++);\r\n    finalItemIds.push(localId);\r\n  }\r\n\r\n  // Created items\r\n  for (const [localId] of itemsToCreate) {\r\n    if (itemsToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n    localIdToIndex.set(localId, itemsCounter++);\r\n    finalItemIds.push(localId);\r\n  }\r\n\r\n  // Now, let's start creating the model\r\n\r\n  const builder = new FB.Builder(1024);\r\n\r\n  // Meshes.globalTransforms\r\n\r\n  TFB.Meshes.startGlobalTransformsVector(builder, newGtCount);\r\n\r\n  // Create new global transforms\r\n\r\n  const newGtIdSet = Array.from(gtsToCreate.keys());\r\n  for (let i = 0; i < newGtIdSet.length; i++) {\r\n    const j = newGtIdSet.length - 1 - i;\r\n    const localId = newGtIdSet[j];\r\n\r\n    const needsUpdate = gtsToUpdate.has(localId);\r\n    const gt = needsUpdate\r\n      ? gtsToUpdate.get(localId)\r\n      : gtsToCreate.get(localId);\r\n\r\n    if (!gt) {\r\n      throw new Error(`Global transform not found: ${localId}`);\r\n    }\r\n\r\n    if (gtsToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n\r\n    const itemId = gt.itemId as number;\r\n    if (!localIdToIndex.has(itemId)) {\r\n      throw new Error(\"Item id not found for global transform\");\r\n    }\r\n    const itemIndex = localIdToIndex.get(itemId) as number;\r\n    finalMeshesItems.unshift(itemIndex);\r\n\r\n    createTransform(gt, builder);\r\n  }\r\n  newGtIdSet.length = 0;\r\n\r\n  // Update or copy existing global transforms\r\n\r\n  for (let i = 0; i < prevGtCount; i++) {\r\n    const j = prevGtCount - 1 - i;\r\n    const current = meshes.globalTransforms(j) as TFB.Transform;\r\n    const localId = meshes.globalTransformIds(j) as number;\r\n\r\n    if (gtsToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n\r\n    if (delta && !deltaGts.has(localId)) {\r\n      continue;\r\n    }\r\n\r\n    const needsUpdate = gtsToUpdate.has(localId);\r\n\r\n    if (needsUpdate) {\r\n      const updated = gtsToUpdate.get(localId) as ET.RawGlobalTransformData;\r\n\r\n      const itemId = updated.itemId as number;\r\n      if (!localIdToIndex.has(itemId)) {\r\n        throw new Error(`Item id not found for global transform: ${localId}`);\r\n      }\r\n      const newItemIndex = localIdToIndex.get(itemId) as number;\r\n      finalMeshesItems.unshift(newItemIndex);\r\n\r\n      createTransform(updated, builder);\r\n    } else {\r\n      const prevItemIndex = meshes.meshesItems(j) as number;\r\n      const itemId = model.localIds(prevItemIndex) as number;\r\n      if (!localIdToIndex.has(itemId)) {\r\n        throw new Error(`Item id not found for global transform: ${localId}`);\r\n      }\r\n      const newItemIndex = localIdToIndex.get(itemId) as number;\r\n      finalMeshesItems.unshift(newItemIndex);\r\n\r\n      copyTransform(builder, current);\r\n    }\r\n  }\r\n\r\n  const globalTransformsRef = builder.endVector();\r\n\r\n  // Meshes.shells\r\n\r\n  const shellsOffsets: number[] = [];\r\n\r\n  // Update or copy existing shells\r\n\r\n  for (let i = 0; i < prevShellCount; i++) {\r\n    if (shellsToDelete.has(i)) {\r\n      continue;\r\n    }\r\n    if (delta && !deltaShells.has(i)) {\r\n      continue;\r\n    }\r\n    if (shellsToUpdate.has(i)) {\r\n      const reprId = shellsToUpdate.get(i) as number;\r\n      const repr = reprsToUpdate.get(reprId) as ET.RawRepresentation;\r\n      const shell = repr.geometry as ET.RawShell;\r\n      const shellOffset = createShell(builder, shell);\r\n      shellsOffsets.push(shellOffset);\r\n      continue;\r\n    }\r\n    const shell = meshes.shells(i) as TFB.Shell;\r\n    const shellOffset = copyShell(builder, shell);\r\n    shellsOffsets.push(shellOffset);\r\n  }\r\n\r\n  // Create new shells\r\n\r\n  for (const [id] of shellsToCreate) {\r\n    // Here we don't have a shell index because it doesn't exist, but the repr local id\r\n    if (reprsToDelete.has(id)) {\r\n      continue;\r\n    }\r\n\r\n    // Check if this newly-created representation also has a pending update\r\n    // (happens for raw/delta models where CREATE + UPDATE are replayed in the same batch)\r\n    const needsUpdate = reprsToUpdate.has(id);\r\n    let shellOffset = 0;\r\n    if (needsUpdate) {\r\n      const repr = reprsToUpdate.get(id) as ET.RawRepresentation;\r\n      const shell = repr.geometry as ET.RawShell;\r\n      shellOffset = createShell(builder, shell);\r\n    } else {\r\n      const shell = shellsToCreate.get(id) as ET.RawShell;\r\n      shellOffset = createShell(builder, shell);\r\n    }\r\n    shellsOffsets.push(shellOffset);\r\n  }\r\n\r\n  const shells = TFB.Meshes.createShellsVector(builder, shellsOffsets);\r\n\r\n  // Meshes.circleExtrusions\r\n\r\n  const circleExtrusionsOffsets: number[] = [];\r\n\r\n  // Update or copy existing circle extrusions\r\n\r\n  for (let i = 0; i < prevCircleExtrusionCount; i++) {\r\n    if (circleExtrusionsToDelete.has(i)) {\r\n      continue;\r\n    }\r\n    if (delta && !deltaCircleExtrusions.has(i)) {\r\n      continue;\r\n    }\r\n    if (circleExtrusionsToUpdate.has(i)) {\r\n      const reprId = circleExtrusionsToUpdate.get(i) as number;\r\n      const repr = reprsToUpdate.get(reprId) as ET.RawRepresentation;\r\n      const circleExtrusion = repr.geometry as ET.RawCircleExtrusion;\r\n      const circleExtrusionOffset = createCircleExtrusion(\r\n        builder,\r\n        circleExtrusion,\r\n      );\r\n      circleExtrusionsOffsets.push(circleExtrusionOffset);\r\n      continue;\r\n    }\r\n    const circleExtrusion = meshes.circleExtrusions(i) as TFB.CircleExtrusion;\r\n    const circleExtrusionOffset = copyCircleExtrusion(builder, circleExtrusion);\r\n    circleExtrusionsOffsets.push(circleExtrusionOffset);\r\n  }\r\n\r\n  // Create new circle extrusions\r\n\r\n  for (const [id] of circleExtrusionsToCreate) {\r\n    // Here we don't have a circle extrusion index because it doesn't exist, but the repr local id\r\n    if (circleExtrusionsToDelete.has(id)) {\r\n      continue;\r\n    }\r\n\r\n    // Check if this newly-created representation also has a pending update\r\n    // (happens for raw/delta models where CREATE + UPDATE are replayed in the same batch)\r\n    const needsUpdate = reprsToUpdate.has(id);\r\n    let circleExtrusionOffset = 0;\r\n    if (needsUpdate) {\r\n      const repr = reprsToUpdate.get(id) as ET.RawRepresentation;\r\n      const circleExtrusion = repr.geometry as ET.RawCircleExtrusion;\r\n      circleExtrusionOffset = createCircleExtrusion(builder, circleExtrusion);\r\n    } else {\r\n      const circleExtrusion = circleExtrusionsToCreate.get(\r\n        id,\r\n      ) as ET.RawCircleExtrusion;\r\n      circleExtrusionOffset = createCircleExtrusion(builder, circleExtrusion);\r\n    }\r\n    circleExtrusionsOffsets.push(circleExtrusionOffset);\r\n  }\r\n\r\n  const circleExtrusions = TFB.Meshes.createCircleExtrusionsVector(\r\n    builder,\r\n    circleExtrusionsOffsets,\r\n  );\r\n\r\n  // Meshes.representations\r\n\r\n  TFB.Meshes.startRepresentationsVector(builder, newReprCount);\r\n\r\n  // Create new representations\r\n\r\n  const createdReprsIdSet = Array.from(reprsToCreate.keys());\r\n  let newShellCounter = newShellCount - 1;\r\n  let newCircleExtrusionCounter = newCircleExtrusionCount - 1;\r\n\r\n  for (let i = 0; i < createdReprsIdSet.length; i++) {\r\n    const j = createdReprsIdSet.length - 1 - i;\r\n    const localId = createdReprsIdSet[j];\r\n\r\n    if (reprsToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n\r\n    const needsUpdate = reprsToUpdate.has(localId);\r\n    const repr = needsUpdate\r\n      ? reprsToUpdate.get(localId)\r\n      : reprsToCreate.get(localId);\r\n\r\n    if (!repr) {\r\n      throw new Error(`Representation not found: ${localId}`);\r\n    }\r\n\r\n    const bbox = repr.bbox;\r\n    const rClass = repr.representationClass;\r\n    let id = 0;\r\n    if (repr.representationClass === TFB.RepresentationClass.SHELL) {\r\n      id = newShellCounter--;\r\n    } else if (\r\n      repr.representationClass === TFB.RepresentationClass.CIRCLE_EXTRUSION\r\n    ) {\r\n      id = newCircleExtrusionCounter--;\r\n    } else {\r\n      throw new Error(\"Representation class is not supported\");\r\n    }\r\n    // prettier-ignore\r\n    TFB.Representation.createRepresentation(\r\n        builder, id,\r\n        bbox[0],bbox[1],bbox[2],\r\n        bbox[3],bbox[4],bbox[5],\r\n        rClass,\r\n      );\r\n  }\r\n  createdReprsIdSet.length = 0;\r\n\r\n  // Update or copy existing representations\r\n\r\n  for (let i = 0; i < prevReprCount; i++) {\r\n    const j = prevReprCount - 1 - i;\r\n    const current = meshes.representations(j) as TFB.Representation;\r\n    const currentId = meshes.representationIds(j) as number;\r\n\r\n    if (reprsToDelete.has(currentId)) {\r\n      continue;\r\n    }\r\n\r\n    if (delta && !deltaReps.has(currentId)) {\r\n      continue;\r\n    }\r\n\r\n    const needsUpdate = reprsToUpdate.has(currentId);\r\n    if (needsUpdate) {\r\n      const updated = reprsToUpdate.get(currentId) as ET.RawRepresentation;\r\n      const bbox = updated.bbox;\r\n\r\n      let id = 0;\r\n      if (updated.representationClass === TFB.RepresentationClass.SHELL) {\r\n        id = newShellCounter--;\r\n      } else if (\r\n        updated.representationClass === TFB.RepresentationClass.CIRCLE_EXTRUSION\r\n      ) {\r\n        id = newCircleExtrusionCounter--;\r\n      } else {\r\n        throw new Error(\"Representation class is not supported\");\r\n      }\r\n\r\n      const rClass = updated.representationClass;\r\n      // prettier-ignore\r\n      TFB.Representation.createRepresentation(\r\n        builder, id,\r\n        bbox[0],bbox[1],bbox[2],\r\n        bbox[3],bbox[4],bbox[5],\r\n        rClass,\r\n      );\r\n    } else {\r\n      const bbox = current.bbox() as TFB.BoundingBox;\r\n\r\n      let id = 0;\r\n      if (current.representationClass() === TFB.RepresentationClass.SHELL) {\r\n        id = newShellCounter--;\r\n      } else if (\r\n        current.representationClass() ===\r\n        TFB.RepresentationClass.CIRCLE_EXTRUSION\r\n      ) {\r\n        id = newCircleExtrusionCounter--;\r\n      } else {\r\n        throw new Error(\"Representation class is not supported\");\r\n      }\r\n\r\n      const rClass = current.representationClass();\r\n      const min = bbox.min() as TFB.FloatVector;\r\n      const max = bbox.max() as TFB.FloatVector;\r\n      // prettier-ignore\r\n      TFB.Representation.createRepresentation(\r\n        builder, id,\r\n        min.x(),min.y(),min.z(),\r\n        max.x(),max.y(),max.z(),\r\n        rClass,\r\n      );\r\n    }\r\n  }\r\n\r\n  const representationsRef = builder.endVector();\r\n\r\n  // Meshes.samples\r\n\r\n  TFB.Meshes.startSamplesVector(builder, newSampleCount);\r\n\r\n  // Create new samples\r\n\r\n  const newSamplesIdSet = Array.from(samplesToCreate.keys());\r\n  for (let i = 0; i < newSamplesIdSet.length; i++) {\r\n    const j = newSamplesIdSet.length - 1 - i;\r\n    const localId = newSamplesIdSet[j];\r\n    if (samplesToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n\r\n    const needsUpdate = samplesToUpdate.has(localId);\r\n    const sample = needsUpdate\r\n      ? samplesToUpdate.get(localId)\r\n      : samplesToCreate.get(localId);\r\n    if (!sample) {\r\n      throw new Error(`Sample not found: ${localId}`);\r\n    }\r\n\r\n    // We will get the local id of all elements the sample reference and assign them its new index\r\n\r\n    if (matsToDelete.has(sample.material)) {\r\n      throw new Error(`Material to delete found in sample ${localId}`);\r\n    }\r\n\r\n    if (reprsToDelete.has(sample.representation)) {\r\n      throw new Error(`Representation to delete found in sample ${localId}`);\r\n    }\r\n\r\n    const gtId = sample.item;\r\n    const matId = sample.material;\r\n    const reprId = sample.representation;\r\n    const ltId = sample.localTransform;\r\n    buildSample(builder, localIdToIndex, gtId, matId, reprId, ltId);\r\n  }\r\n  newSamplesIdSet.length = 0;\r\n\r\n  // Update or copy existing samples\r\n\r\n  for (let i = 0; i < prevSampleCount; i++) {\r\n    const j = prevSampleCount - 1 - i;\r\n    const current = meshes.samples(j) as TFB.Sample;\r\n    const currentId = meshes.sampleIds(j) as number;\r\n\r\n    if (samplesToDelete.has(currentId)) {\r\n      continue;\r\n    }\r\n\r\n    if (delta && !deltaSamples.has(currentId)) {\r\n      continue;\r\n    }\r\n\r\n    // We will get the local id of all elements the sample reference and assign them its new index\r\n    const needsUpdate = samplesToUpdate.has(currentId);\r\n    if (needsUpdate) {\r\n      const updated = samplesToUpdate.get(currentId) as ET.RawSample;\r\n      const gtId = updated.item;\r\n      const matId = updated.material;\r\n      const reprId = updated.representation;\r\n      const ltId = updated.localTransform;\r\n      buildSample(builder, localIdToIndex, gtId, matId, reprId, ltId);\r\n      continue;\r\n    }\r\n\r\n    const gtId = meshes.globalTransformIds(current.item()) as number;\r\n    const matId = meshes.materialIds(current.material()) as number;\r\n    const reprId = meshes.representationIds(current.representation()) as number;\r\n    const ltId = meshes.localTransformIds(current.localTransform()) as number;\r\n\r\n    if (matsToDelete.has(matId)) {\r\n      throw new Error(`Material to delete found in sample ${currentId}`);\r\n    }\r\n\r\n    buildSample(builder, localIdToIndex, gtId, matId, reprId, ltId);\r\n  }\r\n\r\n  const samplesOffset = builder.endVector();\r\n\r\n  // Meshes.localTransforms\r\n\r\n  TFB.Meshes.startLocalTransformsVector(builder, newLtCount);\r\n\r\n  // Create new local transforms\r\n\r\n  const newLtIdSet = Array.from(ltsToCreate.keys());\r\n  for (let i = 0; i < newLtIdSet.length; i++) {\r\n    const j = newLtIdSet.length - 1 - i;\r\n    const localId = newLtIdSet[j];\r\n\r\n    if (ltsToDelete.has(localId)) {\r\n      continue;\r\n    }\r\n\r\n    const needsUpdate = ltsToUpdate.has(localId);\r\n    const lt = needsUpdate\r\n      ? ltsToUpdate.get(localId)\r\n      : ltsToCreate.get(localId);\r\n\r\n    if (!lt) {\r\n      throw new Error(`Local transform not found: ${localId}`);\r\n    }\r\n\r\n    createTransform(lt, builder);\r\n  }\r\n  newLtIdSet.length = 0;\r\n\r\n  // Update or copy existing local transforms\r\n\r\n  for (let i = 0; i < prevLtCount; i++) {\r\n    const j = prevLtCount - 1 - i;\r\n    const current = meshes.localTransforms(j) as TFB.Transform;\r\n    const currentId = meshes.localTransformIds(j) as number;\r\n    const needsUpdate = ltsToUpdate.has(currentId);\r\n\r\n    if (ltsToDelete.has(currentId)) {\r\n      continue;\r\n    }\r\n\r\n    if (delta && !deltaLts.has(currentId)) {\r\n      continue;\r\n    }\r\n\r\n    if (needsUpdate) {\r\n      const updated = ltsToUpdate.get(currentId) as ET.RawTransformData;\r\n      createTransform(updated, builder);\r\n    } else {\r\n      copyTransform(builder, current);\r\n    }\r\n  }\r\n\r\n  const localTransformRef = builder.endVector();\r\n\r\n  // Meshes.materials\r\n\r\n  TFB.Meshes.startMaterialsVector(builder, newMatCount);\r\n\r\n  // Create new materials\r\n\r\n  const newMatsIdSet = Array.from(matsToCreate.keys());\r\n  for (let i = 0; i < newMatsIdSet.length; i++) {\r\n    const j = newMatsIdSet.length - 1 - i;\r\n    const currentId = newMatsIdSet[j];\r\n    if (matsToDelete.has(currentId)) {\r\n      continue;\r\n    }\r\n\r\n    const needsUpdate = matsToUpdate.has(currentId);\r\n    const material = needsUpdate\r\n      ? matsToUpdate.get(currentId)\r\n      : matsToCreate.get(currentId);\r\n\r\n    if (!material) {\r\n      throw new Error(`Material not found: ${currentId}`);\r\n    }\r\n\r\n    const r = material.r;\r\n    const g = material.g;\r\n    const b = material.b;\r\n    const a = material.a;\r\n    const stroke = material.stroke;\r\n    const renderedFaces = material.renderedFaces;\r\n    TFB.Material.createMaterial(builder, r, g, b, a, renderedFaces, stroke);\r\n  }\r\n  newMatsIdSet.length = 0;\r\n\r\n  // Update or copy existing materials\r\n\r\n  for (let i = 0; i < prevMatCount; i++) {\r\n    const j = prevMatCount - 1 - i;\r\n    const current = meshes.materials(j) as TFB.Material;\r\n    const currentId = meshes.materialIds(j) as number;\r\n    if (matsToDelete.has(currentId)) {\r\n      continue;\r\n    }\r\n\r\n    if (delta && !deltaMaterials.has(currentId)) {\r\n      continue;\r\n    }\r\n\r\n    const needsUpdate = matsToUpdate.has(currentId);\r\n    const updated = matsToUpdate.get(currentId) as ET.RawMaterial;\r\n\r\n    const r = needsUpdate ? updated.r : current.r();\r\n    const g = needsUpdate ? updated.g : current.g();\r\n    const b = needsUpdate ? updated.b : current.b();\r\n    const a = needsUpdate ? updated.a : current.a();\r\n    const stroke = needsUpdate ? updated.stroke : current.stroke();\r\n    const renderedFaces = needsUpdate\r\n      ? updated.renderedFaces\r\n      : current.renderedFaces();\r\n\r\n    TFB.Material.createMaterial(builder, r, g, b, a, renderedFaces, stroke);\r\n  }\r\n\r\n  const materialsRef = builder.endVector();\r\n\r\n  // Meshes.meshesItems\r\n\r\n  const meshesItemsOffset = TFB.Meshes.createMeshesItemsVector(\r\n    builder,\r\n    finalMeshesItems,\r\n  );\r\n\r\n  // Meshes.representationIds\r\n\r\n  const reprLocalIdsOffset = TFB.Meshes.createRepresentationIdsVector(\r\n    builder,\r\n    finalReprIds,\r\n  );\r\n\r\n  // Meshes.sampleIds\r\n\r\n  const sampleLocalIdsOffset = TFB.Meshes.createSampleIdsVector(\r\n    builder,\r\n    finalSampleIds,\r\n  );\r\n\r\n  // Meshes.materialIds\r\n\r\n  const materialLocalIdsOffset = TFB.Meshes.createMaterialIdsVector(\r\n    builder,\r\n    finalMaterialIds,\r\n  );\r\n\r\n  // Meshes.localTransformIds\r\n\r\n  const ltLocalIdsOffset = TFB.Meshes.createLocalTransformIdsVector(\r\n    builder,\r\n    finalLtIds,\r\n  );\r\n\r\n  // Meshes.globalTransformIds\r\n\r\n  const gtLocalIdsOffset = TFB.Meshes.createGlobalTransformIdsVector(\r\n    builder,\r\n    finalGtIds,\r\n  );\r\n\r\n  // Meshes\r\n\r\n  TFB.Meshes.startMeshes(builder);\r\n  const coordinates = meshes.coordinates() as TFB.Transform;\r\n  const coordinatesRef = copyTransform(builder, coordinates);\r\n  TFB.Meshes.addCoordinates(builder, coordinatesRef);\r\n  TFB.Meshes.addGlobalTransforms(builder, globalTransformsRef);\r\n  TFB.Meshes.addShells(builder, shells);\r\n  TFB.Meshes.addRepresentations(builder, representationsRef);\r\n  TFB.Meshes.addSamples(builder, samplesOffset);\r\n  TFB.Meshes.addLocalTransforms(builder, localTransformRef);\r\n  TFB.Meshes.addMaterials(builder, materialsRef);\r\n  TFB.Meshes.addCircleExtrusions(builder, circleExtrusions);\r\n  TFB.Meshes.addMeshesItems(builder, meshesItemsOffset);\r\n  TFB.Meshes.addRepresentationIds(builder, reprLocalIdsOffset);\r\n  TFB.Meshes.addSampleIds(builder, sampleLocalIdsOffset);\r\n  TFB.Meshes.addMaterialIds(builder, materialLocalIdsOffset);\r\n  TFB.Meshes.addLocalTransformIds(builder, ltLocalIdsOffset);\r\n  TFB.Meshes.addGlobalTransformIds(builder, gtLocalIdsOffset);\r\n  const modelMesh = TFB.Meshes.endMeshes(builder);\r\n\r\n  // Metadata\r\n\r\n  let metadataOffset: number;\r\n  if (metadataToUpdate) {\r\n    const metadata = JSON.stringify(metadataToUpdate);\r\n    metadataOffset = builder.createString(metadata);\r\n  } else {\r\n    const metadata = model.metadata() as string;\r\n    metadataOffset = builder.createString(metadata);\r\n  }\r\n\r\n  // Attributes\r\n\r\n  // Update or copy existing attributes\r\n\r\n  const prevAttrLength = model.attributesLength();\r\n  const attributesOffsets: number[] = [];\r\n  const uniqueAttributes = new Set<string>();\r\n\r\n  const categoriesOffsets: number[] = [];\r\n  const guidsOffsets: number[] = [];\r\n  const guidsItems: number[] = [];\r\n\r\n  // TODO: Do we need to change guid items to be the index, not the local id?\r\n  const guidsIndicesById = new Map<number, number>();\r\n  for (let i = 0; i < model.guidsItemsLength(); i++) {\r\n    const guidLocalId = model.guidsItems(i) as number;\r\n    guidsIndicesById.set(guidLocalId, i);\r\n  }\r\n\r\n  for (let i = 0; i < prevAttrLength; i++) {\r\n    const currentId = model.localIds(i) as number;\r\n    if (itemsToDelete.has(currentId)) {\r\n      continue;\r\n    }\r\n    const current = model.attributes(i) as TFB.Attribute;\r\n    const dataOffsets: number[] = [];\r\n\r\n    const needsUpdate = itemsToUpdate.has(currentId);\r\n\r\n    if (needsUpdate) {\r\n      const updated = itemsToUpdate.get(currentId) as ET.RawItemData;\r\n      // Category\r\n      categoriesOffsets.push(builder.createSharedString(updated.category));\r\n\r\n      // Guid\r\n      if (updated.guid) {\r\n        guidsOffsets.push(builder.createSharedString(updated.guid));\r\n        guidsItems.push(currentId);\r\n      }\r\n\r\n      // Attributes\r\n      for (const attrName in updated.data) {\r\n        const { value, type } = updated.data[attrName];\r\n        const attrString = JSON.stringify([attrName, value, type]);\r\n        uniqueAttributes.add(attrString);\r\n        const dataOffset = builder.createSharedString(attrString);\r\n        dataOffsets.push(dataOffset);\r\n      }\r\n    } else {\r\n      // Category\r\n      const currentCategory = model.categories(i) as string;\r\n      categoriesOffsets.push(builder.createSharedString(currentCategory));\r\n\r\n      // Guid\r\n      const guidIndex = guidsIndicesById.get(currentId);\r\n      if (guidIndex !== undefined) {\r\n        const guid = model.guids(guidIndex) as string;\r\n        // console.log(guid);\r\n        guidsOffsets.push(builder.createSharedString(guid));\r\n        guidsItems.push(currentId);\r\n      }\r\n\r\n      // Attributes\r\n      const dataLength = current.dataLength();\r\n      for (let j = 0; j < dataLength; j++) {\r\n        const currentData = current.data(j) as string;\r\n        uniqueAttributes.add(currentData);\r\n        const dataOffset = builder.createSharedString(currentData);\r\n        dataOffsets.push(dataOffset);\r\n      }\r\n    }\r\n    const dataOffset = TFB.Attribute.createDataVector(builder, dataOffsets);\r\n    const attributeOffset = TFB.Attribute.createAttribute(builder, dataOffset);\r\n    attributesOffsets.push(attributeOffset);\r\n  }\r\n\r\n  // Create new attributes\r\n\r\n  for (const [currentId, attributes] of itemsToCreate) {\r\n    if (itemsToDelete.has(currentId)) {\r\n      continue;\r\n    }\r\n\r\n    // Category\r\n    categoriesOffsets.push(builder.createSharedString(attributes.category));\r\n\r\n    // Guid\r\n    if (attributes.guid) {\r\n      console.log(attributes.guid);\r\n      guidsOffsets.push(builder.createSharedString(attributes.guid));\r\n      guidsItems.push(currentId);\r\n    }\r\n\r\n    const dataOffsets: number[] = [];\r\n    for (const attrName in attributes.data) {\r\n      const { value, type } = attributes.data[attrName];\r\n      const attrString = JSON.stringify([attrName, value, type]);\r\n      uniqueAttributes.add(attrString);\r\n      const dataOffset = builder.createSharedString(attrString);\r\n      dataOffsets.push(dataOffset);\r\n    }\r\n    const dataOffset = TFB.Attribute.createDataVector(builder, dataOffsets);\r\n    const attributeOffset = TFB.Attribute.createAttribute(builder, dataOffset);\r\n    attributesOffsets.push(attributeOffset);\r\n  }\r\n\r\n  const attributesVector = TFB.Model.createAttributesVector(\r\n    builder,\r\n    attributesOffsets,\r\n  );\r\n\r\n  // UniqueAttributes\r\n  const uniqueAttrsOffsets: number[] = [];\r\n  for (const attr of uniqueAttributes) {\r\n    const dataOffset = builder.createSharedString(attr);\r\n    uniqueAttrsOffsets.push(dataOffset);\r\n  }\r\n  const uniqueAttributesVector = TFB.Model.createUniqueAttributesVector(\r\n    builder,\r\n    uniqueAttrsOffsets,\r\n  );\r\n\r\n  // RelationNames\r\n\r\n  const relationNamesLength = model.relationNamesLength();\r\n  const relationNamesOffsets: number[] = [];\r\n  for (let i = 0; i < relationNamesLength; i++) {\r\n    const current = model.relationNames(i) as string;\r\n    const relationNameOffset = builder.createSharedString(current);\r\n    relationNamesOffsets.push(relationNameOffset);\r\n  }\r\n\r\n  const relNamesVector = TFB.Model.createRelationNamesVector(\r\n    builder,\r\n    relationNamesOffsets,\r\n  );\r\n\r\n  // LocalIds\r\n\r\n  const localIdsVector = TFB.Model.createLocalIdsVector(builder, finalItemIds);\r\n\r\n  // Categories\r\n\r\n  const categoriesVector = TFB.Model.createCategoriesVector(\r\n    builder,\r\n    categoriesOffsets,\r\n  );\r\n\r\n  // Relations\r\n\r\n  // Update or copy existing Relations\r\n\r\n  // TODO: If the user deletes a relation, it can't create it again until the model is saved\r\n  // because delete requests will prevent any new create or update requests\r\n  // Mostly relations are updated, not deleted. Is this a problem?\r\n\r\n  const relsOffsets: number[] = [];\r\n  const newRelationsItems: number[] = [];\r\n  const existingRelations = new Set<number>();\r\n  const relItemsIndices = model.relationsItemsLength();\r\n\r\n  const saveRelation = (relationData: ET.RawRelationData) => {\r\n    const dataOffsets: number[] = [];\r\n    for (const name in relationData.data) {\r\n      const ids = relationData.data[name];\r\n\r\n      // Filter out deleted items\r\n      const filteredIds = ids.filter((id) => !itemsToDelete.has(id));\r\n\r\n      // Skip empty relations\r\n      if (!filteredIds.length) continue;\r\n      const dataOffset = builder.createSharedString(\r\n        JSON.stringify([name, ...filteredIds]),\r\n      );\r\n      dataOffsets.push(dataOffset);\r\n    }\r\n    const dataOffset = TFB.Relation.createDataVector(builder, dataOffsets);\r\n    const relOffset = TFB.Relation.createRelation(builder, dataOffset);\r\n    relsOffsets.push(relOffset);\r\n  };\r\n\r\n  for (let i = 0; i < relItemsIndices; i++) {\r\n    const localId = model.relationsItems(i) as number;\r\n    existingRelations.add(localId);\r\n    if (\r\n      itemsToDelete.has(localId) ||\r\n      relationsToDelete.has(localId) ||\r\n      !localIdToIndex.has(localId)\r\n    ) {\r\n      continue;\r\n    }\r\n\r\n    // Relations\r\n    let relationData: ET.RawRelationData;\r\n    if (relationsToUpdate.has(localId)) {\r\n      relationData = relationsToUpdate.get(localId) as ET.RawRelationData;\r\n    } else {\r\n      const current = model.relations(i) as TFB.Relation;\r\n      relationData = EditUtils.getRelationData(current);\r\n    }\r\n\r\n    saveRelation(relationData);\r\n\r\n    // RelationsItems\r\n    newRelationsItems.push(localId);\r\n  }\r\n\r\n  // Create new Relations\r\n\r\n  for (const [localId, newRelationData] of relationsToCreate) {\r\n    if (\r\n      itemsToDelete.has(localId) ||\r\n      relationsToDelete.has(localId) ||\r\n      existingRelations.has(localId) // the relation already exists\r\n    ) {\r\n      continue;\r\n    }\r\n\r\n    let relationData: ET.RawRelationData;\r\n    if (relationsToUpdate.has(localId)) {\r\n      relationData = relationsToUpdate.get(localId) as ET.RawRelationData;\r\n    } else {\r\n      relationData = newRelationData;\r\n    }\r\n\r\n    saveRelation(relationData);\r\n\r\n    newRelationsItems.push(localId);\r\n  }\r\n\r\n  existingRelations.clear();\r\n\r\n  const relsVector = TFB.Model.createRelationsVector(builder, relsOffsets);\r\n\r\n  const relIndicesVector = TFB.Model.createRelationsItemsVector(\r\n    builder,\r\n    newRelationsItems,\r\n  );\r\n\r\n  // GuidsItems\r\n\r\n  const guidsItemsVector = TFB.Model.createGuidsItemsVector(\r\n    builder,\r\n    guidsItems,\r\n  );\r\n\r\n  // Guids\r\n\r\n  const guidsVector = TFB.Model.createGuidsVector(builder, guidsOffsets);\r\n\r\n  // SpatialStructure\r\n\r\n  let spatialStructureOffset: number | null = null;\r\n  if (spatialStructureToUpdate) {\r\n    spatialStructureOffset = createSpatialStructure(\r\n      builder,\r\n      spatialStructureToUpdate,\r\n    );\r\n  } else {\r\n    const spatialStruture = model.spatialStructure();\r\n    spatialStructureOffset = copySpatialStructure(builder, spatialStruture);\r\n  }\r\n\r\n  // Guid\r\n\r\n  const guidLength = model.guid() as string;\r\n  const guidRef = builder.createString(guidLength);\r\n\r\n  // Model\r\n\r\n  TFB.Model.startModel(builder);\r\n  TFB.Model.addMeshes(builder, modelMesh);\r\n  TFB.Model.addMetadata(builder, metadataOffset);\r\n  TFB.Model.addAttributes(builder, attributesVector);\r\n  TFB.Model.addUniqueAttributes(builder, uniqueAttributesVector);\r\n  TFB.Model.addRelationNames(builder, relNamesVector);\r\n  TFB.Model.addLocalIds(builder, localIdsVector);\r\n  TFB.Model.addCategories(builder, categoriesVector);\r\n  TFB.Model.addRelationsItems(builder, relIndicesVector);\r\n  TFB.Model.addRelations(builder, relsVector);\r\n  TFB.Model.addGuidsItems(builder, guidsItemsVector);\r\n  TFB.Model.addGuids(builder, guidsVector);\r\n  if (spatialStructureOffset !== null) {\r\n    TFB.Model.addSpatialStructure(builder, spatialStructureOffset);\r\n  }\r\n  TFB.Model.addGuid(builder, guidRef);\r\n  TFB.Model.addMaxLocalId(builder, newMaxLocalId);\r\n  const outData = TFB.Model.endModel(builder);\r\n\r\n  builder.finish(outData);\r\n  const outBytes = builder.asUint8Array();\r\n\r\n  builder.clear();\r\n\r\n  // const byteBuffer = new FB.ByteBuffer(outBytes);\r\n  // const readModel = TFB.Model.getRootAsModel(byteBuffer);\r\n  // const result2 = {};\r\n  // getObject(readModel, result2);\r\n  // console.log(result2);\r\n\r\n  const result = raw ? outBytes : pako.deflate(outBytes);\r\n\r\n  // We need to find out which items were affected by the edit\r\n  // Let's see what samples were edited or deleted\r\n\r\n  const affectedItems = new Set(finalItemIds);\r\n  const editedSamples = new Set<number>(finalSampleIds);\r\n  getAffectedItems(requests, editedSamples, meshes, model, affectedItems);\r\n\r\n  return { model: result, items: Array.from(affectedItems) };\r\n}\r\n","import * as FB from \"flatbuffers\";\r\nimport pako from \"pako\";\r\nimport * as TFB from \"../../Schema\";\r\nimport * as ET from \"./edit-types\";\r\nimport { VirtualFragmentsModel } from \"../../FragmentsModels/src/virtual-model\";\r\nimport { ItemAttribute, ItemData } from \"../../FragmentsModels\";\r\n\r\nexport const DELTA_MODEL_ID = \"-DELTA-MODEL-\";\r\n\r\nexport function getRootModelId(modelId: string) {\r\n  if (modelId.includes(DELTA_MODEL_ID)) {\r\n    return modelId.substring(0, modelId.indexOf(DELTA_MODEL_ID));\r\n  }\r\n  return modelId;\r\n}\r\n\r\nexport function getModelFromBuffer(bytes: Uint8Array, raw: boolean): TFB.Model {\r\n  const byteBuffer = new FB.ByteBuffer(raw ? bytes : pako.inflate(bytes));\r\n  const readModel = TFB.Model.getRootAsModel(byteBuffer);\r\n  return readModel;\r\n}\r\n\r\nexport function getSampleData(sample: TFB.Sample): ET.RawSample {\r\n  return {\r\n    item: sample.item(),\r\n    localTransform: sample.localTransform(),\r\n    material: sample.material(),\r\n    representation: sample.representation(),\r\n  };\r\n}\r\n\r\nexport function getTransformData(lt: TFB.Transform) {\r\n  const position = lt.position()!;\r\n  const xDir = lt.xDirection()!;\r\n  const yDir = lt.yDirection()!;\r\n  const transform = {\r\n    position: [position.x(), position.y(), position.z()],\r\n    xDirection: [xDir.x(), xDir.y(), xDir.z()],\r\n    yDirection: [yDir.x(), yDir.y(), yDir.z()],\r\n  };\r\n  return transform;\r\n}\r\n\r\nexport function getRelationData(relation: TFB.Relation) {\r\n  const result: ET.RawRelationData = {\r\n    data: {},\r\n  };\r\n  const dataLength = relation.dataLength();\r\n  for (let j = 0; j < dataLength; j++) {\r\n    const currentData = relation.data(j) as string;\r\n    const [name, ...ids]: [string, ...number[]] = JSON.parse(currentData);\r\n    result.data[name] = ids;\r\n  }\r\n  return result;\r\n}\r\n\r\nexport function getMaterialData(material: TFB.Material): ET.RawMaterial {\r\n  return {\r\n    r: material.r(),\r\n    g: material.g(),\r\n    b: material.b(),\r\n    a: material.a(),\r\n    renderedFaces: material.renderedFaces(),\r\n    stroke: material.stroke(),\r\n  };\r\n}\r\n\r\nexport function getRepresentationData(\r\n  representation: TFB.Representation,\r\n): ET.RawRepresentation {\r\n  const bbox = representation.bbox()!;\r\n  const min = bbox.min()!;\r\n  const max = bbox.max()!;\r\n  return {\r\n    id: representation.id(),\r\n    bbox: [min.x(), min.y(), min.z(), max.x(), max.y(), max.z()],\r\n    representationClass: representation.representationClass(),\r\n  };\r\n}\r\n\r\nexport function getShellData(shell: TFB.Shell): ET.RawShell {\r\n  const points: number[][] = [];\r\n  for (let i = 0; i < shell.pointsLength(); i++) {\r\n    const point = shell.points(i)!;\r\n    points.push([point.x(), point.y(), point.z()]);\r\n  }\r\n\r\n  const profiles = new Map<number, number[]>();\r\n  for (let i = 0; i < shell.profilesLength(); i++) {\r\n    const profile = shell.profiles(i)!;\r\n    const indices = Array.from(profile.indicesArray() || []);\r\n    profiles.set(i, indices);\r\n  }\r\n\r\n  const holes = new Map<number, number[][]>();\r\n  for (let i = 0; i < shell.holesLength(); i++) {\r\n    const hole = shell.holes(i)!;\r\n    const indices = Array.from(hole.indicesArray() || []);\r\n    const profileId = hole.profileId();\r\n    if (!holes.has(profileId)) {\r\n      holes.set(profileId, []);\r\n    }\r\n    holes.get(profileId)!.push(indices);\r\n  }\r\n\r\n  const bigProfiles = new Map<number, number[]>();\r\n  for (let i = 0; i < shell.bigProfilesLength(); i++) {\r\n    const profile = shell.bigProfiles(i)!;\r\n    const indices = Array.from(profile.indicesArray() || []);\r\n    bigProfiles.set(i, indices);\r\n  }\r\n\r\n  const bigHoles = new Map<number, number[][]>();\r\n  for (let i = 0; i < shell.bigHolesLength(); i++) {\r\n    const hole = shell.bigHoles(i)!;\r\n    const indices = Array.from(hole.indicesArray() || []);\r\n    const profileId = hole.profileId();\r\n    if (!bigHoles.has(profileId)) {\r\n      bigHoles.set(profileId, []);\r\n    }\r\n    bigHoles.get(profileId)!.push(indices);\r\n  }\r\n\r\n  const profilesFaceIds = Array.from(shell.profilesFaceIdsArray() || []);\r\n\r\n  return {\r\n    points,\r\n    profiles,\r\n    holes,\r\n    bigProfiles,\r\n    bigHoles,\r\n    type: shell.type(),\r\n    profilesFaceIds,\r\n  };\r\n}\r\n\r\nexport function getCircleExtrusionData(\r\n  circleExtrusion: TFB.CircleExtrusion,\r\n): ET.RawCircleExtrusion {\r\n  const result: ET.RawCircleExtrusion = {\r\n    radius: [],\r\n    axes: [],\r\n  };\r\n  const radius = circleExtrusion.radiusArray() as Float64Array;\r\n  result.radius = Array.from(radius);\r\n  const axesLength = circleExtrusion.axesLength();\r\n\r\n  for (let i = 0; i < axesLength; i++) {\r\n    const axis = circleExtrusion.axes(i)!;\r\n    const wiresLength = axis.wiresLength();\r\n    const wires: number[][] = [];\r\n    for (let j = 0; j < wiresLength; j++) {\r\n      const wire = axis.wires(j)!;\r\n      const p1 = wire.p1()!;\r\n      const p2 = wire.p2()!;\r\n      wires.push([p1.x(), p1.y(), p1.z(), p2.x(), p2.y(), p2.z()]);\r\n    }\r\n\r\n    const orderLength = axis.orderLength();\r\n    const order: number[] = [];\r\n    for (let j = 0; j < orderLength; j++) {\r\n      order.push(axis.order(j)!);\r\n    }\r\n\r\n    const partsLength = axis.partsLength();\r\n    const parts: TFB.AxisPartClass[] = [];\r\n    for (let j = 0; j < partsLength; j++) {\r\n      parts.push(axis.parts(j)!);\r\n    }\r\n\r\n    const wireSetsLength = axis.wireSetsLength();\r\n    const wireSets: number[][] = [];\r\n    for (let j = 0; j < wireSetsLength; j++) {\r\n      const wireSet = axis.wireSets(j)!;\r\n      const psLength = wireSet.psLength();\r\n      const ps: number[] = [];\r\n      for (let k = 0; k < psLength; k++) {\r\n        const p = wireSet.ps(k)!;\r\n        ps.push(p.x(), p.y(), p.z());\r\n      }\r\n      wireSets.push(ps);\r\n    }\r\n\r\n    const circleCurvesLength = axis.circleCurvesLength();\r\n    const circleCurves: {\r\n      aperture: number;\r\n      position: number[];\r\n      radius: number;\r\n      xDirection: number[];\r\n      yDirection: number[];\r\n    }[] = [];\r\n    for (let j = 0; j < circleCurvesLength; j++) {\r\n      const circleCurve = axis.circleCurves(j)!;\r\n      const aperture = circleCurve.aperture();\r\n      const position = circleCurve.position()!;\r\n      const px = position.x();\r\n      const py = position.y();\r\n      const pz = position.z();\r\n      const radius = circleCurve.radius();\r\n      const xDirection = circleCurve.xDirection()!;\r\n      const dx = xDirection.x();\r\n      const dy = xDirection.y();\r\n      const dz = xDirection.z();\r\n      const yDirection = circleCurve.yDirection()!;\r\n      const dyx = yDirection.x();\r\n      const dyy = yDirection.y();\r\n      const dyz = yDirection.z();\r\n      circleCurves.push({\r\n        aperture,\r\n        position: [px, py, pz],\r\n        radius,\r\n        xDirection: [dx, dy, dz],\r\n        yDirection: [dyx, dyy, dyz],\r\n      });\r\n    }\r\n\r\n    result.axes.push({\r\n      wires,\r\n      order,\r\n      parts,\r\n      wireSets,\r\n      circleCurves,\r\n    });\r\n  }\r\n  return result;\r\n}\r\n\r\nexport function getMaterialsIds(model: TFB.Model) {\r\n  const meshes = model.meshes()!;\r\n  return meshes.materialIdsArray() || [];\r\n}\r\n\r\nexport function getMaterials(model: TFB.Model, ids?: Iterable<number>) {\r\n  const meshes = model.meshes()!;\r\n  const source = ids || meshes.materialIdsArray()!;\r\n  const idsSet = new Set(source);\r\n\r\n  const tempMaterial = new TFB.Material();\r\n  const materials = new Map<number, ET.RawMaterial>();\r\n  for (let i = 0; i < meshes.materialsLength(); i++) {\r\n    const matLocalId = meshes.materialIds(i)!;\r\n    if (!idsSet.has(matLocalId)) {\r\n      continue;\r\n    }\r\n    meshes.materials(i, tempMaterial);\r\n    const material = getMaterialData(tempMaterial);\r\n    materials.set(matLocalId, material);\r\n  }\r\n  return materials;\r\n}\r\n\r\nexport function getRepresentationsIds(model: TFB.Model) {\r\n  const meshes = model.meshes()!;\r\n  return meshes.representationIdsArray() || [];\r\n}\r\n\r\nexport function getRepresentations(model: TFB.Model, ids?: Iterable<number>) {\r\n  const meshes = model.meshes()!;\r\n  const source = ids || meshes.representationIdsArray()!;\r\n  const idsSet = new Set(source);\r\n\r\n  const representations = new Map<number, ET.RawRepresentation>();\r\n  const tempRepresentation = new TFB.Representation();\r\n  for (let i = 0; i < meshes.representationsLength(); i++) {\r\n    const representationLocalId = meshes.representationIds(i)!;\r\n    if (!idsSet.has(representationLocalId)) {\r\n      continue;\r\n    }\r\n    meshes.representations(i, tempRepresentation);\r\n    const repr = getRepresentationData(tempRepresentation);\r\n\r\n    if (repr.representationClass === TFB.RepresentationClass.SHELL) {\r\n      const fbshell = meshes.shells(repr.id!)!;\r\n      const shell = getShellData(fbshell);\r\n      repr.geometry = shell;\r\n    } else if (\r\n      repr.representationClass === TFB.RepresentationClass.CIRCLE_EXTRUSION\r\n    ) {\r\n      const fbcirclExtrusion = meshes.circleExtrusions(repr.id!)!;\r\n      const circleExtrusion = getCircleExtrusionData(fbcirclExtrusion);\r\n      repr.geometry = circleExtrusion;\r\n    }\r\n\r\n    representations.set(representationLocalId, repr);\r\n  }\r\n\r\n  return representations;\r\n}\r\n\r\nexport function getGeometryIndicesFromRepresentations(\r\n  model: TFB.Model,\r\n  ids?: Iterable<number>,\r\n) {\r\n  const meshes = model.meshes()!;\r\n  const source = ids || meshes.representationIdsArray()!;\r\n  const idsSet = new Set(source);\r\n\r\n  const tempRepresentation = new TFB.Representation();\r\n  const shells = new Set<number>();\r\n  const rebars = new Set<number>();\r\n\r\n  for (let i = 0; i < meshes.representationsLength(); i++) {\r\n    const representationLocalId = meshes.representationIds(i)!;\r\n    if (!idsSet.has(representationLocalId)) {\r\n      continue;\r\n    }\r\n    meshes.representations(i, tempRepresentation);\r\n    const repr = getRepresentationData(tempRepresentation);\r\n\r\n    if (repr.representationClass === TFB.RepresentationClass.SHELL) {\r\n      shells.add(repr.id!);\r\n    } else if (\r\n      repr.representationClass === TFB.RepresentationClass.CIRCLE_EXTRUSION\r\n    ) {\r\n      rebars.add(repr.id!);\r\n    } else {\r\n      throw new Error(\"Rebars not supported yet\");\r\n    }\r\n  }\r\n\r\n  return {\r\n    shellsIndices: shells,\r\n    rebarsIndices: rebars,\r\n  };\r\n}\r\n\r\nexport function getSerializedAttributes(attributes: ItemData) {\r\n  const datas: string[] = [];\r\n  for (const name in attributes) {\r\n    if (name[0] === \"_\") {\r\n      continue;\r\n    }\r\n    const current = attributes[name];\r\n    if (Array.isArray(current)) {\r\n      continue;\r\n    }\r\n    const value = current.value;\r\n    const type = current.type;\r\n    const serialized = JSON.stringify([name, value, type]);\r\n    datas.push(serialized);\r\n  }\r\n  return datas;\r\n}\r\n\r\nexport function itemDataToRawItemData(item: ItemData): ET.RawItemData {\r\n  const categoryAttr = item._category as ItemAttribute;\r\n  if (!categoryAttr) {\r\n    throw new Error(\"Category is required\");\r\n  }\r\n  const category = categoryAttr.value;\r\n  const guidAttr = item._guid as ItemAttribute;\r\n  const data: Record<string, ItemAttribute> = {};\r\n  for (const name in item) {\r\n    if (name[0] === \"_\") {\r\n      continue;\r\n    }\r\n    const attr = item[name];\r\n    if (Array.isArray(attr)) {\r\n      continue;\r\n    }\r\n    data[name] = attr;\r\n  }\r\n  const guid = guidAttr ? guidAttr.value : undefined;\r\n  return {\r\n    data,\r\n    category,\r\n    guid,\r\n  };\r\n}\r\n\r\nexport function getLocalTransformsIds(model: TFB.Model) {\r\n  const meshes = model.meshes()!;\r\n  return meshes.localTransformIdsArray() || [];\r\n}\r\n\r\nexport function getLocalTransforms(model: TFB.Model, ids?: Iterable<number>) {\r\n  const meshes = model.meshes()!;\r\n  const source = ids || meshes.localTransformIdsArray()!;\r\n  const idsSet = new Set(source);\r\n\r\n  const localTransforms = new Map<number, ET.RawTransformData>();\r\n  const tempTranform = new TFB.Transform();\r\n  for (let i = 0; i < meshes.localTransformsLength(); i++) {\r\n    const localTransformLocalId = meshes.localTransformIds(i)!;\r\n    if (!idsSet.has(localTransformLocalId)) {\r\n      continue;\r\n    }\r\n    meshes.localTransforms(i, tempTranform);\r\n    const lt = getTransformData(tempTranform);\r\n    localTransforms.set(localTransformLocalId, lt);\r\n  }\r\n  return localTransforms;\r\n}\r\n\r\nexport function getGlobalTransformsIds(model: TFB.Model) {\r\n  const meshes = model.meshes()!;\r\n  return meshes.globalTransformIdsArray() || [];\r\n}\r\n\r\nexport function getGlobalTransforms(model: TFB.Model, ids?: Iterable<number>) {\r\n  const meshes = model.meshes()!;\r\n  let source: Set<number> | null = null;\r\n  if (ids) {\r\n    source = new Set(ids);\r\n  } else {\r\n    source = new Set(meshes.globalTransformIdsArray()!);\r\n  }\r\n\r\n  const globalTransforms = new Map<number, ET.RawGlobalTransformData>();\r\n  const tempTransform = new TFB.Transform();\r\n  const gtLength = meshes.globalTransformsLength();\r\n  for (let i = 0; i < gtLength; i++) {\r\n    meshes.globalTransforms(i, tempTransform);\r\n    const localId = meshes.globalTransformIds(i)!;\r\n    const idIndex = meshes.meshesItems(i)!;\r\n    const itemId = model.localIds(idIndex)!;\r\n    if (!source.has(localId)) continue;\r\n    const gtData = getTransformData(tempTransform);\r\n    globalTransforms.set(localId, { ...gtData, itemId });\r\n  }\r\n\r\n  return globalTransforms;\r\n}\r\n\r\nexport function getSamplesIds(model: TFB.Model) {\r\n  const meshes = model.meshes()!;\r\n  const samples = meshes.sampleIdsArray() || [];\r\n  return samples;\r\n}\r\n\r\nexport function getSamples(model: TFB.Model, ids?: Iterable<number>) {\r\n  const meshes = model.meshes()!;\r\n  const source = ids || meshes.sampleIdsArray()!;\r\n  const idsSet = new Set(source);\r\n\r\n  const samples = new Map<number, ET.RawSample>();\r\n  const tempSample = new TFB.Sample();\r\n  for (let i = 0; i < meshes.samplesLength(); i++) {\r\n    const sampleLocalId = meshes.sampleIds(i)!;\r\n    if (!idsSet.has(sampleLocalId)) {\r\n      continue;\r\n    }\r\n    meshes.samples(i, tempSample);\r\n\r\n    // We substitute indices by local ids to get the items the sample references\r\n\r\n    const sample = getSampleData(tempSample);\r\n\r\n    sample.item = meshes.globalTransformIds(sample.item)!;\r\n    sample.material = meshes.materialIds(sample.material)!;\r\n    sample.representation = meshes.representationIds(sample.representation)!;\r\n    sample.localTransform = meshes.localTransformIds(sample.localTransform)!;\r\n\r\n    samples.set(sampleLocalId, sample);\r\n  }\r\n  return samples;\r\n}\r\n\r\nexport function getItemsIds(model: TFB.Model) {\r\n  return model.localIdsArray()!;\r\n}\r\n\r\nexport function getItems(model: TFB.Model, itemIds?: Iterable<number>) {\r\n  let source = new Set<number>();\r\n  if (itemIds) {\r\n    source = new Set(itemIds);\r\n  } else {\r\n    for (let i = 0; i < model.localIdsLength(); i++) {\r\n      source.add(i);\r\n    }\r\n  }\r\n\r\n  const items = new Map<number, ET.RawItemData>();\r\n\r\n  for (const i of source) {\r\n    const localId = model.localIds(i)!;\r\n    const category = model.categories(i)!;\r\n    const guid = model.guids(i)!;\r\n    const attrsData = model.attributes(i)!;\r\n    const data: Record<string, ItemAttribute> = {};\r\n    for (let j = 0; j < attrsData.dataLength(); j++) {\r\n      const attrString = attrsData.data(j)!;\r\n      const [name, value, type] = JSON.parse(attrString);\r\n      data[name] = { value, type };\r\n    }\r\n    items.set(localId, { data, category, guid });\r\n  }\r\n\r\n  return items;\r\n}\r\n\r\nexport function getGlobalTranformsIdsOfItems(model: TFB.Model, ids: number[]) {\r\n  const meshes = model.meshes()!;\r\n  const source = new Set(ids);\r\n  const globalIds = new Set<number>();\r\n  for (let i = 0; i < meshes.meshesItemsLength(); i++) {\r\n    const localIdIndex = meshes.meshesItems(i)!;\r\n    const localId = model.localIds(localIdIndex)!;\r\n    if (source.has(localId)) {\r\n      globalIds.add(meshes.globalTransformIds(i)!);\r\n    }\r\n  }\r\n  return Array.from(globalIds);\r\n}\r\n\r\nexport function getElementsData(\r\n  vModel: VirtualFragmentsModel,\r\n  ids: Iterable<number>,\r\n) {\r\n  const model = vModel.data;\r\n  const meshes = model.meshes()!;\r\n\r\n  const result: { [id: number]: ET.ElementData } = {};\r\n\r\n  const idSet = new Set(ids);\r\n\r\n  const tempTransform = new TFB.Transform();\r\n  const tempMaterial = new TFB.Material();\r\n  const tempRepresentation = new TFB.Representation();\r\n  const tempShell = new TFB.Shell();\r\n\r\n  for (let i = 0; i < meshes.samplesLength(); i++) {\r\n    const sample = meshes.samples(i)!;\r\n    const gtIndex = sample.item()!;\r\n\r\n    const idIndex = meshes.meshesItems(gtIndex)!;\r\n    const localId = model.localIds(idIndex)!;\r\n    if (!idSet.has(localId)) {\r\n      continue;\r\n    }\r\n\r\n    if (!result[localId]) {\r\n      result[localId] = {\r\n        samples: {},\r\n        localTransforms: {},\r\n        globalTransforms: {},\r\n        representations: {},\r\n        materials: {},\r\n      };\r\n    }\r\n    const current = result[localId];\r\n\r\n    const ltIndex = sample.localTransform()!;\r\n    const materialIndex = sample.material()!;\r\n    const representationIndex = sample.representation()!;\r\n\r\n    const sampleLocalId = meshes.sampleIds(i)!;\r\n    const gtId = meshes.globalTransformIds(gtIndex)!;\r\n    const ltId = meshes.localTransformIds(ltIndex)!;\r\n    const materialId = meshes.materialIds(materialIndex)!;\r\n    const reprId = meshes.representationIds(representationIndex)!;\r\n\r\n    current.samples[sampleLocalId] = {\r\n      item: gtId,\r\n      localTransform: ltId,\r\n      material: materialId,\r\n      representation: reprId,\r\n    };\r\n\r\n    meshes.localTransforms(ltIndex, tempTransform);\r\n    current.localTransforms[ltId] = getTransformData(tempTransform);\r\n\r\n    meshes.globalTransforms(gtIndex, tempTransform);\r\n    const gTransform = getTransformData(tempTransform);\r\n    current.globalTransforms[gtId] = { ...gTransform, itemId: localId };\r\n\r\n    meshes.materials(materialIndex, tempMaterial);\r\n    current.materials[materialId] = getMaterialData(tempMaterial);\r\n\r\n    meshes.representations(representationIndex, tempRepresentation);\r\n\r\n    const repr = getRepresentationData(tempRepresentation);\r\n    if (repr.representationClass === TFB.RepresentationClass.SHELL) {\r\n      meshes.shells(repr.id!, tempShell);\r\n      const shell = getShellData(tempShell);\r\n      repr.geometry = shell;\r\n    }\r\n\r\n    current.representations[reprId] = repr;\r\n  }\r\n\r\n  const relIndicesById = new Map<number, number>();\r\n  for (let i = 0; i < model.relationsItemsLength(); i++) {\r\n    const relLocalId = model.relationsItems(i)!;\r\n    relIndicesById.set(relLocalId, i);\r\n  }\r\n\r\n  const localIdsToIndex = new Map<number, number>();\r\n  for (let i = 0; i < model.localIdsLength(); i++) {\r\n    const localId = model.localIds(i)!;\r\n    localIdsToIndex.set(localId, i);\r\n  }\r\n\r\n  return result;\r\n}\r\n","import * as ET from \"./edit-types\";\r\n\r\nexport function solveGtTempId(\r\n  sample: ET.RawGlobalTransformData,\r\n  key: \"itemId\",\r\n  tempIdsToLocalIds: Map<string, number>,\r\n) {\r\n  const value = sample[key];\r\n  if (typeof value === \"string\") {\r\n    const localId = tempIdsToLocalIds.get(value);\r\n    if (localId === undefined) {\r\n      throw new Error(`Malformed request: temp id ${sample[key]} not found`);\r\n    }\r\n    sample[key] = localId;\r\n  }\r\n}\r\n\r\nexport function solveSampleTempId(\r\n  sample: ET.SampleRequestData,\r\n  key: \"item\" | \"material\" | \"representation\" | \"localTransform\",\r\n  tempIdsToLocalIds: Map<string, number>,\r\n) {\r\n  const value = sample[key];\r\n  if (typeof value === \"string\") {\r\n    const localId = tempIdsToLocalIds.get(value);\r\n    if (localId === undefined) {\r\n      throw new Error(`Malformed request: temp id ${sample[key]} not found`);\r\n    }\r\n    sample[key] = localId;\r\n  }\r\n}\r\n\r\nexport function solveLocalIdTempId(\r\n  request: ET.EditRequest,\r\n  key: \"localId\",\r\n  tempIdsToLocalIds: Map<string, number>,\r\n) {\r\n  const value = request[key];\r\n  if (typeof value === \"string\") {\r\n    const localId = tempIdsToLocalIds.get(value);\r\n    if (localId === undefined) {\r\n      throw new Error(`Malformed request: temp id ${request[key]} not found`);\r\n    }\r\n    request[key] = localId;\r\n  }\r\n}\r\n","import * as ET from \"./edit-types\";\r\nimport * as TIS from \"./temp-id-solvers\";\r\n\r\nexport function solveIds(requests: ET.EditRequest[], nextId: number) {\r\n  // Temp ids allow to reference items that are not yet created\r\n  // and therefore don't have a known local id when making the request\r\n  // We only need them for SAMPLES, because samples are the only items that\r\n  // reference other items in meshes\r\n  // We will also give a local id to all the items that don't have one\r\n\r\n  const tempIds = new Map<string, number>();\r\n\r\n  const result: number[] = [];\r\n\r\n  for (const request of requests) {\r\n    if (request.localId !== undefined) {\r\n      continue;\r\n    }\r\n    const newId = nextId++;\r\n    if (request.tempId) {\r\n      tempIds.set(request.tempId, newId);\r\n    }\r\n    request.localId = newId;\r\n    result.push(newId);\r\n  }\r\n\r\n  // Now, let's resolve the temp ids to local ids for the samples\r\n\r\n  for (const request of requests) {\r\n    if (\r\n      request.type === ET.EditRequestType.UPDATE_SAMPLE ||\r\n      request.type === ET.EditRequestType.CREATE_SAMPLE\r\n    ) {\r\n      const sample = request.data as ET.SampleRequestData;\r\n      TIS.solveSampleTempId(sample, \"item\", tempIds);\r\n      TIS.solveSampleTempId(sample, \"material\", tempIds);\r\n      TIS.solveSampleTempId(sample, \"representation\", tempIds);\r\n      TIS.solveSampleTempId(sample, \"localTransform\", tempIds);\r\n      continue;\r\n    }\r\n    if (\r\n      request.type === ET.EditRequestType.UPDATE_GLOBAL_TRANSFORM ||\r\n      request.type === ET.EditRequestType.CREATE_GLOBAL_TRANSFORM\r\n    ) {\r\n      const gt = request.data as ET.RawGlobalTransformData;\r\n      TIS.solveGtTempId(gt, \"itemId\", tempIds);\r\n      continue;\r\n    }\r\n    TIS.solveLocalIdTempId(request, \"localId\", tempIds);\r\n  }\r\n\r\n  tempIds.clear();\r\n\r\n  return result;\r\n}\r\n","import { EditKey, EditRequest, EditRequestType } from \"./edit-types\";\r\n\r\nexport function applyChangesToRawData(\r\n  actions: EditRequest[],\r\n  rawData: Map<number, any>,\r\n  type: EditKey,\r\n  filter?: Set<number>,\r\n) {\r\n  const createType = EditRequestType[`CREATE_${type}`];\r\n  const updateType = EditRequestType[`UPDATE_${type}`];\r\n  const deleteType = EditRequestType[`DELETE_${type}`];\r\n  if (actions) {\r\n    for (const action of actions) {\r\n      if (action.type === createType || action.type === updateType) {\r\n        if (filter && !filter.has(action.localId as number)) {\r\n          continue;\r\n        }\r\n        rawData.set(action.localId as number, action.data);\r\n        continue;\r\n      }\r\n      if (action.type === deleteType) {\r\n        rawData.delete(action.localId as number);\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n// Used for metadata and spatial structure, which have a different structure than the other data\r\nexport function applyChangesToSpecialData(\r\n  actions: EditRequest[],\r\n  key: \"METADATA\" | \"SPATIAL_STRUCTURE\",\r\n) {\r\n  const updateType = EditRequestType[`UPDATE_${key}`];\r\n  if (actions) {\r\n    for (let i = actions.length - 1; i >= 0; i--) {\r\n      const action = actions[i];\r\n      if (action.type === updateType) {\r\n        return JSON.parse(JSON.stringify(action.data));\r\n      }\r\n    }\r\n  }\r\n  return null;\r\n}\r\n\r\nexport function applyChangesToIds(\r\n  actions: EditRequest[],\r\n  ids: number[] | Uint32Array | Set<number>,\r\n  key: EditKey,\r\n  addCreatedElements: boolean,\r\n) {\r\n  const resultSet = new Set(ids);\r\n  const deleteType = EditRequestType[`DELETE_${key}`];\r\n  const createType = EditRequestType[`CREATE_${key}`];\r\n  if (actions) {\r\n    for (const action of actions) {\r\n      if (action.type === deleteType) {\r\n        resultSet.delete(action.localId as number);\r\n        continue;\r\n      }\r\n      if (addCreatedElements && action.type === createType) {\r\n        resultSet.add(action.localId as number);\r\n      }\r\n    }\r\n    return Array.from(resultSet);\r\n  }\r\n  return ids;\r\n}\r\n","import { edit } from \"./edit-function\";\r\nimport { newModel } from \"./new-model-function\";\r\nimport * as FF from \"./fetch-functions\";\r\nimport { solveIds } from \"./id-solver\";\r\nimport {\r\n  applyChangesToRawData,\r\n  applyChangesToIds,\r\n  applyChangesToSpecialData,\r\n} from \"./request-filterer\";\r\n\r\nexport class EditUtils {\r\n  static edit = edit;\r\n  static solveIds = solveIds;\r\n  static newModel = newModel;\r\n  static applyChangesToRawData = applyChangesToRawData;\r\n  static applyChangesToSpecialData = applyChangesToSpecialData;\r\n  static applyChangesToIds = applyChangesToIds;\r\n  static getModelFromBuffer = FF.getModelFromBuffer;\r\n  static getSampleData = FF.getSampleData;\r\n  static getTransformData = FF.getTransformData;\r\n  static getRelationData = FF.getRelationData;\r\n  static getMaterialData = FF.getMaterialData;\r\n  static getRepresentationData = FF.getRepresentationData;\r\n  static getShellData = FF.getShellData;\r\n  static getMaterialsIds = FF.getMaterialsIds;\r\n  static getMaterials = FF.getMaterials;\r\n  static getRepresentationsIds = FF.getRepresentationsIds;\r\n  static getRepresentations = FF.getRepresentations;\r\n  static getLocalTransformsIds = FF.getLocalTransformsIds;\r\n  static getLocalTransforms = FF.getLocalTransforms;\r\n  static getGlobalTransformsIds = FF.getGlobalTransformsIds;\r\n  static getGlobalTransforms = FF.getGlobalTransforms;\r\n  static getSamplesIds = FF.getSamplesIds;\r\n  static getSamples = FF.getSamples;\r\n  static getItemsIds = FF.getItemsIds;\r\n  static getItems = FF.getItems;\r\n  static getGlobalTranformsIdsOfItems = FF.getGlobalTranformsIdsOfItems;\r\n  static getElementsData = FF.getElementsData;\r\n  static getGeometryIndicesFromRepresentations =\r\n    FF.getGeometryIndicesFromRepresentations;\r\n  static getRootModelId = FF.getRootModelId;\r\n  static getSerializedAttributes = FF.getSerializedAttributes;\r\n  static itemDataToRawItemData = FF.itemDataToRawItemData;\r\n  static DELTA_MODEL_ID = FF.DELTA_MODEL_ID;\r\n}\r\n","import { GeomsFbUtils } from \"./index\";\r\n\r\nexport class Point {\r\n  x: number;\r\n\r\n  y: number;\r\n\r\n  z: number;\r\n\r\n  hash: string;\r\n\r\n  id: number;\r\n\r\n  constructor(\r\n    vertices: Float32Array,\r\n    index: number,\r\n    id: number,\r\n    precission: number,\r\n  ) {\r\n    this.x = GeomsFbUtils.round(vertices[index * 3], precission);\r\n    this.y = GeomsFbUtils.round(vertices[index * 3 + 1], precission);\r\n    this.z = GeomsFbUtils.round(vertices[index * 3 + 2], precission);\r\n    this.hash = `${this.x}/${this.y}/${this.z}`;\r\n    this.id = id;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { Point } from \"./point\";\r\n\r\nexport class Points {\r\n  list = new Map<string, Point>();\r\n  tempV1 = new THREE.Vector3();\r\n  tempV2 = new THREE.Vector3();\r\n  tempV3 = new THREE.Vector3();\r\n\r\n  precission: number;\r\n\r\n  constructor(precission: number) {\r\n    this.precission = precission;\r\n  }\r\n\r\n  create(vertices: Float32Array, index: number) {\r\n    const point = new Point(vertices, index, this.list.size, this.precission);\r\n    if (!this.list.has(point.hash)) {\r\n      this.list.set(point.hash, point);\r\n    }\r\n    return this.list.get(point.hash)!;\r\n  }\r\n\r\n  get() {\r\n    return Array.from(this.list.values()).map((p) => [p.x, p.y, p.z]);\r\n  }\r\n\r\n  // Prevent degenerate triangles\r\n  isValidTriangle(\r\n    position: Float32Array,\r\n    index1: number,\r\n    index2: number,\r\n    index3: number,\r\n  ) {\r\n    this.tempV1.set(\r\n      position[index1 * 3],\r\n      position[index1 * 3 + 1],\r\n      position[index1 * 3 + 2],\r\n    );\r\n\r\n    this.tempV2.set(\r\n      position[index2 * 3],\r\n      position[index2 * 3 + 1],\r\n      position[index2 * 3 + 2],\r\n    );\r\n\r\n    this.tempV3.set(\r\n      position[index3 * 3],\r\n      position[index3 * 3 + 1],\r\n      position[index3 * 3 + 2],\r\n    );\r\n\r\n    const pointPrecision = (1 / this.precission) * 10;\r\n    const d1Valid = this.tempV1.distanceTo(this.tempV2) > pointPrecision;\r\n    const d2Valid = this.tempV1.distanceTo(this.tempV3) > pointPrecision;\r\n    const d3Valid = this.tempV2.distanceTo(this.tempV3) > pointPrecision;\r\n\r\n    return d1Valid && d2Valid && d3Valid;\r\n  }\r\n}\r\n","import { Edge } from \"./edge\";\r\nimport { Plane } from \"./plane\";\r\n\r\nexport class Face {\r\n  edges = new Map<string, Edge>();\r\n  openEdges = new Set<string>();\r\n\r\n  id: number;\r\n  plane: Plane;\r\n\r\n  constructor(id: number, plane: Plane) {\r\n    this.id = id;\r\n    this.plane = plane;\r\n  }\r\n\r\n  add(triangle: Iterable<Edge>) {\r\n    if (this.edges.size === 0) {\r\n      // This is the first triangle of the face\r\n      for (const edge of triangle) {\r\n        this.openEdges.add(edge.hash);\r\n        this.edges.set(edge.hash, edge);\r\n      }\r\n      return;\r\n    }\r\n\r\n    // Is this necessary?\r\n    // if (!this.match(triangle)) {\r\n    //   throw new Error(\"Triangle doesn't match with any open edge\");\r\n    // }\r\n\r\n    for (const edge of triangle) {\r\n      // If the edge already exists, it means it matches with a previous one\r\n      // so it becomes closed. Otherwise, it's a new open edge\r\n      if (this.openEdges.has(edge.hash)) {\r\n        this.openEdges.delete(edge.hash);\r\n      } else {\r\n        this.openEdges.add(edge.hash);\r\n      }\r\n      this.edges.set(edge.hash, edge);\r\n    }\r\n  }\r\n\r\n  match(triangle: Iterable<Edge>, plane: Plane) {\r\n    if (plane.id !== this.plane.id) {\r\n      return false;\r\n    }\r\n\r\n    for (const edge of triangle) {\r\n      if (this.openEdges.has(edge.hash)) {\r\n        return true;\r\n      }\r\n    }\r\n    return false;\r\n  }\r\n\r\n  getOpenEdges() {\r\n    const openEdges: Edge[] = [];\r\n    for (const edgeID of this.openEdges) {\r\n      openEdges.push(this.edges.get(edgeID)!);\r\n    }\r\n    return openEdges;\r\n  }\r\n\r\n  merge(face: Face) {\r\n    for (const [edgeID, edge] of face.edges) {\r\n      this.edges.set(edgeID, edge);\r\n    }\r\n\r\n    // Common open edges are closed\r\n    // New open edges are added\r\n    for (const edgeID of face.openEdges) {\r\n      if (this.openEdges.has(edgeID)) {\r\n        this.openEdges.delete(edgeID);\r\n      } else {\r\n        this.openEdges.add(edgeID);\r\n      }\r\n    }\r\n  }\r\n}\r\n","import { Plane } from \"./plane\";\r\nimport { Edge } from \"./edge\";\r\nimport { Face } from \"./face\";\r\n\r\nexport class Faces {\r\n  list = new Map<number, Face>();\r\n  nextFaceID = 0;\r\n\r\n  add(triangle: Edge[], plane: Plane) {\r\n    const matches = this.match(triangle, plane);\r\n\r\n    // CASE 0: It doesn't match with any existing face\r\n\r\n    if (matches.length === 0) {\r\n      const newFaceID = this.nextFaceID++;\r\n      const face = new Face(newFaceID, plane);\r\n      face.add(triangle);\r\n      this.list.set(face.id, face);\r\n      return;\r\n    }\r\n\r\n    // CASE 1: It matches with an existing face\r\n    // Just add the triangle to the face\r\n\r\n    if (matches.length === 1) {\r\n      const face = this.list.get(matches[0])!;\r\n      face.add(triangle);\r\n      return;\r\n    }\r\n\r\n    // CASE 2: It matches with multiple existing faces\r\n    // We need to merge them with the first one\r\n\r\n    if (matches.length > 1) {\r\n      const baseFace = this.list.get(matches[0])!;\r\n      baseFace.add(triangle);\r\n\r\n      for (let i = 1; i < matches.length; i++) {\r\n        const faceToMergeID = matches[i];\r\n        const faceToMerge = this.list.get(faceToMergeID)!;\r\n        baseFace.merge(faceToMerge);\r\n        this.list.delete(faceToMergeID);\r\n      }\r\n    }\r\n  }\r\n\r\n  private match(triangle: Edge[], plane: Plane) {\r\n    let matchedFaceIDs: number[] = [];\r\n    for (const face of this.list.values()) {\r\n      if (face.match(triangle, plane)) {\r\n        matchedFaceIDs.push(face.id);\r\n      }\r\n    }\r\n    return matchedFaceIDs;\r\n  }\r\n}\r\n","import { Point } from \"./point\";\r\n\r\nexport class Edge {\r\n  p1: Point;\r\n\r\n  p2: Point;\r\n\r\n  hash: string;\r\n\r\n  constructor(p1: Point, p2: Point) {\r\n    this.p1 = p1;\r\n    this.p2 = p2;\r\n\r\n    // To make sure that the edges AB === BA\r\n    // The smaller coordinate should always be first when building the ID\r\n    const points = [this.p1, this.p2];\r\n    points.sort((a, b) => a.x - b.x || a.y - b.y || a.z - b.z);\r\n    this.hash = `${points[0].hash}_${points[1].hash}`;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { Edge } from \"./edge\";\r\nimport { Point } from \"./point\";\r\nimport { Plane } from \"./plane\";\r\n\r\nexport class Profile {\r\n  // Do we need edges here?\r\n  // edges = new Map<string, Edge>();\r\n\r\n  closed = false;\r\n  openStartPoint: string | null = null;\r\n  openEndPoint: string | null = null;\r\n\r\n  plane: Plane;\r\n\r\n  orderedPoints: Point[] = [];\r\n\r\n  constructor(plane: Plane) {\r\n    this.plane = plane;\r\n  }\r\n\r\n  getEdges(reverse: boolean = false) {\r\n    const edges: Edge[] = [];\r\n\r\n    if (reverse) {\r\n      for (let i = this.orderedPoints.length - 1; i > 0; i--) {\r\n        edges.push(new Edge(this.orderedPoints[i], this.orderedPoints[i - 1]));\r\n      }\r\n    } else {\r\n      for (let i = 0; i < this.orderedPoints.length - 1; i++) {\r\n        edges.push(new Edge(this.orderedPoints[i], this.orderedPoints[i + 1]));\r\n      }\r\n    }\r\n\r\n    return edges;\r\n  }\r\n\r\n  getIndices() {\r\n    return this.orderedPoints.map((p) => p.id);\r\n  }\r\n\r\n  add(edge: Edge) {\r\n    if (this.orderedPoints.length === 0) {\r\n      // This is the first edge of the profile\r\n      this.openStartPoint = edge.p1.hash;\r\n      this.openEndPoint = edge.p2.hash;\r\n      this.orderedPoints.push(edge.p1, edge.p2);\r\n      return;\r\n    }\r\n\r\n    const matches = this.match(edge);\r\n\r\n    // TODO: Is this necessary?\r\n    if (matches === 0) {\r\n      throw new Error(\"Fragments: Edge doesn't match with any open point\");\r\n    }\r\n\r\n    if (matches > 2) {\r\n      throw new Error(\"Fragments: Edge matches with more than 2 open points\");\r\n    }\r\n\r\n    if (matches === 2) {\r\n      // This edge closes the profile\r\n      this.closed = true;\r\n      this.openEndPoint = null;\r\n      this.openStartPoint = null;\r\n      return;\r\n    }\r\n\r\n    // Sort the profile points when the new edge is added\r\n    if (this.openStartPoint === edge.p1.hash) {\r\n      this.orderedPoints.unshift(edge.p2);\r\n      this.openStartPoint = edge.p2.hash;\r\n    } else if (this.openEndPoint === edge.p1.hash) {\r\n      this.orderedPoints.push(edge.p2);\r\n      this.openEndPoint = edge.p2.hash;\r\n    } else if (this.openStartPoint === edge.p2.hash) {\r\n      this.orderedPoints.unshift(edge.p1);\r\n      this.openStartPoint = edge.p1.hash;\r\n    } else if (this.openEndPoint === edge.p2.hash) {\r\n      this.orderedPoints.push(edge.p1);\r\n      this.openEndPoint = edge.p1.hash;\r\n    }\r\n  }\r\n\r\n  match(edge: Edge) {\r\n    if (this.closed) return 0;\r\n    let matchNumber = 0;\r\n    if (this.openStartPoint === edge.p1.hash) matchNumber++;\r\n    if (this.openStartPoint === edge.p2.hash) matchNumber++;\r\n    if (this.openEndPoint === edge.p1.hash) matchNumber++;\r\n    if (this.openEndPoint === edge.p2.hash) matchNumber++;\r\n    return matchNumber;\r\n  }\r\n\r\n  merge(newProfile: Profile) {\r\n    if (newProfile.closed || this.closed) {\r\n      throw new Error(\"Fragments: Cannot merge closed profiles\");\r\n    }\r\n\r\n    // A profile closing the current profile means we missed a previous match\r\n    // This should never happen\r\n\r\n    if (\r\n      newProfile.openStartPoint === this.openEndPoint &&\r\n      newProfile.openEndPoint === this.openStartPoint\r\n    ) {\r\n      throw new Error(\"Fragments: Cannot merge profiles that close each other\");\r\n    }\r\n\r\n    if (\r\n      newProfile.openEndPoint === this.openEndPoint &&\r\n      newProfile.openStartPoint === this.openStartPoint\r\n    ) {\r\n      throw new Error(\"Fragments: Cannot merge profiles that close each other\");\r\n    }\r\n\r\n    let reverse = false;\r\n    if (\r\n      newProfile.openEndPoint === this.openStartPoint ||\r\n      newProfile.openEndPoint === this.openEndPoint\r\n    ) {\r\n      reverse = true;\r\n    }\r\n\r\n    const newEdges = newProfile.getEdges(reverse);\r\n\r\n    for (const edge of newEdges) {\r\n      this.add(edge);\r\n    }\r\n  }\r\n\r\n  getArea() {\r\n    const vertices = this.orderedPoints.map((p) => [p.x, p.y, p.z]);\r\n\r\n    // Make polygon 2d simply by removing the least important axis\r\n\r\n    let dimension1 = 0;\r\n    let dimension2 = 1;\r\n\r\n    const absX = Math.abs(this.plane.normal.x);\r\n    const absY = Math.abs(this.plane.normal.y);\r\n    const absZ = Math.abs(this.plane.normal.z);\r\n\r\n    if (absX >= absY && absX >= absZ) {\r\n      // x is the least important axis\r\n      dimension1 = 1;\r\n      dimension2 = 2;\r\n    } else if (absY >= absX && absY >= absZ) {\r\n      // y is the least important axis\r\n      dimension1 = 0;\r\n      dimension2 = 2;\r\n    } else {\r\n      // z is the least important axis\r\n      dimension1 = 0;\r\n      dimension2 = 1;\r\n    }\r\n\r\n    const projectedPoints: THREE.Vector2[] = [];\r\n\r\n    for (const point of vertices) {\r\n      projectedPoints.push(\r\n        new THREE.Vector2(point[dimension1], point[dimension2]),\r\n      );\r\n    }\r\n\r\n    // Now, to get the area of a 2D polygon:\r\n    // https://stackoverflow.com/a/33670691\r\n\r\n    let total = 0;\r\n\r\n    for (let i = 0, l = projectedPoints.length; i < l; i++) {\r\n      const addX = projectedPoints[i].x;\r\n      const addY =\r\n        projectedPoints[i === projectedPoints.length - 1 ? 0 : i + 1].y;\r\n      const subX =\r\n        projectedPoints[i === projectedPoints.length - 1 ? 0 : i + 1].x;\r\n      const subY = projectedPoints[i].y;\r\n\r\n      total += addX * addY * 0.5;\r\n      total -= subX * subY * 0.5;\r\n    }\r\n\r\n    return Math.abs(total);\r\n  }\r\n}\r\n","import { Plane } from \"./plane\";\r\nimport { Edge } from \"./edge\";\r\nimport { Profile } from \"./profile\";\r\n\r\nexport class Profiles {\r\n  list = new Map<number, Profile>();\r\n  plane: Plane;\r\n  nextProfileID = 0;\r\n\r\n  constructor(plane: Plane) {\r\n    this.plane = plane;\r\n  }\r\n\r\n  add(edge: Edge) {\r\n    const matches = this.match(edge);\r\n\r\n    // CASE 0: No profile matches, create a new one\r\n    if (matches.length === 0) {\r\n      const profileId = this.nextProfileID++;\r\n      const profile = new Profile(this.plane);\r\n      profile.add(edge);\r\n      this.list.set(profileId, profile);\r\n      return;\r\n    }\r\n\r\n    // CASE 1: The edge matches with an existing profile\r\n    // Just add the edge to the profile\r\n    if (matches.length === 1) {\r\n      const profile = this.list.get(matches[0])!;\r\n      profile.add(edge);\r\n      return;\r\n    }\r\n\r\n    // CASE 2: The edge matches with multiple profiles\r\n    // We need to merge them with the first one\r\n    if (matches.length > 1) {\r\n      const profile = this.list.get(matches[0])!;\r\n      profile.add(edge);\r\n      // The other profile is always the second one because\r\n      // a new edge can only match with two different profiles\r\n      const profileToMerge = this.list.get(matches[1])!;\r\n      profile.merge(profileToMerge);\r\n      this.list.delete(matches[1]);\r\n    }\r\n  }\r\n\r\n  getProfiles() {\r\n    let biggestProfile: number | null = null;\r\n    let biggestProfileSize = 0;\r\n\r\n    for (const [profileId, profile] of this.list) {\r\n      const area = profile.getArea();\r\n      if (area > biggestProfileSize) {\r\n        biggestProfileSize = area;\r\n        biggestProfile = profileId;\r\n      }\r\n    }\r\n\r\n    if (biggestProfile === null) {\r\n      // console.log(\"No profiles found\");\r\n      return null;\r\n    }\r\n\r\n    const profile = this.list.get(biggestProfile)!.getIndices();\r\n\r\n    const holes: number[][] = [];\r\n    for (const [profileId, profile] of this.list) {\r\n      if (profileId === biggestProfile) continue;\r\n      holes.push(profile.getIndices());\r\n    }\r\n\r\n    return { profile, holes };\r\n  }\r\n\r\n  private match(edge: Edge) {\r\n    const ids: number[] = [];\r\n    for (const [id, profile] of this.list) {\r\n      if (profile.match(edge) > 0) {\r\n        ids.push(id);\r\n      }\r\n    }\r\n    return ids;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { GeomsFbUtils } from \"./index\";\r\n\r\nexport class Plane {\r\n  normal: THREE.Vector3;\r\n  constant: number;\r\n  id: string;\r\n\r\n  faces: number[] = [];\r\n\r\n  constructor(plane: THREE.Plane, precission: number, normalPrecision: number) {\r\n    // Normals are smaller, so increase precission to avoid problems with almost coplanar faces\r\n    const nx = GeomsFbUtils.round(plane.normal.x, normalPrecision);\r\n    const ny = GeomsFbUtils.round(plane.normal.y, normalPrecision);\r\n    const nz = GeomsFbUtils.round(plane.normal.z, normalPrecision);\r\n    const c = GeomsFbUtils.round(plane.constant, precission);\r\n\r\n    this.normal = new THREE.Vector3(nx, ny, nz);\r\n    this.constant = c;\r\n\r\n    const planeSeparator = \"||\";\r\n    this.id = `${nx}${planeSeparator}${ny}${planeSeparator}${nz}${planeSeparator}${c}`;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport * as TFB from \"../../Schema\";\r\nimport { Points } from \"./points\";\r\nimport { Faces } from \"./faces\";\r\nimport { Profiles } from \"./profiles\";\r\nimport { Edge } from \"./edge\";\r\nimport { Plane } from \"./plane\";\r\nimport {\r\n  RawCircleExtrusion,\r\n  RawRepresentation,\r\n  RawShell,\r\n  RawTransformData,\r\n} from \"../edit\";\r\n\r\nexport type ShellData = {\r\n  type: TFB.RepresentationClass.SHELL;\r\n  profiles: Map<number, number[]>;\r\n  holes: Map<number, number[][]>;\r\n  points: number[][];\r\n  profilesFaceIds: number[];\r\n  bbox: {\r\n    min: { x: number; y: number; z: number };\r\n    max: { x: number; y: number; z: number };\r\n  };\r\n};\r\n\r\nexport type GeometryProcessSettings = {\r\n  // Geometries larger than this threshold will be processed as raw data\r\n  // a good value seem to be 3000\r\n  /*\r\n   * Maximum number of vertices to try to define a brep shell. If the number of vertices is greater than the threshold, the geometry will be saved as raw data, consuming more space.\r\n   */\r\n  threshold: number;\r\n  /*\r\n   * Precision of the vertices when computing breps.\r\n   */\r\n  precision: number;\r\n  /*\r\n   * Precision of the normals when computing breps.\r\n   */\r\n  normalPrecision: number;\r\n  /*\r\n   * Precision of the plane constants for coplanarity when computing breps.\r\n   */\r\n  planePrecision: number;\r\n  /*\r\n   * The threshold use to distinguish hard and smooth faces.\r\n   */\r\n  faceThreshold: number;\r\n  /*\r\n   * The thresholds use to distinguish hard and smooth faces for each category. It overrides the global faceThreshold.\r\n   */\r\n  categoryFaceThresholds?: Map<number, number>;\r\n  /*\r\n   * Whether to force ifc spaces to be transparent.\r\n   */\r\n  forceTransparentSpaces: boolean;\r\n  /*\r\n   * Whether to process IfcRelSpaceBoundary2ndLevel entities and generate meshes from their IfcConnectionSurfaceGeometry.\r\n   */\r\n  processIfcRelSpaceBoundarySecondLevel?: boolean;\r\n};\r\n\r\nexport class GeomsFbUtils {\r\n  // It's 65535, but we leave some margin\r\n  static ushortMaxValue = 65000;\r\n\r\n  static round(value: number, precission: number) {\r\n    return Math.round(value * precission) / precission;\r\n  }\r\n\r\n  static getAABB(vertices: Float32Array | number[]) {\r\n    let minX = Number.POSITIVE_INFINITY;\r\n    let minY = Number.POSITIVE_INFINITY;\r\n    let minZ = Number.POSITIVE_INFINITY;\r\n    let maxX = Number.NEGATIVE_INFINITY;\r\n    let maxY = Number.NEGATIVE_INFINITY;\r\n    let maxZ = Number.NEGATIVE_INFINITY;\r\n\r\n    for (let i = 0; i < vertices.length; i += 3) {\r\n      const x = vertices[i];\r\n      const y = vertices[i + 1];\r\n      const z = vertices[i + 2];\r\n\r\n      if (x < minX) minX = x;\r\n      if (y < minY) minY = y;\r\n      if (z < minZ) minZ = z;\r\n      if (x > maxX) maxX = x;\r\n      if (y > maxY) maxY = y;\r\n      if (z > maxZ) maxZ = z;\r\n    }\r\n\r\n    return {\r\n      min: { x: minX, y: minY, z: minZ },\r\n      max: { x: maxX, y: maxY, z: maxZ },\r\n    };\r\n  }\r\n\r\n  static transformFromMatrix(\r\n    matrix: THREE.Matrix4,\r\n    transform: RawTransformData = {\r\n      position: [0, 0, 0],\r\n      xDirection: [1, 0, 0],\r\n      yDirection: [0, 1, 0],\r\n    },\r\n  ) {\r\n    const posX = matrix.elements[12];\r\n    const posY = matrix.elements[13];\r\n    const posZ = matrix.elements[14];\r\n    const xDirX = matrix.elements[0];\r\n    const xDirY = matrix.elements[1];\r\n    const xDirZ = matrix.elements[2];\r\n    const yDirX = matrix.elements[4];\r\n    const yDirY = matrix.elements[5];\r\n    const yDirZ = matrix.elements[6];\r\n    transform.position[0] = posX;\r\n    transform.position[1] = posY;\r\n    transform.position[2] = posZ;\r\n    transform.xDirection[0] = xDirX;\r\n    transform.xDirection[1] = xDirY;\r\n    transform.xDirection[2] = xDirZ;\r\n    transform.yDirection[0] = yDirX;\r\n    transform.yDirection[1] = yDirY;\r\n    transform.yDirection[2] = yDirZ;\r\n    return transform;\r\n  }\r\n\r\n  static matrixFromTransform(transform: RawTransformData) {\r\n    const localTransform = new THREE.Matrix4();\r\n    const [px, py, pz] = transform.position;\r\n    const [xx, xy, xz] = transform.xDirection;\r\n    const [yx, yy, yz] = transform.yDirection;\r\n    const vx = new THREE.Vector3(xx, xy, xz);\r\n    const vy = new THREE.Vector3(yx, yy, yz);\r\n    const { x: zx, y: zy, z: zz } = vx.cross(vy);\r\n\r\n    // prettier-ignore\r\n    localTransform.fromArray([\r\n        xx, xy, xz, 0,\r\n        yx, yy, yz, 0,\r\n        zx, zy, zz, 0,\r\n        px, py, pz, 1\r\n      ]);\r\n    return localTransform;\r\n  }\r\n\r\n  static bboxFromCircleExtrusion(data: RawCircleExtrusion) {\r\n    const bbox = new THREE.Box3();\r\n    const points: THREE.Vector3[] = [];\r\n    for (const axis of data.axes) {\r\n      for (const wire of axis.wires) {\r\n        for (let i = 0; i < wire.length - 2; i += 3) {\r\n          const x = wire[i];\r\n          const y = wire[i + 1];\r\n          const z = wire[i + 2];\r\n          points.push(new THREE.Vector3(x, y, z));\r\n        }\r\n      }\r\n    }\r\n    bbox.setFromPoints(points);\r\n    const minX = bbox.min.x;\r\n    const minY = bbox.min.y;\r\n    const minZ = bbox.min.z;\r\n    const maxX = bbox.max.x;\r\n    const maxY = bbox.max.y;\r\n    const maxZ = bbox.max.z;\r\n\r\n    return [minX, minY, minZ, maxX, maxY, maxZ];\r\n  }\r\n\r\n  static representationFromGeometry(\r\n    newRepresentation: THREE.BufferGeometry<THREE.NormalBufferAttributes>,\r\n    repr: RawRepresentation = {\r\n      bbox: [0, 0, 0, 0, 0, 0],\r\n      representationClass: TFB.RepresentationClass.SHELL,\r\n      geometry: {\r\n        points: [],\r\n        type: TFB.ShellType.NONE,\r\n        profiles: new Map(),\r\n        holes: new Map(),\r\n        bigHoles: new Map(),\r\n        bigProfiles: new Map(),\r\n        profilesFaceIds: [],\r\n      },\r\n    },\r\n    settings: GeometryProcessSettings = {\r\n      threshold: 3000,\r\n      precision: 1000000,\r\n      normalPrecision: 10000000,\r\n      planePrecision: 1000,\r\n      faceThreshold: 0.6,\r\n      forceTransparentSpaces: true,\r\n    },\r\n  ) {\r\n    const positionAttr = newRepresentation.getAttribute(\"position\")!;\r\n    const position = positionAttr.array as Float32Array;\r\n    const normalsAttr = newRepresentation.getAttribute(\"normal\")!;\r\n    const normals = normalsAttr.array as Float32Array;\r\n    const indexAttr = newRepresentation.index!;\r\n    const index = indexAttr.array as Uint32Array;\r\n\r\n    const newShell = GeomsFbUtils.getShellData({\r\n      position,\r\n      normals,\r\n      index,\r\n      raw: false,\r\n      settings,\r\n    });\r\n\r\n    const { min, max } = newShell.bbox;\r\n    repr.bbox = [min.x, min.y, min.z, max.x, max.y, max.z];\r\n\r\n    if (repr.representationClass === TFB.RepresentationClass.CIRCLE_EXTRUSION) {\r\n      throw new Error(\"Circle extrusions can't be represented as shells\");\r\n    }\r\n\r\n    const shellData = repr.geometry! as RawShell;\r\n\r\n    const points = newShell.points;\r\n    const isBigShell = points.length > GeomsFbUtils.ushortMaxValue;\r\n    shellData.type = isBigShell ? TFB.ShellType.BIG : TFB.ShellType.NONE;\r\n\r\n    shellData.points = points;\r\n    shellData.profilesFaceIds = newShell.profilesFaceIds;\r\n\r\n    if (isBigShell) {\r\n      shellData.profiles = new Map();\r\n      shellData.holes = new Map();\r\n      shellData.bigHoles = newShell.holes;\r\n      shellData.bigProfiles = newShell.profiles;\r\n    } else {\r\n      shellData.profiles = newShell.profiles;\r\n      shellData.holes = newShell.holes;\r\n      shellData.bigHoles = new Map();\r\n      shellData.bigProfiles = new Map();\r\n    }\r\n\r\n    return repr;\r\n  }\r\n\r\n  static getRawShellData(\r\n    index: Uint32Array,\r\n    position: Float32Array,\r\n    bbox: {\r\n      min: { x: number; y: number; z: number };\r\n      max: { x: number; y: number; z: number };\r\n    },\r\n    settings: GeometryProcessSettings,\r\n    category?: number,\r\n  ) {\r\n    const pointsMap = new Map<string, number[]>();\r\n    const profiles = new Map<number, number[]>();\r\n\r\n    const getPointIndex = (x: number, y: number, z: number) => {\r\n      const key = `${x},${y},${z}`;\r\n      if (pointsMap.has(key)) {\r\n        return pointsMap.get(key)![0];\r\n      }\r\n      const index = pointsMap.size;\r\n      pointsMap.set(key, [index, x, y, z]);\r\n      return index;\r\n    };\r\n\r\n    for (let i = 0; i < index.length - 2; i += 3) {\r\n      const v1Index = index[i];\r\n      const v2Index = index[i + 1];\r\n      const v3Index = index[i + 2];\r\n\r\n      const p1x = position[v1Index * 3];\r\n      const p1y = position[v1Index * 3 + 1];\r\n      const p1z = position[v1Index * 3 + 2];\r\n\r\n      const p2x = position[v2Index * 3];\r\n      const p2y = position[v2Index * 3 + 1];\r\n      const p2z = position[v2Index * 3 + 2];\r\n\r\n      const p3x = position[v3Index * 3];\r\n      const p3y = position[v3Index * 3 + 1];\r\n      const p3z = position[v3Index * 3 + 2];\r\n\r\n      const i1 = getPointIndex(p1x, p1y, p1z);\r\n      const i2 = getPointIndex(p2x, p2y, p2z);\r\n      const i3 = getPointIndex(p3x, p3y, p3z);\r\n\r\n      profiles.set(profiles.size, [i1, i2, i3]);\r\n    }\r\n\r\n    const points: number[][] = [];\r\n    for (const [, [, x, y, z]] of pointsMap) {\r\n      points.push([x, y, z]);\r\n    }\r\n\r\n    const result: ShellData = {\r\n      bbox,\r\n      type: TFB.RepresentationClass.SHELL,\r\n      profiles,\r\n      holes: new Map(),\r\n      points,\r\n      profilesFaceIds: [],\r\n    };\r\n\r\n    if (category && settings.categoryFaceThresholds?.has(category)) {\r\n      // If this category has a face threshold, we assume the user really wants to try to generate face ids\r\n      // even if the conversion takes a longer\r\n      this.computeShellFaceIds(result, settings, category);\r\n    } else {\r\n      // If this category doesn't have a face threshold, we assume the user doesn't care a lot about this surface\r\n      // so we consider all the faces smooth, because these are usually terrains and low poly surfaces\r\n      for (let i = 0; i < profiles.size; i++) {\r\n        result.profilesFaceIds.push(0);\r\n      }\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  static getShellData(geometry: {\r\n    position: Float32Array;\r\n    normals: Float32Array;\r\n    index: Uint32Array;\r\n    raw: boolean;\r\n    settings: GeometryProcessSettings;\r\n    category?: number;\r\n  }): ShellData {\r\n    const { position, normals, index, raw, settings, category } = geometry;\r\n\r\n    const { threshold, precision, normalPrecision, planePrecision } = settings;\r\n\r\n    const vertexCount = position.length / 3;\r\n    const tooBigToShell = vertexCount > threshold;\r\n\r\n    const bbox = this.getAABB(position);\r\n\r\n    if (\r\n      bbox.min.x === 0 &&\r\n      bbox.min.y === 0 &&\r\n      bbox.min.z === 0 &&\r\n      bbox.max.x === 0 &&\r\n      bbox.max.y === 0 &&\r\n      bbox.max.z === 0\r\n    ) {\r\n      throw new Error(\"Fragments: Bbox is not valid\");\r\n    }\r\n\r\n    if (raw || tooBigToShell) {\r\n      // Just generate a profile per triangle\r\n      // useful for big irregular surfaces like terrains\r\n      // console.log(\"Too big to Shell\");\r\n\r\n      return this.getRawShellData(index, position, bbox, settings, category);\r\n    }\r\n\r\n    // We need to generate unique points, profiles and holes\r\n    // - Get the faces (adjacend coplanar triangles)\r\n    // - Get the profiles (edges that are not shared by two triangles of the same face)\r\n    // - The profile is the biggest one; the rest are holes\r\n\r\n    const tempPlane = new THREE.Plane();\r\n    const tempNormal = new THREE.Vector3();\r\n    const tempPoint = new THREE.Vector3();\r\n\r\n    // 1. Group triangles in planes\r\n\r\n    const coplanarTriangles = new Map<string, Plane>();\r\n\r\n    for (let i = 0; i < index.length - 2; i += 3) {\r\n      const v1Index = index[i];\r\n\r\n      tempNormal.set(\r\n        normals[v1Index * 3],\r\n        normals[v1Index * 3 + 1],\r\n        normals[v1Index * 3 + 2],\r\n      );\r\n\r\n      tempPoint.set(\r\n        position[v1Index * 3],\r\n        position[v1Index * 3 + 1],\r\n        position[v1Index * 3 + 2],\r\n      );\r\n\r\n      tempPlane.setFromNormalAndCoplanarPoint(tempNormal, tempPoint);\r\n\r\n      const plane = new Plane(tempPlane, planePrecision, normalPrecision);\r\n\r\n      if (!coplanarTriangles.has(plane.id)) {\r\n        coplanarTriangles.set(plane.id, plane);\r\n      }\r\n\r\n      coplanarTriangles.get(plane.id)!.faces.push(i);\r\n    }\r\n\r\n    // console.log(coplanarTriangles);\r\n\r\n    // 2. Group coplanar triangles in faces, deduplicate vertices and get open edges\r\n\r\n    const points = new Points(precision);\r\n    const faces = new Faces();\r\n\r\n    for (const [, plane] of coplanarTriangles) {\r\n      for (const triangleIndex of plane.faces) {\r\n        const v1Index = index[triangleIndex];\r\n        const v2Index = index[triangleIndex + 1];\r\n        const v3Index = index[triangleIndex + 2];\r\n\r\n        if (!points.isValidTriangle(position, v1Index, v2Index, v3Index)) {\r\n          // console.log(\"Invalid triangle\");\r\n          continue;\r\n        }\r\n\r\n        const p1 = points.create(position, v1Index);\r\n        const p2 = points.create(position, v2Index);\r\n        const p3 = points.create(position, v3Index);\r\n\r\n        const e1 = new Edge(p1, p2);\r\n        const e2 = new Edge(p2, p3);\r\n        const e3 = new Edge(p3, p1);\r\n\r\n        const triangle = [e1, e2, e3];\r\n        faces.add(triangle, plane);\r\n      }\r\n    }\r\n    // faces.list = new Map([[0, faces.list.get(0)!]]);\r\n\r\n    // 3. Get all the profiles\r\n\r\n    const profiles = new Map<number, number[]>();\r\n    const holes = new Map<number, number[][]>();\r\n    let faceCounter = 0;\r\n\r\n    for (const [, face] of faces.list) {\r\n      const profile = new Profiles(face.plane);\r\n      const openEdges = face.getOpenEdges();\r\n\r\n      if (openEdges.length === 0) {\r\n        // TODO: Something went wrong with geometry generation. Just return raw data\r\n        // console.log(\"No open edges found. Using raw geometry.\");\r\n        return this.getRawShellData(index, position, bbox, settings, category);\r\n      }\r\n\r\n      for (const edge of openEdges) {\r\n        profile.add(edge);\r\n      }\r\n\r\n      const resultProfiles = profile.getProfiles();\r\n\r\n      profiles.set(faceCounter, resultProfiles?.profile || []);\r\n      holes.set(faceCounter, resultProfiles?.holes || []);\r\n      faceCounter++;\r\n    }\r\n\r\n    let profileCounter = 0;\r\n    const profileIndexMap = new Map<number, number>();\r\n    const filteredProfiles = new Map<number, number[]>();\r\n    for (const [id, profile] of profiles) {\r\n      if (profile.length) {\r\n        profileIndexMap.set(id, profileCounter);\r\n        filteredProfiles.set(profileCounter, profile);\r\n        profileCounter++;\r\n      }\r\n    }\r\n\r\n    // To prevent empty holes\r\n    const filteredHoles = new Map<number, number[][]>();\r\n    for (const [id, hole] of holes) {\r\n      if (hole.length) {\r\n        const newHoleId = profileIndexMap.get(id)!;\r\n        filteredHoles.set(newHoleId, hole);\r\n      }\r\n    }\r\n\r\n    const result: ShellData = {\r\n      bbox,\r\n      type: TFB.RepresentationClass.SHELL,\r\n      profiles: filteredProfiles,\r\n      holes: filteredHoles,\r\n      points: points.get(),\r\n      profilesFaceIds: [],\r\n    };\r\n\r\n    this.computeShellFaceIds(result, settings, category);\r\n\r\n    // for(const point of result.points) {\r\n    //   point[0] = point[0] * 1000;\r\n    //   point[1] = point[1] * 1000;\r\n    //   point[2] = point[2] * 1000;\r\n    // }\r\n\r\n    // console.log(result);\r\n\r\n    return result;\r\n  }\r\n\r\n  private static computeShellFaceIds(\r\n    shell: ShellData,\r\n    settings: GeometryProcessSettings,\r\n    category?: number,\r\n  ) {\r\n    let faceThreshold = settings.faceThreshold;\r\n    if (category && settings.categoryFaceThresholds?.has(category)) {\r\n      faceThreshold = settings.categoryFaceThresholds.get(category)!;\r\n    }\r\n    // TODO: Make this optional e.g. for faster ifc processing?\r\n    const faceIdPerProfile = new Map<number, number>();\r\n    let nextFaceId = 0;\r\n\r\n    // To generate an id per profile\r\n    // for (const [id] of shell.profiles) {\r\n    //   faceIdPerProfile.set(id, nextFaceId++);\r\n    // }\r\n    // return;\r\n\r\n    // 1. generate edge - profilePair map\r\n\r\n    // [edgeId, [profileIndex]]\r\n    // edgeId is a number composed by joining two point indices with a decimal point\r\n    const edgeFacePair = new Map<number, number[]>();\r\n    const edgesPerProfile = new Map<number, number[]>();\r\n    const profilesNormal = new Map<number, number[]>();\r\n\r\n    const p1 = new THREE.Vector3();\r\n    const p2 = new THREE.Vector3();\r\n    const p3 = new THREE.Vector3();\r\n    const n = new THREE.Vector3();\r\n    const tempTriangle = new THREE.Triangle();\r\n\r\n    const profilesLength = shell.profiles.size;\r\n    for (let i = 0; i < profilesLength; i++) {\r\n      const profile = shell.profiles.get(i)!;\r\n      const indicesLength = profile.length;\r\n\r\n      // Save edge\r\n      for (let j = 0; j < indicesLength; j++) {\r\n        const p1Index = profile[j];\r\n        const isLast = j === indicesLength - 1;\r\n        const p2Index = isLast ? profile[0] : profile[j + 1];\r\n        // Ensure that the edge 6.4 is the same as 4.6\r\n        const minIndex = Math.min(p1Index, p2Index);\r\n        const maxIndex = Math.max(p1Index, p2Index);\r\n        const edgeId = minIndex + this.makeDecimal(maxIndex);\r\n\r\n        // Save this edge per profile\r\n        if (!edgesPerProfile.has(i)) {\r\n          edgesPerProfile.set(i, [edgeId]);\r\n        } else {\r\n          edgesPerProfile.get(i)!.push(edgeId);\r\n        }\r\n\r\n        // Save this profile per edge\r\n        if (!edgeFacePair.has(edgeId)) {\r\n          edgeFacePair.set(edgeId, [i]);\r\n        } else {\r\n          edgeFacePair.get(edgeId)!.push(i);\r\n        }\r\n      }\r\n\r\n      // Save normal\r\n      let index1 = 0;\r\n      let index2 = 1;\r\n      let index3 = 2;\r\n      while (index3 < indicesLength) {\r\n        const p1Index = profile[index1];\r\n        const p2Index = profile[index2];\r\n        const p3Index = profile[index3];\r\n\r\n        p1.set(\r\n          shell.points[p1Index][0],\r\n          shell.points[p1Index][1],\r\n          shell.points[p1Index][2],\r\n        );\r\n        p2.set(\r\n          shell.points[p2Index][0],\r\n          shell.points[p2Index][1],\r\n          shell.points[p2Index][2],\r\n        );\r\n        p3.set(\r\n          shell.points[p3Index][0],\r\n          shell.points[p3Index][1],\r\n          shell.points[p3Index][2],\r\n        );\r\n\r\n        tempTriangle.set(p1, p2, p3);\r\n        tempTriangle.getNormal(n);\r\n\r\n        // Check if triangle is valid e.g. not degenerate\r\n        // if degenerate, try another triangle\r\n        if (n.x !== 0 || n.y !== 0 || n.z !== 0) {\r\n          break;\r\n        }\r\n\r\n        index1++;\r\n        index2++;\r\n        index3++;\r\n      }\r\n\r\n      profilesNormal.set(i, [n.x, n.y, n.z]);\r\n    }\r\n\r\n    // 2. for each face, determine if it's hard or not\r\n\r\n    for (const [profile, edges] of edgesPerProfile) {\r\n      // Get this profile data\r\n\r\n      let faceId = faceIdPerProfile.get(profile);\r\n      if (faceId === undefined) {\r\n        faceId = nextFaceId++;\r\n        faceIdPerProfile.set(profile, faceId);\r\n      }\r\n\r\n      const [nx1, ny1, nz1] = profilesNormal.get(profile)!;\r\n\r\n      // For each profile connected to this profile\r\n      for (const edge of edges) {\r\n        const facePair = edgeFacePair.get(edge)!;\r\n        for (const currentProfile of facePair) {\r\n          if (currentProfile === profile) continue; // Same profile\r\n\r\n          // Get the other profile normal\r\n          const [nx2, ny2, nz2] = profilesNormal.get(currentProfile)!;\r\n          // We use absolute to prevent problems with incorrect (inverted) normals\r\n          const dot = Math.abs(nx1 * nx2 + ny1 * ny2 + nz1 * nz2);\r\n          const isHard = dot < faceThreshold;\r\n\r\n          if (faceIdPerProfile.has(currentProfile)) {\r\n            // This face was processed before\r\n            // Check if it belongs to the same face as the face we are currently processing\r\n            //  If it does, substitute that face id with the current face id for the whole map\r\n            // That way, we merge coplanar face groups that are found late\r\n            if (!isHard) {\r\n              const currentFaceId = faceIdPerProfile.get(currentProfile)!;\r\n              // Is this too slow?\r\n              for (const [key, value] of faceIdPerProfile) {\r\n                if (value === currentFaceId) {\r\n                  faceIdPerProfile.set(key, faceId);\r\n                }\r\n              }\r\n            }\r\n          } else {\r\n            // It's the first time we see this face\r\n            // If it's smooth, use same id; otherwise, generate a new id\r\n            const newFaceId = isHard ? nextFaceId++ : faceId;\r\n            faceIdPerProfile.set(currentProfile, newFaceId);\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < shell.profiles.size; i++) {\r\n      if (!faceIdPerProfile.has(i)) {\r\n        throw new Error(`Face id not found for profile ${i}`);\r\n      }\r\n    }\r\n\r\n    const sortedKeys = Array.from(faceIdPerProfile.keys()).sort(\r\n      (a, b) => a - b,\r\n    );\r\n\r\n    for (const key of sortedKeys) {\r\n      const faceId = faceIdPerProfile.get(key)!;\r\n      shell.profilesFaceIds.push(faceId);\r\n    }\r\n  }\r\n\r\n  private static makeDecimal(value: number) {\r\n    let num = 1;\r\n    while (num <= value) {\r\n      num *= 10;\r\n    }\r\n    return value / num;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport * as WEBIFC from \"web-ifc\";\r\n\r\nexport class FragmentsIfcUtils {\r\n  static getAbsolutePlacement(\r\n    webIfc: WEBIFC.IfcAPI,\r\n    item: any,\r\n    // We can pass predefined units factor to avoid recalculating it\r\n    unitsFactor = this.getUnitsFactor(webIfc)\r\n  ) {\r\n    const placementId = item.ObjectPlacement.value;\r\n    const placement = webIfc.GetLine(0, placementId);\r\n    const ifcResult = new THREE.Matrix4();\r\n    ifcResult.identity();\r\n    this.getAbsolutePlacementRecursively(\r\n      webIfc,\r\n      placement,\r\n      ifcResult,\r\n      unitsFactor\r\n    );\r\n\r\n    // Transforms ifc coord system to three.js coord system\r\n    // z = -y\r\n    // y = z\r\n\r\n    const tempMatrix = new THREE.Matrix4();\r\n    tempMatrix.makeRotationX(-Math.PI / 2);\r\n    ifcResult.premultiply(tempMatrix);\r\n\r\n    return ifcResult;\r\n  }\r\n\r\n  static getUnitsFactor(ifcApi: WEBIFC.IfcAPI) {\r\n    const unitAssignmentIds = ifcApi.GetLineIDsWithType(\r\n      0,\r\n      WEBIFC.IFCUNITASSIGNMENT\r\n    );\r\n\r\n    let result = 1;\r\n\r\n    if (unitAssignmentIds.size() === 0) return result;\r\n\r\n    for (let i = 0; i < unitAssignmentIds.size(); i++) {\r\n      const assignmentId = unitAssignmentIds.get(i);\r\n      const assignmentAttrs = ifcApi.GetLine(0, assignmentId);\r\n\r\n      for (const unitHandle of assignmentAttrs.Units) {\r\n        const unit = ifcApi.GetLine(0, unitHandle.value);\r\n\r\n        const value = unit.UnitType?.value;\r\n        if (value !== \"LENGTHUNIT\") continue;\r\n\r\n        let factor = 1;\r\n        let unitValue = 1;\r\n        if (unit.Name.value === \"METRE\") unitValue = 1;\r\n        if (unit.Name.value === \"FOOT\") unitValue = 0.3048;\r\n\r\n        if (unit.Prefix?.value === \"MILLI\") {\r\n          factor = 0.001;\r\n        } else if (unit.Prefix?.value === \"CENTI\") {\r\n          factor = 0.01;\r\n        } else if (unit.Prefix?.value === \"DECI\") {\r\n          factor = 0.1;\r\n        }\r\n\r\n        result = unitValue * factor;\r\n      }\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  private static getAbsolutePlacementRecursively(\r\n    webIfc: WEBIFC.IfcAPI,\r\n    placement: any,\r\n    result: THREE.Matrix4,\r\n    unitsFactor: number\r\n  ) {\r\n    // Current relative placement\r\n    const relativePlacementId = placement.RelativePlacement.value;\r\n    const relativePlacement = webIfc.GetLine(0, relativePlacementId);\r\n\r\n    const locationId = relativePlacement.Location.value;\r\n    const zAxisRef = relativePlacement.Axis;\r\n    const xAxisRef = relativePlacement.RefDirection;\r\n\r\n    const pos = new THREE.Vector3(0, 0, 0);\r\n    const zAxis = new THREE.Vector3(0, 0, 1);\r\n    const xAxis = new THREE.Vector3(1, 0, 0);\r\n\r\n    const locationData = webIfc.GetLine(0, locationId);\r\n    if (locationData) {\r\n      const [x, y, z] = locationData.Coordinates;\r\n      pos.x = x.value * unitsFactor;\r\n      pos.y = y.value * unitsFactor;\r\n      pos.z = z.value * unitsFactor;\r\n    }\r\n\r\n    if (zAxisRef) {\r\n      const zAxisData = webIfc.GetLine(0, zAxisRef.value);\r\n      const [z1, z2, z3] = (\r\n        zAxisData.DirectionRatios as (number | { value: number })[]\r\n      ).map((v) => (typeof v === \"number\" ? v : v.value));\r\n      zAxis.x = z1;\r\n      zAxis.y = z2;\r\n      zAxis.z = z3;\r\n    }\r\n\r\n    if (xAxisRef) {\r\n      const xAxisData = webIfc.GetLine(0, xAxisRef.value);\r\n      const [x1, x2, x3] = (\r\n        xAxisData.DirectionRatios as (number | { value: number })[]\r\n      ).map((v) => (typeof v === \"number\" ? v : v.value));\r\n      xAxis.x = x1;\r\n      xAxis.y = x2;\r\n      xAxis.z = x3;\r\n    }\r\n\r\n    const yAxis = zAxis.clone().cross(xAxis);\r\n\r\n    const tempMatrix = new THREE.Matrix4();\r\n\r\n    // Transforms ifc coord system to three.js coord system\r\n    // z = -y\r\n    // y = z\r\n\r\n    // prettier-ignore\r\n    tempMatrix.fromArray([\r\n      xAxis.x, xAxis.y, xAxis.z, 0,\r\n      yAxis.x, yAxis.y, yAxis.z, 0,\r\n      zAxis.x, zAxis.y, zAxis.z, 0,\r\n      pos.x,   pos.y,   pos.z,   1,\r\n    ]);\r\n\r\n    result.premultiply(tempMatrix);\r\n\r\n    // Parent placement\r\n    if (!placement.PlacementRelTo || !placement.PlacementRelTo.value) return;\r\n    const parentPlacementId = placement.PlacementRelTo.value;\r\n    const parentPlacement = webIfc.GetLine(0, parentPlacementId);\r\n    this.getAbsolutePlacementRecursively(\r\n      webIfc,\r\n      parentPlacement,\r\n      result,\r\n      unitsFactor\r\n    );\r\n  }\r\n}\r\n","import * as WEBIFC from \"web-ifc\";\r\n\r\nexport const ifcGeometriesMap = new Set<number>([WEBIFC.IFCCARTESIANPOINT]);\r\n\r\n/**\r\n * A Set of unique numbers representing different types of IFC geometries.\r\n */\r\nexport const geometryTypes = new Set<number>([\r\n  WEBIFC.IFCCARTESIANPOINT,\r\n  WEBIFC.IFCCARTESIANPOINTLIST,\r\n  WEBIFC.IFCCARTESIANPOINTLIST2D,\r\n  WEBIFC.IFCCARTESIANPOINTLIST3D,\r\n  WEBIFC.IFCARBITRARYCLOSEDPROFILEDEF,\r\n  WEBIFC.IFCDIRECTION,\r\n  WEBIFC.IFCAXIS2PLACEMENT2D,\r\n  WEBIFC.IFCASYMMETRICISHAPEPROFILEDEF,\r\n  WEBIFC.IFCAXIS2PLACEMENT3D,\r\n  WEBIFC.IFCLOCALPLACEMENT,\r\n  WEBIFC.IFCSHAPEREPRESENTATION,\r\n  WEBIFC.IFCRECTANGLEPROFILEDEF,\r\n  WEBIFC.IFCPOLYLINE,\r\n  WEBIFC.IFCPLANE,\r\n  WEBIFC.IFCEXTRUDEDAREASOLID,\r\n  WEBIFC.IFCSURFACESTYLERENDERING,\r\n  WEBIFC.IFCSURFACESTYLE,\r\n  WEBIFC.IFCSURFACESTYLELIGHTING,\r\n  WEBIFC.IFCSURFACESTYLEREFRACTION,\r\n  WEBIFC.IFCSURFACESTYLERENDERING,\r\n  WEBIFC.IFCSURFACESTYLESHADING,\r\n  WEBIFC.IFCSURFACESTYLEWITHTEXTURES,\r\n  WEBIFC.IFCPRESENTATIONSTYLEASSIGNMENT,\r\n  WEBIFC.IFCSTYLEDREPRESENTATION,\r\n  WEBIFC.IFCCARTESIANTRANSFORMATIONOPERATOR3D,\r\n  WEBIFC.IFCCARTESIANTRANSFORMATIONOPERATOR3DNONUNIFORM,\r\n  WEBIFC.IFCCOLOURRGB,\r\n  WEBIFC.IFCCOLOURRGBLIST,\r\n  WEBIFC.IFCSTYLEDITEM,\r\n  WEBIFC.IFCCURVEBOUNDEDPLANE,\r\n  WEBIFC.IFCCONNECTIONSURFACEGEOMETRY,\r\n  WEBIFC.IFCPRODUCTDEFINITIONSHAPE,\r\n  WEBIFC.IFCGEOMETRICREPRESENTATIONCONTEXT,\r\n  WEBIFC.IFCGEOMETRICREPRESENTATIONSUBCONTEXT,\r\n  WEBIFC.IFCPOLYLOOP,\r\n  WEBIFC.IFCFACEOUTERBOUND,\r\n  WEBIFC.IFCFACE,\r\n  WEBIFC.IFCFACEBOUND,\r\n  WEBIFC.IFCCLOSEDSHELL,\r\n  WEBIFC.IFCFACETEDBREP,\r\n  WEBIFC.IFCFACETEDBREPWITHVOIDS,\r\n  WEBIFC.IFCREPRESENTATIONMAP,\r\n  WEBIFC.IFCMAPPEDITEM,\r\n  WEBIFC.IFCARBITRARYPROFILEDEFWITHVOIDS,\r\n  WEBIFC.IFCCOMPOSITECURVE,\r\n  WEBIFC.IFCCOMPOSITECURVESEGMENT,\r\n  WEBIFC.IFCCIRCLE,\r\n  WEBIFC.IFCELLIPSE,\r\n  WEBIFC.IFCCIRCLEHOLLOWPROFILEDEF,\r\n  WEBIFC.IFCRECTANGLEHOLLOWPROFILEDEF,\r\n  WEBIFC.IFCLINE,\r\n  WEBIFC.IFCISHAPEPROFILEDEF,\r\n  WEBIFC.IFCGEOMETRICREPRESENTATIONCONTEXT,\r\n  WEBIFC.IFCGEOMETRICREPRESENTATIONSUBCONTEXT,\r\n  WEBIFC.IFCCURVESTYLE,\r\n  WEBIFC.IFCDRAUGHTINGPREDEFINEDCURVEFONT,\r\n  WEBIFC.IFCGEOMETRICSET,\r\n  WEBIFC.IFCCIRCLEPROFILEDEF,\r\n  WEBIFC.IFCPOLYGONALBOUNDEDHALFSPACE,\r\n  WEBIFC.IFCFACEBASEDSURFACEMODEL,\r\n  WEBIFC.IFCCONNECTEDFACESET,\r\n  WEBIFC.IFCTRIMMEDCURVE,\r\n  WEBIFC.IFCOPENSHELL,\r\n  WEBIFC.IFCSHELLBASEDSURFACEMODEL,\r\n  WEBIFC.IFCHALFSPACESOLID,\r\n  WEBIFC.IFCBOOLEANCLIPPINGRESULT,\r\n  WEBIFC.IFCGEOMETRICCURVESET,\r\n  WEBIFC.IFCCURVESTYLEFONT,\r\n  WEBIFC.IFCCURVESTYLEFONTPATTERN,\r\n  WEBIFC.IFCADVANCEDBREP,\r\n  WEBIFC.IFCADVANCEDBREPWITHVOIDS,\r\n  WEBIFC.IFCADVANCEDFACE,\r\n  WEBIFC.IFCARBITRARYOPENPROFILEDEF,\r\n  WEBIFC.IFCAXIS1PLACEMENT,\r\n  WEBIFC.IFCBOOLEANRESULT,\r\n  WEBIFC.IFCBOOLEANCLIPPINGRESULT,\r\n  WEBIFC.IFCBOUNDARYCURVE,\r\n  WEBIFC.IFCBOUNDEDCURVE,\r\n  WEBIFC.IFCBOUNDEDSURFACE,\r\n  WEBIFC.IFCBOXEDHALFSPACE,\r\n  WEBIFC.IFCCSHAPEPROFILEDEF,\r\n  WEBIFC.IFCCARTESIANTRANSFORMATIONOPERATOR,\r\n  WEBIFC.IFCCARTESIANTRANSFORMATIONOPERATOR2D,\r\n  WEBIFC.IFCCARTESIANTRANSFORMATIONOPERATOR2DNONUNIFORM,\r\n  WEBIFC.IFCCENTERLINEPROFILEDEF,\r\n  WEBIFC.IFCTESSELLATEDFACESET,\r\n  WEBIFC.IFCCOLOURSPECIFICATION,\r\n  WEBIFC.IFCCOMPOSITECURVEONSURFACE,\r\n  WEBIFC.IFCCOMPOSITEPROFILEDEF,\r\n  WEBIFC.IFCCONNECTEDFACESET,\r\n  WEBIFC.IFCCONNECTIONCURVEGEOMETRY,\r\n  WEBIFC.IFCCONNECTIONGEOMETRY,\r\n  WEBIFC.IFCCONNECTIONPOINTECCENTRICITY,\r\n  WEBIFC.IFCCONNECTIONPOINTGEOMETRY,\r\n  WEBIFC.IFCCONNECTIONSURFACEGEOMETRY,\r\n  WEBIFC.IFCCONNECTIONVOLUMEGEOMETRY,\r\n  WEBIFC.IFCCSGSOLID,\r\n  WEBIFC.IFCCURVE,\r\n  WEBIFC.IFCCURVEBOUNDEDSURFACE,\r\n  WEBIFC.IFCCURVESTYLEFONTANDSCALING,\r\n  WEBIFC.IFCCYLINDRICALSURFACE,\r\n  WEBIFC.IFCDERIVEDPROFILEDEF,\r\n  WEBIFC.IFCEDGE,\r\n  WEBIFC.IFCEDGECURVE,\r\n  WEBIFC.IFCEDGELOOP,\r\n  WEBIFC.IFCEXTRUDEDAREASOLIDTAPERED,\r\n  WEBIFC.IFCFACESURFACE,\r\n  WEBIFC.IFCFILLAREASTYLE,\r\n  WEBIFC.IFCFILLAREASTYLEHATCHING,\r\n  WEBIFC.IFCFILLAREASTYLETILES,\r\n  WEBIFC.IFCIMAGETEXTURE,\r\n  WEBIFC.IFCINDEXEDCOLOURMAP,\r\n  WEBIFC.IFCINDEXEDPOLYCURVE,\r\n  WEBIFC.IFCINDEXEDPOLYGONALFACE,\r\n  WEBIFC.IFCINDEXEDPOLYGONALFACEWITHVOIDS,\r\n  WEBIFC.IFCINDEXEDTEXTUREMAP,\r\n  WEBIFC.IFCINDEXEDTRIANGLETEXTUREMAP,\r\n  WEBIFC.IFCLSHAPEPROFILEDEF,\r\n  WEBIFC.IFCSWEPTSURFACE,\r\n  WEBIFC.IFCLINEARPLACEMENT,\r\n  WEBIFC.IFCLOCALPLACEMENT,\r\n  WEBIFC.IFCMANIFOLDSOLIDBREP,\r\n  WEBIFC.IFCMAPCONVERSION,\r\n  WEBIFC.IFCMAPPEDITEM,\r\n  WEBIFC.IFCPCURVE,\r\n  WEBIFC.IFCPATH,\r\n  WEBIFC.IFCPOLYGONALFACESET,\r\n  WEBIFC.IFCPROFILEDEF,\r\n  WEBIFC.IFCSURFACE,\r\n  WEBIFC.IFCSTYLEMODEL,\r\n  WEBIFC.IFCUSHAPEPROFILEDEF,\r\n]);\r\n","import * as WEBIFC from \"web-ifc\";\r\n\r\nexport const ifcRelationsMap = new Map<\r\n  number,\r\n  { forRelating: string; forRelated: string }\r\n>([\r\n  [\r\n    WEBIFC.IFCRELADHERESTOELEMENT,\r\n    {\r\n      forRelating: \"HasSurfaceFeatures\",\r\n      forRelated: \"AdheresToElement\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELPOSITIONS,\r\n    {\r\n      forRelating: \"Positions\",\r\n      forRelated: \"PositionedRelativeTo\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSOCIATESPROFILEDEF,\r\n    {\r\n      forRelating: \"AssociatedTo\",\r\n      forRelated: \"HasAssociations\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELSPACEBOUNDARY2NDLEVEL,\r\n    {\r\n      forRelating: \"BoundedBy\",\r\n      forRelated: \"ProvidesBoundaries\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELSPACEBOUNDARY1STLEVEL,\r\n    {\r\n      forRelating: \"BoundedBy\",\r\n      forRelated: \"ProvidesBoundaries\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELINTERFERESELEMENTS,\r\n    {\r\n      forRelating: \"InterferesElements\",\r\n      forRelated: \"IsInterferedByElements\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELDEFINESBYTEMPLATE,\r\n    {\r\n      forRelating: \"Defines\",\r\n      forRelated: \"IsDefinedBy\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELDEFINESBYOBJECT,\r\n    {\r\n      forRelating: \"Declares\",\r\n      forRelated: \"IsDeclaredBy\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELDECLARES,\r\n    {\r\n      forRelating: \"Declares\",\r\n      forRelated: \"HasContext\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSIGNSTOGROUPBYFACTOR,\r\n    {\r\n      forRelating: \"IsGroupedBy\",\r\n      forRelated: \"HasAssignments\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSIGNSTASKS,\r\n    {\r\n      forRelating: \"Controls\",\r\n      forRelated: \"HasAssignments\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELAGGREGATES,\r\n    {\r\n      forRelating: \"IsDecomposedBy\",\r\n      forRelated: \"Decomposes\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELVOIDSELEMENT,\r\n    {\r\n      forRelating: \"HasOpenings\",\r\n      forRelated: \"VoidsElements\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELSPACEBOUNDARY,\r\n    {\r\n      forRelating: \"BoundedBy\",\r\n      forRelated: \"ProvidesBoundaries\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELSERVICESBUILDINGS,\r\n    {\r\n      forRelating: \"ServicesBuildings\",\r\n      forRelated: \"ServicedBySystems\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELSEQUENCE,\r\n    {\r\n      forRelating: \"IsPredecessorTo\",\r\n      forRelated: \"IsSuccessorFrom\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELSCHEDULESCOSTITEMS,\r\n    {\r\n      forRelating: \"ReferencedBy\",\r\n      forRelated: \"HasAssignments\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELREFERENCEDINSPATIALSTRUCTURE,\r\n    {\r\n      forRelating: \"ReferencesElements\",\r\n      forRelated: \"ReferencedInStructures\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELPROJECTSELEMENT,\r\n    {\r\n      forRelating: \"HasProjections\",\r\n      forRelated: \"ProjectsElements\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELOVERRIDESPROPERTIES,\r\n    {\r\n      forRelating: \"DefinesOccurrence\",\r\n      forRelated: \"IsDefinedBy\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELOCCUPIESSPACES,\r\n    {\r\n      forRelating: \"IsActingUpon\",\r\n      forRelated: \"HasAssignments\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELNESTS,\r\n    {\r\n      forRelating: \"IsNestedBy\",\r\n      forRelated: \"Nests\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELINTERACTIONREQUIREMENTS,\r\n    {\r\n      forRelating: \"HasInteractionReqsTo\",\r\n      forRelated: \"HasInteractionReqsFrom\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELFLOWCONTROLELEMENTS,\r\n    {\r\n      forRelating: \"HasControlElements\",\r\n      forRelated: \"AssignedToFlowElement\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELFILLSELEMENT,\r\n    {\r\n      forRelating: \"HasFillings\",\r\n      forRelated: \"FillsVoids\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELDEFINESBYTYPE,\r\n    {\r\n      forRelating: \"Types\",\r\n      forRelated: \"IsTypedBy\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELDEFINESBYPROPERTIES,\r\n    {\r\n      forRelating: \"DefinesOccurrence\",\r\n      forRelated: \"IsDefinedBy\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELDEFINES,\r\n    {\r\n      forRelating: \"DefinesOccurrence\",\r\n      forRelated: \"IsDefinedBy\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELDECOMPOSES,\r\n    {\r\n      forRelating: \"IsDecomposedBy\",\r\n      forRelated: \"Decomposes\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELCOVERSSPACES,\r\n    {\r\n      forRelating: \"HasCoverings\",\r\n      forRelated: \"CoversSpaces\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELCOVERSBLDGELEMENTS,\r\n    {\r\n      forRelating: \"HasCoverings\",\r\n      forRelated: \"CoversElements\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELCONTAINEDINSPATIALSTRUCTURE,\r\n    {\r\n      forRelating: \"ContainsElements\",\r\n      forRelated: \"ContainedInStructure\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELCONNECTSWITHREALIZINGELEMENTS,\r\n    {\r\n      forRelating: \"ConnectedTo\",\r\n      forRelated: \"ConnectedFrom\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELCONNECTSWITHECCENTRICITY,\r\n    {\r\n      forRelating: \"ConnectedBy\",\r\n      forRelated: \"ConnectsStructuralMembers\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELCONNECTSSTRUCTURALMEMBER,\r\n    {\r\n      forRelating: \"ConnectedBy\",\r\n      forRelated: \"ConnectsStructuralMembers\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELCONNECTSSTRUCTURALELEMENT,\r\n    {\r\n      forRelating: \"HasStructuralMember\",\r\n      forRelated: \"ReferencesElement\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELCONNECTSSTRUCTURALACTIVITY,\r\n    {\r\n      forRelating: \"AssignedStructuralActivity\",\r\n      forRelated: \"AssignedToStructuralItem\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELCONNECTSPORTS,\r\n    {\r\n      forRelating: \"ConnectedTo\",\r\n      forRelated: \"ConnectedFrom\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELCONNECTSPORTTOELEMENT,\r\n    {\r\n      forRelating: \"ContainedIn\",\r\n      forRelated: \"HasPorts\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELCONNECTSPATHELEMENTS,\r\n    {\r\n      forRelating: \"ConnectedTo\",\r\n      forRelated: \"ConnectedFrom\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELCONNECTSELEMENTS,\r\n    {\r\n      forRelating: \"ConnectedTo\",\r\n      forRelated: \"ConnectedFrom\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELCONNECTS,\r\n    {\r\n      forRelating: \"ConnectedTo\",\r\n      forRelated: \"ConnectedFrom\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSOCIATESPROFILEPROPERTIES,\r\n    {\r\n      forRelating: \"AssociatedTo\",\r\n      forRelated: \"HasAssociations\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSOCIATESMATERIAL,\r\n    {\r\n      forRelating: \"AssociatedTo\",\r\n      forRelated: \"HasAssociations\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSOCIATESLIBRARY,\r\n    {\r\n      forRelating: \"LibraryInfoForObjects\",\r\n      forRelated: \"HasAssociations\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSOCIATESDOCUMENT,\r\n    {\r\n      forRelating: \"DocumentInfoForObjects\",\r\n      forRelated: \"DocumentRefForObjects\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSOCIATESCONSTRAINT,\r\n    {\r\n      forRelating: \"AssociatedTo\",\r\n      forRelated: \"HasAssociations\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSOCIATESCLASSIFICATION,\r\n    {\r\n      forRelating: \"HasReferences\",\r\n      forRelated: \"ClassificationRefForObjects\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSOCIATESAPPROVAL,\r\n    {\r\n      forRelating: \"ApprovedObjects\",\r\n      forRelated: \"HasAssociations\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSOCIATESAPPLIEDVALUE,\r\n    {\r\n      forRelating: \"AssociatedTo\",\r\n      forRelated: \"HasAssociations\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSOCIATES,\r\n    {\r\n      forRelating: \"AssociatedTo\",\r\n      forRelated: \"HasAssociations\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSIGNSTORESOURCE,\r\n    {\r\n      forRelating: \"ResourceOf\",\r\n      forRelated: \"HasAssignments\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSIGNSTOPROJECTORDER,\r\n    {\r\n      forRelating: \"ReferencedBy\",\r\n      forRelated: \"HasAssignments\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSIGNSTOPRODUCT,\r\n    {\r\n      forRelating: \"ReferencedBy\",\r\n      forRelated: \"HasAssignments\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSIGNSTOPROCESS,\r\n    {\r\n      forRelating: \"OperatesOn\",\r\n      forRelated: \"HasAssignments\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSIGNSTOGROUP,\r\n    {\r\n      forRelating: \"IsGroupedBy\",\r\n      forRelated: \"HasAssignments\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSIGNSTOCONTROL,\r\n    {\r\n      forRelating: \"Controls\",\r\n      forRelated: \"HasAssignments\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSIGNSTOACTOR,\r\n    {\r\n      forRelating: \"IsActingUpon\",\r\n      forRelated: \"HasAssignments\",\r\n    },\r\n  ],\r\n  [\r\n    WEBIFC.IFCRELASSIGNS,\r\n    {\r\n      forRelating: \"ReferencedBy\",\r\n      forRelated: \"HasAssignments\",\r\n    },\r\n  ],\r\n]);\r\n","/**\r\n * Fetches a worker script and returns a blob URL with the ES module `export` stripped, so it can be used as a classic (non-module) worker.\r\n * @param workerURL - URL of the ES module worker script.\r\n * @returns A blob URL usable with `new FragmentsModels(url, { classicWorker: true })`.\r\n */\r\nexport async function toClassicWorker(workerURL: string): Promise<string> {\r\n  const res = await fetch(workerURL);\r\n  const src = await res.text();\r\n  const classic = src.replace(/export\\s*\\{[^}]*\\}\\s*;?\\s*/, \"\");\r\n  const blob = new Blob([classic], { type: \"text/javascript\" });\r\n  return URL.createObjectURL(blob);\r\n}\r\n","/* eslint-disable max-classes-per-file */\r\n/* eslint-disable no-use-before-define */\r\n/* eslint-disable no-cond-assign */\r\n/* eslint-disable no-bitwise */\r\n\r\n// ---------------------------------------------------------------------------\r\n// Node.js dependency injection (avoids top-level fs/path imports for bundlers)\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Subset of Node.js `fs` used by the splitter. */\r\nexport interface IfcSplitterFs {\r\n  openSync(path: string, flags: string): number;\r\n  readSync(\r\n    fd: number,\r\n    buffer: any,\r\n    offset: number,\r\n    length: number,\r\n    position: null,\r\n  ): number;\r\n  writeSync(fd: number, data: any, offset?: number, length?: number): number;\r\n  closeSync(fd: number): void;\r\n  existsSync(path: string): boolean;\r\n  mkdirSync(path: string, options?: { recursive?: boolean }): void;\r\n  statSync(path: string): { size: number };\r\n}\r\n\r\n/** Subset of Node.js `path` used by the splitter. */\r\nexport interface IfcSplitterPath {\r\n  join(...paths: string[]): string;\r\n  dirname(p: string): string;\r\n  basename(p: string): string;\r\n}\r\n\r\n/** Dependencies that must be provided by the caller (Node.js modules). */\r\nexport interface IfcSplitterDeps {\r\n  fs: IfcSplitterFs;\r\n  path: IfcSplitterPath;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Exported interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Mapping of void/fill relationships between walls, openings, and fillers (doors/windows). */\r\nexport interface VoidFillMap {\r\n  wallToOpenings: Map<number, Set<number>>;\r\n  openingToWall: Map<number, number>;\r\n  openingToFillers: Map<number, Set<number>>;\r\n  fillerToOpening: Map<number, number>;\r\n  relLineIds: Map<number, Set<number>>;\r\n}\r\n\r\n/** Parent-child aggregation relationships between building elements (e.g. roof to slabs). */\r\nexport interface AggregateMap {\r\n  parentToChildren: Map<number, Set<number>>;\r\n  childToParent: Map<number, number>;\r\n  aggregateRelIds: Map<number, Set<number>>;\r\n}\r\n\r\n/** Reverse indices for IFCSTYLEDITEM and IFCMATERIALDEFINITIONREPRESENTATION backward pointers. */\r\nexport interface StyleMaps {\r\n  geomToStyledItems: Map<number, number[]>;\r\n  materialToDefReps: Map<number, number[]>;\r\n}\r\n\r\n/** Per-group output data: the set of IFC entity IDs to include and any rewritten relationship lines. */\r\nexport interface GroupData {\r\n  fileIds: Set<number> | null;\r\n  rewrittenLines: Map<number, string>;\r\n  elementCount: number;\r\n  totalIds: number;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Internal interfaces\r\n// ---------------------------------------------------------------------------\r\ninterface ExtractIdResult {\r\n  id: number;\r\n  type: string;\r\n}\r\n\r\ninterface ParseResult {\r\n  header: string[];\r\n  footer: string[];\r\n  index: LineIndex;\r\n}\r\n\r\ninterface RelEntry {\r\n  id: number;\r\n  type: string;\r\n  args: string[];\r\n  listIdx: number;\r\n  listRefs: number[];\r\n  idPrefix: string;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// IFC element categories we consider \"splittable building elements\"\r\n// ---------------------------------------------------------------------------\r\nconst ELEMENT_TYPES: Set<string> = new Set([\r\n  \"IFCWALL\",\r\n  \"IFCWALLSTANDARDCASE\",\r\n  \"IFCWALLELEMENTEDCASE\",\r\n  \"IFCSLAB\",\r\n  \"IFCSLABSTANDARDCASE\",\r\n  \"IFCSLABELEMENTEDCASE\",\r\n  \"IFCBEAM\",\r\n  \"IFCBEAMSTANDARDCASE\",\r\n  \"IFCCOLUMN\",\r\n  \"IFCCOLUMNSTANDARDCASE\",\r\n  \"IFCDOOR\",\r\n  \"IFCDOORSTANDARDCASE\",\r\n  \"IFCWINDOW\",\r\n  \"IFCWINDOWSTANDARDCASE\",\r\n  \"IFCROOF\",\r\n  \"IFCSTAIR\",\r\n  \"IFCSTAIRFLIGHT\",\r\n  \"IFCRAMP\",\r\n  \"IFCRAMPFLIGHT\",\r\n  \"IFCCURTAINWALL\",\r\n  \"IFCCOVERING\",\r\n  \"IFCRAILING\",\r\n  \"IFCPLATE\",\r\n  \"IFCPLATESTANDARDCASE\",\r\n  \"IFCMEMBER\",\r\n  \"IFCMEMBERSTANDARDCASE\",\r\n  \"IFCFOOTING\",\r\n  \"IFCPILE\",\r\n  \"IFCFURNISHINGELEMENT\",\r\n  \"IFCSANITARYTERMINAL\",\r\n  \"IFCFLOWSEGMENT\",\r\n  \"IFCFLOWTERMINAL\",\r\n  \"IFCFLOWCONTROLLER\",\r\n  \"IFCFLOWFITTING\",\r\n  \"IFCFLOWMOVINGDEVICE\",\r\n  \"IFCFLOWSTORAGEDEVICE\",\r\n  \"IFCFLOWTREATMENTDEVICE\",\r\n  \"IFCENERGYCONVERSIONDEVICE\",\r\n  \"IFCDISTRIBUTIONFLOWELEMENT\",\r\n  \"IFCDISTRIBUTIONCONTROLELEMENT\",\r\n  \"IFCDISTRIBUTIONELEMENT\",\r\n  \"IFCDISTRIBUTIONPORT\",\r\n  \"IFCBUILDINGELEMENTPROXY\",\r\n  \"IFCBUILDINGELEMENTPART\",\r\n  \"IFCOPENINGELEMENT\",\r\n  \"IFCSPACE\",\r\n  \"IFCTRANSPORTELEMENT\",\r\n  \"IFCVIRTUALELEMENT\",\r\n  \"IFCSHADINGDEVICE\",\r\n  \"IFCCHIMNEY\",\r\n  \"IFCGEOGRAPHICELEMENT\",\r\n  \"IFCPROXY\", \r\n  \"IFCMECHANICALFASTENER\",\r\n]);\r\n\r\nconst SPATIAL_TYPES: Set<string> = new Set([\r\n  \"IFCPROJECT\",\r\n  \"IFCSITE\",\r\n  \"IFCBUILDING\",\r\n  \"IFCBUILDINGSTOREY\",\r\n]);\r\n\r\n// ---------------------------------------------------------------------------\r\n// Parse helpers — manual charCode-based extractors for speed on 37M+ lines\r\n// ---------------------------------------------------------------------------\r\nfunction extractId(raw: string): ExtractIdResult | null {\r\n  if (raw.charCodeAt(0) !== 35) return null; // '#'\r\n  let id = 0;\r\n  let i = 1;\r\n  while (i < raw.length) {\r\n    const c = raw.charCodeAt(i);\r\n    if (c >= 48 && c <= 57) {\r\n      id = id * 10 + (c - 48);\r\n      i++;\r\n    } else break;\r\n  }\r\n  if (id === 0) return null;\r\n  while (i < raw.length && raw.charCodeAt(i) <= 32) i++;\r\n  if (raw.charCodeAt(i) !== 61) return null; // '='\r\n  i++;\r\n  while (i < raw.length && raw.charCodeAt(i) <= 32) i++;\r\n  const ts = i;\r\n  while (i < raw.length) {\r\n    const c = raw.charCodeAt(i);\r\n    if ((c >= 65 && c <= 90) || (c >= 48 && c <= 57) || c === 95) i++;\r\n    else break;\r\n  }\r\n  if (i === ts) return null;\r\n  return { id, type: raw.substring(ts, i) };\r\n}\r\n\r\nfunction extractRefs(raw: string, skipId?: number): number[] {\r\n  const refs: number[] = [];\r\n  for (let i = 0; i < raw.length; i++) {\r\n    if (raw.charCodeAt(i) === 35) {\r\n      // '#'\r\n      let id = 0;\r\n      i++;\r\n      while (i < raw.length) {\r\n        const c = raw.charCodeAt(i);\r\n        if (c >= 48 && c <= 57) {\r\n          id = id * 10 + (c - 48);\r\n          i++;\r\n        } else break;\r\n      }\r\n      if (id > 0 && id !== skipId) refs.push(id);\r\n      i--; // outer loop will i++\r\n    }\r\n  }\r\n  return refs;\r\n}\r\n\r\nfunction splitIfcArgs(s: string): string[] {\r\n  const args: string[] = [];\r\n  let depth = 0;\r\n  let inStr = false;\r\n  let current = \"\";\r\n  for (let i = 0; i < s.length; i++) {\r\n    const ch = s[i];\r\n    if (ch === \"'\" && !inStr) {\r\n      inStr = true;\r\n      current += ch;\r\n    } else if (ch === \"'\" && inStr) {\r\n      inStr = false;\r\n      current += ch;\r\n    } else if (inStr) {\r\n      current += ch;\r\n    } else if (ch === \"(\") {\r\n      depth++;\r\n      current += ch;\r\n    } else if (ch === \")\") {\r\n      depth--;\r\n      current += ch;\r\n    } else if (ch === \",\" && depth === 0) {\r\n      args.push(current.trim());\r\n      current = \"\";\r\n    } else {\r\n      current += ch;\r\n    }\r\n  }\r\n  if (current.trim()) args.push(current.trim());\r\n  return args;\r\n}\r\n\r\nfunction parseHashRef(s: string): number | null {\r\n  const m = s.trim().match(/^#(\\d+)$/);\r\n  return m ? parseInt(m[1], 10) : null;\r\n}\r\n\r\nfunction extractArgsString(raw: string | undefined): string | null {\r\n  if (!raw) return null;\r\n  const idx = raw.indexOf(\"(\");\r\n  if (idx < 0) return null;\r\n  const lastParen = raw.lastIndexOf(\")\");\r\n  if (lastParen < 0) return null;\r\n  return raw.substring(idx + 1, lastParen);\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Synchronous chunked file reader — replaces readline (3-5x faster)\r\n// ---------------------------------------------------------------------------\r\nfunction forEachLine(\r\n  fsLike: IfcSplitterFs,\r\n  filePath: string,\r\n  callback: (line: string) => void,\r\n): void {\r\n  const CHUNK = 8 * 1024 * 1024;\r\n  const fd = fsLike.openSync(filePath, \"r\");\r\n  const readBuf = Buffer.allocUnsafe(CHUNK);\r\n  let tail = \"\";\r\n  let bytesRead: number;\r\n  while (\r\n    (bytesRead = fsLike.readSync(fd, readBuf as any, 0, CHUNK, null)) > 0\r\n  ) {\r\n    const chunk = readBuf.toString(\"utf-8\", 0, bytesRead);\r\n    let start = 0;\r\n    let idx = chunk.indexOf(\"\\n\");\r\n    // First line: prepend leftover from previous chunk\r\n    if (idx !== -1) {\r\n      let end = idx;\r\n      if (end > 0 && chunk.charCodeAt(end - 1) === 13) end--;\r\n      callback(\r\n        tail ? tail + chunk.substring(start, end) : chunk.substring(start, end),\r\n      );\r\n      tail = \"\";\r\n      start = idx + 1;\r\n    } else {\r\n      tail += chunk;\r\n      continue;\r\n    }\r\n    // Remaining lines — hot loop, no tail concat needed\r\n    while ((idx = chunk.indexOf(\"\\n\", start)) !== -1) {\r\n      let end = idx;\r\n      if (end > start && chunk.charCodeAt(end - 1) === 13) end--;\r\n      callback(chunk.substring(start, end));\r\n      start = idx + 1;\r\n    }\r\n    if (start < chunk.length) tail = chunk.substring(start);\r\n  }\r\n  if (tail) callback(tail);\r\n  fsLike.closeSync(fd);\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Buffered synchronous file writer — avoids per-line write() syscalls\r\n// ---------------------------------------------------------------------------\r\nclass BufferedWriter {\r\n  private fsLike: IfcSplitterFs;\r\n  private fd: number;\r\n  private buf: Buffer;\r\n  private pos: number;\r\n  private bufSize: number;\r\n\r\n  constructor(fsLike: IfcSplitterFs, filePath: string, bufSize: number) {\r\n    this.fsLike = fsLike;\r\n    this.fd = fsLike.openSync(filePath, \"w\");\r\n    this.buf = Buffer.allocUnsafe(bufSize);\r\n    this.pos = 0;\r\n    this.bufSize = bufSize;\r\n  }\r\n\r\n  write(str: string): void {\r\n    const bytes = Buffer.byteLength(str, \"utf-8\");\r\n    if (this.pos + bytes > this.bufSize) {\r\n      this.flush();\r\n      if (bytes > this.bufSize) {\r\n        this.fsLike.writeSync(this.fd, str);\r\n        return;\r\n      }\r\n    }\r\n    this.pos += this.buf.write(str, this.pos, \"utf-8\");\r\n  }\r\n\r\n  flush(): void {\r\n    if (this.pos > 0) {\r\n      this.fsLike.writeSync(this.fd, this.buf as any, 0, this.pos);\r\n      this.pos = 0;\r\n    }\r\n  }\r\n\r\n  close(): void {\r\n    this.flush();\r\n    this.fsLike.closeSync(this.fd);\r\n  }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Compact line storage: sparse arrays indexed by IFC id\r\n// ---------------------------------------------------------------------------\r\nclass LineIndex {\r\n  types: (string | undefined)[] = [];\r\n  maxId: number = 0;\r\n  private _typeIntern: Map<string, string> = new Map();\r\n  specialRaws: Map<number, string> = new Map();\r\n\r\n  private _refBuf: Int32Array = new Int32Array(4 * 1024 * 1024);\r\n  private _refBufUsed: number = 0;\r\n  private _refStart: (number | undefined)[] = [];\r\n  private _refLen: (number | undefined)[] = [];\r\n\r\n  set(id: number, type: string, refs: number[], raw: string): void {\r\n    let t = this._typeIntern.get(type);\r\n    if (!t) {\r\n      t = type;\r\n      this._typeIntern.set(type, t);\r\n    }\r\n    this.types[id] = t;\r\n    if (id > this.maxId) this.maxId = id;\r\n\r\n    const start = this._refBufUsed;\r\n    const needed = start + refs.length;\r\n    if (needed > this._refBuf.length) {\r\n      const newSize = Math.max(this._refBuf.length * 2, needed);\r\n      const newBuf = new Int32Array(newSize);\r\n      newBuf.set(this._refBuf);\r\n      this._refBuf = newBuf;\r\n    }\r\n    for (let i = 0; i < refs.length; i++) {\r\n      this._refBuf[start + i] = refs[i];\r\n    }\r\n    this._refBufUsed = start + refs.length;\r\n    this._refStart[id] = start;\r\n    this._refLen[id] = refs.length;\r\n\r\n    if (\r\n      t.startsWith(\"IFCREL\") ||\r\n      t === \"IFCSTYLEDITEM\" ||\r\n      t === \"IFCMATERIALDEFINITIONREPRESENTATION\"\r\n    ) {\r\n      this.specialRaws.set(id, raw);\r\n    }\r\n  }\r\n\r\n  finalize(): void {\r\n    this._refBuf = this._refBuf.slice(0, this._refBufUsed);\r\n  }\r\n\r\n  has(id: number): boolean {\r\n    return this.types[id] !== undefined;\r\n  }\r\n\r\n  getType(id: number): string | undefined {\r\n    return this.types[id];\r\n  }\r\n\r\n  getRefs(id: number): Int32Array | null {\r\n    const len = this._refLen[id];\r\n    if (len === undefined) return null;\r\n    const start = this._refStart[id];\r\n    if (start === undefined) return null;\r\n    return this._refBuf.subarray(start, start + len);\r\n  }\r\n\r\n  getRaw(id: number): string | undefined {\r\n    return this.specialRaws.get(id);\r\n  }\r\n\r\n  free(): void {\r\n    // Deliberately null-out fields to reclaim memory before the write pass\r\n    /* eslint-disable @typescript-eslint/no-explicit-any */\r\n    (this as any).types = null;\r\n    (this as any)._refBuf = null;\r\n    (this as any)._refStart = null;\r\n    (this as any)._refLen = null;\r\n    (this as any).specialRaws = null;\r\n  }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Streaming IFC parser\r\n// ---------------------------------------------------------------------------\r\nfunction parseIfc(fsLike: IfcSplitterFs, filePath: string): ParseResult {\r\n  const header: string[] = [];\r\n  const footer: string[] = [];\r\n  const index = new LineIndex();\r\n\r\n  let section: \"header\" | \"data\" | \"footer\" = \"header\";\r\n  let accumulator = \"\";\r\n  let lineCount = 0;\r\n\r\n  console.time(\"parse\");\r\n\r\n  forEachLine(fsLike, filePath, (line: string) => {\r\n    if (section === \"header\") {\r\n      header.push(line);\r\n      if (line.trim() === \"DATA;\") section = \"data\";\r\n      return;\r\n    }\r\n    if (section === \"data\") {\r\n      const trimmed = line.trim();\r\n      if (trimmed === \"ENDSEC;\") {\r\n        if (accumulator) {\r\n          const info = extractId(accumulator);\r\n          if (info) {\r\n            const refs = extractRefs(accumulator, info.id);\r\n            index.set(info.id, info.type, refs, accumulator);\r\n            lineCount++;\r\n          }\r\n          accumulator = \"\";\r\n        }\r\n        section = \"footer\";\r\n        footer.push(line);\r\n        return;\r\n      }\r\n      accumulator += (accumulator ? \" \" : \"\") + trimmed;\r\n      if (accumulator.charCodeAt(accumulator.length - 1) === 59) {\r\n        // ';'\r\n        const info = extractId(accumulator);\r\n        if (info) {\r\n          const refs = extractRefs(accumulator, info.id);\r\n          index.set(info.id, info.type, refs, accumulator);\r\n          lineCount++;\r\n        }\r\n        accumulator = \"\";\r\n      }\r\n      return;\r\n    }\r\n    footer.push(line);\r\n  });\r\n\r\n  index.finalize();\r\n  console.timeEnd(\"parse\");\r\n  console.log(`  Parsed ${lineCount} data lines (max id: ${index.maxId})`);\r\n  return { header, footer, index };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Collect all ids referenced by a given id, recursively.\r\n// Stops at element boundaries to avoid pulling in other groups' elements.\r\n// ---------------------------------------------------------------------------\r\nfunction collectDeps(\r\n  startId: number,\r\n  index: LineIndex,\r\n  visited: Set<number>,\r\n  allElementIds: Set<number>,\r\n): void {\r\n  const stack = [startId];\r\n  while (stack.length > 0) {\r\n    const id = stack.pop()!;\r\n    if (visited.has(id)) continue;\r\n    visited.add(id);\r\n    const refs = index.getRefs(id);\r\n    if (!refs) continue;\r\n    for (let i = 0; i < refs.length; i++) {\r\n      const refId = refs[i];\r\n      if (visited.has(refId)) continue;\r\n      if (allElementIds.has(refId)) continue;\r\n      stack.push(refId);\r\n    }\r\n  }\r\n}\r\n\r\nfunction collectDepsAll(\r\n  startId: number,\r\n  index: LineIndex,\r\n  visited: Set<number>,\r\n): void {\r\n  const stack = [startId];\r\n  while (stack.length > 0) {\r\n    const id = stack.pop()!;\r\n    if (visited.has(id)) continue;\r\n    visited.add(id);\r\n    const refs = index.getRefs(id);\r\n    if (!refs) continue;\r\n    for (let i = 0; i < refs.length; i++) {\r\n      if (!visited.has(refs[i])) stack.push(refs[i]);\r\n    }\r\n  }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Build void/fill coupling map\r\n// ---------------------------------------------------------------------------\r\nfunction buildVoidFillMap(index: LineIndex): VoidFillMap {\r\n  const wallToOpenings = new Map<number, Set<number>>();\r\n  const openingToWall = new Map<number, number>();\r\n  const openingToFillers = new Map<number, Set<number>>();\r\n  const fillerToOpening = new Map<number, number>();\r\n  const relLineIds = new Map<number, Set<number>>();\r\n\r\n  for (let id = 0; id <= index.maxId; id++) {\r\n    const type = index.getType(id);\r\n    if (!type) continue;\r\n\r\n    if (type === \"IFCRELVOIDSELEMENT\") {\r\n      const raw = index.getRaw(id);\r\n      const argsStr = extractArgsString(raw);\r\n      if (argsStr) {\r\n        const args = splitIfcArgs(argsStr);\r\n        if (args.length >= 6) {\r\n          const wallId = parseHashRef(args[4]);\r\n          const openingId = parseHashRef(args[5]);\r\n          if (wallId && openingId) {\r\n            if (!wallToOpenings.has(wallId))\r\n              wallToOpenings.set(wallId, new Set());\r\n            wallToOpenings.get(wallId)!.add(openingId);\r\n            openingToWall.set(openingId, wallId);\r\n            addToSetMap(relLineIds, wallId, id);\r\n            addToSetMap(relLineIds, openingId, id);\r\n          }\r\n        }\r\n      }\r\n    } else if (type === \"IFCRELFILLSELEMENT\") {\r\n      const raw = index.getRaw(id);\r\n      const argsStr = extractArgsString(raw);\r\n      if (argsStr) {\r\n        const args = splitIfcArgs(argsStr);\r\n        if (args.length >= 6) {\r\n          const openingId = parseHashRef(args[4]);\r\n          const fillerId = parseHashRef(args[5]);\r\n          if (openingId && fillerId) {\r\n            if (!openingToFillers.has(openingId))\r\n              openingToFillers.set(openingId, new Set());\r\n            openingToFillers.get(openingId)!.add(fillerId);\r\n            fillerToOpening.set(fillerId, openingId);\r\n            addToSetMap(relLineIds, openingId, id);\r\n            addToSetMap(relLineIds, fillerId, id);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return {\r\n    wallToOpenings,\r\n    openingToWall,\r\n    openingToFillers,\r\n    fillerToOpening,\r\n    relLineIds,\r\n  };\r\n}\r\n\r\nfunction buildAggregateMap(\r\n  index: LineIndex,\r\n  allElementIds: Set<number>,\r\n): AggregateMap {\r\n  const parentToChildren = new Map<number, Set<number>>();\r\n  const childToParent = new Map<number, number>();\r\n  const aggregateRelIds = new Map<number, Set<number>>();\r\n\r\n  for (let id = 0; id <= index.maxId; id++) {\r\n    const type = index.getType(id);\r\n    if (type !== \"IFCRELAGGREGATES\") continue;\r\n\r\n    const raw = index.getRaw(id);\r\n    const argsStr = extractArgsString(raw);\r\n    if (!argsStr) continue;\r\n    const args = splitIfcArgs(argsStr);\r\n    if (args.length < 6) continue;\r\n\r\n    const parentId = parseHashRef(args[4]);\r\n    if (!parentId || !allElementIds.has(parentId)) continue;\r\n\r\n    const childRefs = extractRefs(args[5]);\r\n    const elementChildren = childRefs.filter((r) => allElementIds.has(r));\r\n    if (elementChildren.length === 0) continue;\r\n\r\n    if (!parentToChildren.has(parentId))\r\n      parentToChildren.set(parentId, new Set());\r\n    for (const cid of elementChildren) {\r\n      parentToChildren.get(parentId)!.add(cid);\r\n      childToParent.set(cid, parentId);\r\n      addToSetMap(aggregateRelIds, parentId, id);\r\n      addToSetMap(aggregateRelIds, cid, id);\r\n    }\r\n  }\r\n\r\n  return { parentToChildren, childToParent, aggregateRelIds };\r\n}\r\n\r\nfunction addToSetMap(\r\n  map: Map<number, Set<number>>,\r\n  key: number,\r\n  value: number,\r\n): void {\r\n  if (!map.has(key)) map.set(key, new Set());\r\n  map.get(key)!.add(value);\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Cluster elements that must stay together (void/fill + aggregation)\r\n// ---------------------------------------------------------------------------\r\nfunction getCluster(\r\n  elementId: number,\r\n  vfMap: VoidFillMap,\r\n  aggMap: AggregateMap,\r\n): Set<number> {\r\n  const cluster = new Set([elementId]);\r\n  const queue = [elementId];\r\n\r\n  while (queue.length > 0) {\r\n    const eid = queue.shift()!;\r\n    expandVoidFill(eid, vfMap, cluster, queue);\r\n    expandAggregate(eid, aggMap, cluster, queue);\r\n  }\r\n\r\n  return cluster;\r\n}\r\n\r\nfunction expandVoidFill(\r\n  eid: number,\r\n  vfMap: VoidFillMap,\r\n  cluster: Set<number>,\r\n  queue: number[],\r\n): void {\r\n  function addIfNew(id: number): void {\r\n    if (!cluster.has(id)) {\r\n      cluster.add(id);\r\n      queue.push(id);\r\n    }\r\n  }\r\n\r\n  const openings = vfMap.wallToOpenings.get(eid);\r\n  if (openings) {\r\n    for (const oid of openings) {\r\n      addIfNew(oid);\r\n      const fillers = vfMap.openingToFillers.get(oid);\r\n      if (fillers) for (const fid of fillers) addIfNew(fid);\r\n    }\r\n  }\r\n\r\n  const oid2 = vfMap.fillerToOpening.get(eid);\r\n  if (oid2) {\r\n    addIfNew(oid2);\r\n    const wallId = vfMap.openingToWall.get(oid2);\r\n    if (wallId) addIfNew(wallId);\r\n  }\r\n\r\n  const wallId2 = vfMap.openingToWall.get(eid);\r\n  if (wallId2) addIfNew(wallId2);\r\n}\r\n\r\nfunction expandAggregate(\r\n  eid: number,\r\n  aggMap: AggregateMap,\r\n  cluster: Set<number>,\r\n  queue: number[],\r\n): void {\r\n  function addIfNew(id: number): void {\r\n    if (!cluster.has(id)) {\r\n      cluster.add(id);\r\n      queue.push(id);\r\n    }\r\n  }\r\n\r\n  const children = aggMap.parentToChildren.get(eid);\r\n  if (children) {\r\n    for (const cid of children) addIfNew(cid);\r\n  }\r\n\r\n  const parentId = aggMap.childToParent.get(eid);\r\n  if (parentId) {\r\n    addIfNew(parentId);\r\n    const siblings = aggMap.parentToChildren.get(parentId);\r\n    if (siblings) {\r\n      for (const sid of siblings) addIfNew(sid);\r\n    }\r\n  }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Build reverse style maps\r\n// ---------------------------------------------------------------------------\r\nfunction buildStyleMaps(index: LineIndex): StyleMaps {\r\n  const geomToStyledItems = new Map<number, number[]>();\r\n  const materialToDefReps = new Map<number, number[]>();\r\n\r\n  for (let id = 0; id <= index.maxId; id++) {\r\n    const type = index.getType(id);\r\n    if (!type) continue;\r\n\r\n    if (type === \"IFCSTYLEDITEM\") {\r\n      const raw = index.getRaw(id);\r\n      const argsStr = extractArgsString(raw);\r\n      if (!argsStr) continue;\r\n      const args = splitIfcArgs(argsStr);\r\n      if (args.length >= 1) {\r\n        const geomRef = parseHashRef(args[0]);\r\n        if (geomRef) {\r\n          if (!geomToStyledItems.has(geomRef))\r\n            geomToStyledItems.set(geomRef, []);\r\n          geomToStyledItems.get(geomRef)!.push(id);\r\n        }\r\n      }\r\n    } else if (type === \"IFCMATERIALDEFINITIONREPRESENTATION\") {\r\n      const raw = index.getRaw(id);\r\n      const argsStr = extractArgsString(raw);\r\n      if (!argsStr) continue;\r\n      const args = splitIfcArgs(argsStr);\r\n      if (args.length >= 4) {\r\n        const matRef = parseHashRef(args[3]);\r\n        if (matRef) {\r\n          if (!materialToDefReps.has(matRef)) materialToDefReps.set(matRef, []);\r\n          materialToDefReps.get(matRef)!.push(id);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return { geomToStyledItems, materialToDefReps };\r\n}\r\n\r\nfunction resolveStyles(\r\n  fileIds: Set<number>,\r\n  index: LineIndex,\r\n  styleMaps: StyleMaps,\r\n  allElementIds: Set<number>,\r\n): void {\r\n  for (const [geomId, styledItemIds] of styleMaps.geomToStyledItems) {\r\n    if (fileIds.has(geomId)) {\r\n      for (const sid of styledItemIds) {\r\n        collectDeps(sid, index, fileIds, allElementIds);\r\n      }\r\n    }\r\n  }\r\n  for (const [matId, defRepIds] of styleMaps.materialToDefReps) {\r\n    if (fileIds.has(matId)) {\r\n      for (const mid of defRepIds) {\r\n        collectDeps(mid, index, fileIds, allElementIds);\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Main split logic\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Split an IFC file into N roughly equal groups of building elements.\r\n * @param inputPath - Absolute or relative path to the source IFC file.\r\n * @param numGroups - Number of output files to produce (max 32).\r\n * @param outputDir - Directory for output files. Defaults to `output/` next to the input file.\r\n */\r\nexport function split(\r\n  deps: IfcSplitterDeps,\r\n  inputPath: string,\r\n  numGroups: number,\r\n  outputDir?: string,\r\n): void {\r\n  const { fs, path } = deps;\r\n  if (!fs.existsSync(inputPath)) {\r\n    console.error(`File not found: ${inputPath}`);\r\n    process.exit(1);\r\n  }\r\n\r\n  const resolvedOutputDir =\r\n    outputDir || path.join(path.dirname(inputPath), \"output\");\r\n  fs.mkdirSync(resolvedOutputDir, { recursive: true });\r\n\r\n  // 1. Parse\r\n  const { header, footer, index } = parseIfc(fs, inputPath);\r\n\r\n  // 2. Identify spatial structure (shared in all files)\r\n  console.time(\"spatial\");\r\n  const spatialIds = new Set<number>();\r\n  for (let id = 0; id <= index.maxId; id++) {\r\n    const type = index.getType(id);\r\n    if (type && SPATIAL_TYPES.has(type)) spatialIds.add(id);\r\n  }\r\n  const sharedIds = new Set<number>();\r\n  for (const sid of spatialIds) {\r\n    collectDepsAll(sid, index, sharedIds);\r\n  }\r\n  for (let id = 0; id <= index.maxId; id++) {\r\n    const type = index.getType(id);\r\n    if (type === \"IFCRELAGGREGATES\") {\r\n      const raw = index.getRaw(id);\r\n      const argsStr = extractArgsString(raw);\r\n      if (argsStr) {\r\n        const args = splitIfcArgs(argsStr);\r\n        if (args.length >= 6) {\r\n          const relatingId = parseHashRef(args[4]);\r\n          if (relatingId && spatialIds.has(relatingId)) {\r\n            const listRefs = extractRefs(args[5]);\r\n            if (listRefs.every((r) => spatialIds.has(r))) {\r\n              collectDepsAll(id, index, sharedIds);\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  console.timeEnd(\"spatial\");\r\n  console.log(`  Shared infrastructure: ${sharedIds.size} lines`);\r\n\r\n  // 3. Build void/fill coupling map\r\n  console.time(\"voidfill\");\r\n  const vfMap = buildVoidFillMap(index);\r\n  console.timeEnd(\"voidfill\");\r\n  console.log(\r\n    `  Void rels: ${vfMap.wallToOpenings.size} walls with openings, ${vfMap.fillerToOpening.size} fillers`,\r\n  );\r\n\r\n  // 3b. Build reverse style maps\r\n  console.time(\"stylemaps\");\r\n  const styleMaps = buildStyleMaps(index);\r\n  console.timeEnd(\"stylemaps\");\r\n  console.log(\r\n    `  Style maps: ${styleMaps.geomToStyledItems.size} styled geometries, ${styleMaps.materialToDefReps.size} material representations`,\r\n  );\r\n\r\n  // 4. Identify all building elements\r\n  console.time(\"classify\");\r\n  const allElementIds = new Set<number>();\r\n  for (let id = 0; id <= index.maxId; id++) {\r\n    const type = index.getType(id);\r\n    if (type && ELEMENT_TYPES.has(type)) allElementIds.add(id);\r\n  }\r\n  console.timeEnd(\"classify\");\r\n  console.log(`  Found ${allElementIds.size} building elements`);\r\n\r\n  // 4b. Build aggregation map\r\n  console.time(\"aggregate\");\r\n  const aggMap = buildAggregateMap(index, allElementIds);\r\n  console.timeEnd(\"aggregate\");\r\n  console.log(\r\n    `  Aggregate rels: ${aggMap.parentToChildren.size} parents, ${aggMap.childToParent.size} children`,\r\n  );\r\n\r\n  // 5. Build clusters\r\n  console.time(\"cluster\");\r\n  const clusters: Set<number>[] = [];\r\n  const assigned = new Set<number>();\r\n  for (const eid of allElementIds) {\r\n    if (assigned.has(eid)) continue;\r\n    const cluster = getCluster(eid, vfMap, aggMap);\r\n    const elementCluster = new Set<number>();\r\n    for (const cid of cluster) {\r\n      if (allElementIds.has(cid)) elementCluster.add(cid);\r\n    }\r\n    clusters.push(elementCluster);\r\n    for (const cid of elementCluster) assigned.add(cid);\r\n  }\r\n  console.timeEnd(\"cluster\");\r\n  console.log(`  Built ${clusters.length} clusters`);\r\n\r\n  // 6. Distribute clusters into N groups (greedy bin packing)\r\n  console.time(\"distribute\");\r\n  const groups: Set<number>[] = Array.from(\r\n    { length: numGroups },\r\n    () => new Set(),\r\n  );\r\n  const clusterOrder = clusters\r\n    .map((_, i) => i)\r\n    .sort((a, b) => clusters[b].size - clusters[a].size);\r\n  const groupSizes = new Array<number>(numGroups).fill(0);\r\n\r\n  for (const ci of clusterOrder) {\r\n    let minIdx = 0;\r\n    for (let g = 1; g < numGroups; g++) {\r\n      if (groupSizes[g] < groupSizes[minIdx]) minIdx = g;\r\n    }\r\n    for (const id of clusters[ci]) groups[minIdx].add(id);\r\n    groupSizes[minIdx] += clusters[ci].size;\r\n  }\r\n  console.timeEnd(\"distribute\");\r\n\r\n  // 7. Pre-parse all IFCREL* lines for rewriting\r\n  console.time(\"index-rels\");\r\n  const relEntries: RelEntry[] = [];\r\n  for (let id = 0; id <= index.maxId; id++) {\r\n    const type = index.getType(id);\r\n    if (\r\n      type &&\r\n      type.startsWith(\"IFCREL\") &&\r\n      type !== \"IFCRELVOIDSELEMENT\" &&\r\n      type !== \"IFCRELFILLSELEMENT\"\r\n    ) {\r\n      const raw = index.getRaw(id);\r\n      const argsStr = extractArgsString(raw);\r\n      if (!argsStr) continue;\r\n      const args = splitIfcArgs(argsStr);\r\n      const listIdx = type === \"IFCRELAGGREGATES\" ? 5 : 4;\r\n      if (args.length <= listIdx) continue;\r\n      const listRefs = extractRefs(args[listIdx]);\r\n      if (listRefs.length === 0) continue;\r\n      const idMatch = raw!.match(/^(#\\d+\\s*=\\s*)/);\r\n      if (!idMatch) continue;\r\n      relEntries.push({\r\n        id,\r\n        type,\r\n        args,\r\n        listIdx,\r\n        listRefs,\r\n        idPrefix: idMatch[1],\r\n      });\r\n    }\r\n  }\r\n  console.timeEnd(\"index-rels\");\r\n  console.log(`  Found ${relEntries.length} relationship lines to process`);\r\n\r\n  // 8. Resolve deps for all groups\r\n  console.time(\"resolve\");\r\n  const groupsData: (GroupData | null)[] = [];\r\n\r\n  for (let g = 0; g < numGroups; g++) {\r\n    const groupElementIds = groups[g];\r\n    if (groupElementIds.size === 0) {\r\n      groupsData.push(null);\r\n      console.log(`  Group ${g + 1}: SKIPPED (empty)`);\r\n      continue;\r\n    }\r\n\r\n    const fileIds = new Set<number>(sharedIds);\r\n\r\n    for (const eid of groupElementIds) {\r\n      collectDeps(eid, index, fileIds, allElementIds);\r\n    }\r\n\r\n    for (const eid of groupElementIds) {\r\n      const rels = vfMap.relLineIds.get(eid);\r\n      if (rels) {\r\n        for (const rid of rels) {\r\n          collectDeps(rid, index, fileIds, allElementIds);\r\n        }\r\n      }\r\n      const aggRels = aggMap.aggregateRelIds.get(eid);\r\n      if (aggRels) {\r\n        for (const rid of aggRels) {\r\n          collectDeps(rid, index, fileIds, allElementIds);\r\n        }\r\n      }\r\n    }\r\n\r\n    resolveStyles(fileIds, index, styleMaps, allElementIds);\r\n\r\n    const rewrittenLines = new Map<number, string>();\r\n    for (const rel of relEntries) {\r\n      const filtered = rel.listRefs.filter((r) => groupElementIds.has(r));\r\n      if (filtered.length === 0) continue;\r\n      const newList = `(${filtered.map((r) => `#${r}`).join(\",\")})`;\r\n      const newArgs = [...rel.args];\r\n      newArgs[rel.listIdx] = newList;\r\n      const rewritten = `${rel.idPrefix}${rel.type}(${newArgs.join(\",\")});`;\r\n      rewrittenLines.set(rel.id, rewritten);\r\n      fileIds.add(rel.id);\r\n      const refs = index.getRefs(rel.id);\r\n      if (refs) {\r\n        for (const rid of refs) {\r\n          if (!allElementIds.has(rid)) {\r\n            collectDeps(rid, index, fileIds, allElementIds);\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    const totalIds = fileIds.size;\r\n    groupsData.push({\r\n      fileIds,\r\n      rewrittenLines,\r\n      elementCount: groupElementIds.size,\r\n      totalIds,\r\n    });\r\n    console.log(\r\n      `  Group ${g + 1}: ${groupElementIds.size} elements, ${totalIds} total IDs`,\r\n    );\r\n  }\r\n\r\n  console.timeEnd(\"resolve\");\r\n\r\n  // Free the index to reclaim memory before the output pass\r\n  const maxParsedId = index.maxId;\r\n  index.free();\r\n\r\n  // 9. Build Uint32Array bitmask for O(1) write-phase lookups\r\n  console.time(\"build-mask\");\r\n  const idGroupMask = new Uint32Array(maxParsedId + 1);\r\n  for (let g = 0; g < numGroups; g++) {\r\n    if (!groupsData[g]) continue;\r\n    const bit = 1 << g;\r\n    for (const id of groupsData[g]!.fileIds!) {\r\n      idGroupMask[id] |= bit;\r\n    }\r\n  }\r\n  for (let g = 0; g < numGroups; g++) {\r\n    if (groupsData[g]) groupsData[g]!.fileIds = null;\r\n  }\r\n  console.timeEnd(\"build-mask\");\r\n\r\n  // 10. Second pass: write output files\r\n  console.time(\"write\");\r\n  writeOutputFiles(\r\n    deps,\r\n    inputPath,\r\n    resolvedOutputDir,\r\n    header,\r\n    footer,\r\n    groupsData,\r\n    idGroupMask,\r\n  );\r\n  console.timeEnd(\"write\");\r\n\r\n  console.log(\"\\nDone!\");\r\n}\r\n\r\n/**\r\n * Extract specific building elements from an IFC file into a new IFC file.\r\n * @param inputPath  - Absolute or relative path to the source IFC file.\r\n * @param elementIds - Array of IFC entity IDs (`#id`) for the building elements to extract. Non-element or missing IDs are skipped with a warning.\r\n * @param outputPath - Path for the output IFC file.\r\n */\r\nexport function extract(\r\n  deps: IfcSplitterDeps,\r\n  inputPath: string,\r\n  elementIds: number[],\r\n  outputPath: string,\r\n): void {\r\n  const { fs, path } = deps;\r\n  if (!fs.existsSync(inputPath)) {\r\n    console.error(`File not found: ${inputPath}`);\r\n    process.exit(1);\r\n  }\r\n\r\n  const outputDir = path.dirname(outputPath);\r\n  fs.mkdirSync(outputDir, { recursive: true });\r\n\r\n  // 1. Parse\r\n  const { header, footer, index } = parseIfc(fs, inputPath);\r\n\r\n  // 2. Identify spatial structure (shared)\r\n  console.time(\"spatial\");\r\n  const spatialIds = new Set<number>();\r\n  for (let id = 0; id <= index.maxId; id++) {\r\n    const type = index.getType(id);\r\n    if (type && SPATIAL_TYPES.has(type)) spatialIds.add(id);\r\n  }\r\n  const sharedIds = new Set<number>();\r\n  for (const sid of spatialIds) {\r\n    collectDepsAll(sid, index, sharedIds);\r\n  }\r\n  for (let id = 0; id <= index.maxId; id++) {\r\n    const type = index.getType(id);\r\n    if (type === \"IFCRELAGGREGATES\") {\r\n      const raw = index.getRaw(id);\r\n      const argsStr = extractArgsString(raw);\r\n      if (argsStr) {\r\n        const args = splitIfcArgs(argsStr);\r\n        if (args.length >= 6) {\r\n          const relatingId = parseHashRef(args[4]);\r\n          if (relatingId && spatialIds.has(relatingId)) {\r\n            const listRefs = extractRefs(args[5]);\r\n            if (listRefs.every((r) => spatialIds.has(r))) {\r\n              collectDepsAll(id, index, sharedIds);\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  console.timeEnd(\"spatial\");\r\n\r\n  // 3. Build maps\r\n  const vfMap = buildVoidFillMap(index);\r\n  const styleMaps = buildStyleMaps(index);\r\n  const allElementIds = new Set<number>();\r\n  for (let id = 0; id <= index.maxId; id++) {\r\n    const type = index.getType(id);\r\n    if (type && ELEMENT_TYPES.has(type)) allElementIds.add(id);\r\n  }\r\n\r\n  // Validate requested IDs\r\n  const requestedIds = new Set<number>();\r\n  for (const eid of elementIds) {\r\n    if (allElementIds.has(eid)) {\r\n      requestedIds.add(eid);\r\n    } else if (index.has(eid)) {\r\n      console.warn(\r\n        `  Warning: #${eid} exists but is not a building element (type: ${index.getType(eid)}), skipping`,\r\n      );\r\n    } else {\r\n      console.warn(`  Warning: #${eid} not found in file, skipping`);\r\n    }\r\n  }\r\n  if (requestedIds.size === 0) {\r\n    console.error(\"No valid element IDs to extract.\");\r\n    return;\r\n  }\r\n  console.log(`  Extracting ${requestedIds.size} elements`);\r\n\r\n  // 4. Cluster: expand void/fill + aggregation for requested elements\r\n  const aggMap = buildAggregateMap(index, allElementIds);\r\n  const groupElementIds = new Set<number>(requestedIds);\r\n  for (const eid of requestedIds) {\r\n    const cluster = getCluster(eid, vfMap, aggMap);\r\n    for (const cid of cluster) {\r\n      if (allElementIds.has(cid)) groupElementIds.add(cid);\r\n    }\r\n  }\r\n  if (groupElementIds.size > requestedIds.size) {\r\n    console.log(\r\n      `  Expanded to ${groupElementIds.size} elements (void/fill + aggregation coupling)`,\r\n    );\r\n  }\r\n\r\n  // 5. Collect all dependencies\r\n  const fileIds = new Set<number>(sharedIds);\r\n  for (const eid of groupElementIds) {\r\n    collectDeps(eid, index, fileIds, allElementIds);\r\n  }\r\n  for (const eid of groupElementIds) {\r\n    const rels = vfMap.relLineIds.get(eid);\r\n    if (rels) {\r\n      for (const rid of rels) collectDeps(rid, index, fileIds, allElementIds);\r\n    }\r\n    const aggRels = aggMap.aggregateRelIds.get(eid);\r\n    if (aggRels) {\r\n      for (const rid of aggRels)\r\n        collectDeps(rid, index, fileIds, allElementIds);\r\n    }\r\n  }\r\n  resolveStyles(fileIds, index, styleMaps, allElementIds);\r\n\r\n  // 6. Rewrite relationship lines\r\n  const rewrittenLines = new Map<number, string>();\r\n  for (let id = 0; id <= index.maxId; id++) {\r\n    const type = index.getType(id);\r\n    if (\r\n      type &&\r\n      type.startsWith(\"IFCREL\") &&\r\n      type !== \"IFCRELVOIDSELEMENT\" &&\r\n      type !== \"IFCRELFILLSELEMENT\"\r\n    ) {\r\n      const raw = index.getRaw(id);\r\n      const argsStr = extractArgsString(raw);\r\n      if (!argsStr) continue;\r\n      const args = splitIfcArgs(argsStr);\r\n      const listIdx = type === \"IFCRELAGGREGATES\" ? 5 : 4;\r\n      if (args.length <= listIdx) continue;\r\n      const listRefs = extractRefs(args[listIdx]);\r\n      if (listRefs.length === 0) continue;\r\n\r\n      const filtered = listRefs.filter((r) => groupElementIds.has(r));\r\n      if (filtered.length === 0) continue;\r\n\r\n      const idMatch = raw!.match(/^(#\\d+\\s*=\\s*)/);\r\n      if (!idMatch) continue;\r\n      const newList = `(${filtered.map((r) => `#${r}`).join(\",\")})`;\r\n      const newArgs = [...args];\r\n      newArgs[listIdx] = newList;\r\n      rewrittenLines.set(id, `${idMatch[1]}${type}(${newArgs.join(\",\")});`);\r\n      fileIds.add(id);\r\n      const refs = index.getRefs(id);\r\n      if (refs) {\r\n        for (const rid of refs) {\r\n          if (!allElementIds.has(rid))\r\n            collectDeps(rid, index, fileIds, allElementIds);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  console.log(`  Total lines in output: ${fileIds.size}`);\r\n\r\n  // 7. Free index, write output\r\n  // const maxParsedId = index.maxId;\r\n  index.free();\r\n\r\n  // Build simple inclusion set\r\n  const includeSet = new Set<number>(fileIds);\r\n\r\n  console.time(\"write\");\r\n  const bw = new BufferedWriter(fs, outputPath, 4 * 1024 * 1024);\r\n  bw.write(`${header.join(\"\\n\")}\\n`);\r\n\r\n  let section: \"header\" | \"data\" | \"footer\" = \"header\";\r\n  let accumulator = \"\";\r\n\r\n  forEachLine(fs, inputPath, (line: string) => {\r\n    if (section === \"header\") {\r\n      if (line.trim() === \"DATA;\") section = \"data\";\r\n      return;\r\n    }\r\n    if (section === \"data\") {\r\n      const trimmed = line.trim();\r\n      if (trimmed === \"ENDSEC;\") {\r\n        if (accumulator) {\r\n          emitSingleLine(accumulator, bw, includeSet, rewrittenLines);\r\n          accumulator = \"\";\r\n        }\r\n        section = \"footer\";\r\n        return;\r\n      }\r\n\r\n      if (!accumulator && trimmed.charCodeAt(trimmed.length - 1) === 59) {\r\n        emitSingleLine(trimmed, bw, includeSet, rewrittenLines);\r\n        return;\r\n      }\r\n\r\n      accumulator += (accumulator ? \" \" : \"\") + trimmed;\r\n      if (accumulator.charCodeAt(accumulator.length - 1) === 59) {\r\n        emitSingleLine(accumulator, bw, includeSet, rewrittenLines);\r\n        accumulator = \"\";\r\n      }\r\n    }\r\n  });\r\n\r\n  bw.write(`${footer.join(\"\\n\")}\\n`);\r\n  bw.close();\r\n  console.timeEnd(\"write\");\r\n\r\n  const stat = fs.statSync(outputPath);\r\n  console.log(\r\n    `  Output: ${groupElementIds.size} elements, ${fileIds.size} total lines, ${(stat.size / 1024 / 1024).toFixed(1)} MB -> ${path.basename(outputPath)}`,\r\n  );\r\n  console.log(\"\\nDone!\");\r\n}\r\n\r\nfunction emitSingleLine(\r\n  raw: string,\r\n  writer: BufferedWriter,\r\n  includeSet: Set<number>,\r\n  rewrittenLines: Map<number, string>,\r\n): void {\r\n  if (raw.charCodeAt(0) !== 35) return; // '#'\r\n  let id = 0;\r\n  for (let i = 1; i < raw.length; i++) {\r\n    const c = raw.charCodeAt(i);\r\n    if (c >= 48 && c <= 57) {\r\n      id = id * 10 + (c - 48);\r\n    } else {\r\n      break;\r\n    }\r\n  }\r\n  if (id === 0 || !includeSet.has(id)) return;\r\n  const line = rewrittenLines.has(id) ? rewrittenLines.get(id)! : raw;\r\n  writer.write(line);\r\n  writer.write(\"\\n\");\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Second-pass output writer\r\n// ---------------------------------------------------------------------------\r\nfunction writeOutputFiles(\r\n  deps: IfcSplitterDeps,\r\n  inputPath: string,\r\n  outputDir: string,\r\n  header: string[],\r\n  footer: string[],\r\n  groupsData: (GroupData | null)[],\r\n  idGroupMask: Uint32Array,\r\n): void {\r\n  const { fs, path } = deps;\r\n  const numGroups = groupsData.length;\r\n\r\n  const writers: (BufferedWriter | null)[] = [];\r\n  const headerStr = `${header.join(\"\\n\")}\\n`;\r\n  for (let g = 0; g < numGroups; g++) {\r\n    if (!groupsData[g]) {\r\n      writers.push(null);\r\n      continue;\r\n    }\r\n    const outName = path.join(\r\n      outputDir,\r\n      `split_${String(g + 1).padStart(3, \"0\")}.ifc`,\r\n    );\r\n    const bw = new BufferedWriter(fs, outName, 4 * 1024 * 1024);\r\n    bw.write(headerStr);\r\n    writers.push(bw);\r\n  }\r\n\r\n  let section: \"header\" | \"data\" | \"footer\" = \"header\";\r\n  let accumulator = \"\";\r\n\r\n  forEachLine(fs, inputPath, (line: string) => {\r\n    if (section === \"header\") {\r\n      if (line.trim() === \"DATA;\") section = \"data\";\r\n      return;\r\n    }\r\n    if (section === \"data\") {\r\n      const trimmed = line.trim();\r\n      if (trimmed === \"ENDSEC;\") {\r\n        if (accumulator) {\r\n          emitLine(accumulator, writers, groupsData, idGroupMask);\r\n          accumulator = \"\";\r\n        }\r\n        section = \"footer\";\r\n        return;\r\n      }\r\n\r\n      if (!accumulator && trimmed.charCodeAt(trimmed.length - 1) === 59) {\r\n        emitLine(trimmed, writers, groupsData, idGroupMask);\r\n        return;\r\n      }\r\n\r\n      accumulator += (accumulator ? \" \" : \"\") + trimmed;\r\n      if (accumulator.charCodeAt(accumulator.length - 1) === 59) {\r\n        emitLine(accumulator, writers, groupsData, idGroupMask);\r\n        accumulator = \"\";\r\n      }\r\n    }\r\n  });\r\n\r\n  const footerStr = `${footer.join(\"\\n\")}\\n`;\r\n  for (let g = 0; g < numGroups; g++) {\r\n    const bw = writers[g];\r\n    if (!bw) continue;\r\n    bw.write(footerStr);\r\n    bw.close();\r\n    const outName = path.join(\r\n      outputDir,\r\n      `split_${String(g + 1).padStart(3, \"0\")}.ifc`,\r\n    );\r\n    const stat = fs.statSync(outName);\r\n    const gd = groupsData[g]!;\r\n    console.log(\r\n      `  Group ${g + 1}: ${gd.elementCount} elements, ${gd.totalIds} total lines, ${(stat.size / 1024 / 1024).toFixed(1)} MB -> ${path.basename(outName)}`,\r\n    );\r\n  }\r\n}\r\n\r\nfunction emitLine(\r\n  raw: string,\r\n  writers: (BufferedWriter | null)[],\r\n  groupsData: (GroupData | null)[],\r\n  idGroupMask: Uint32Array,\r\n): void {\r\n  if (raw.charCodeAt(0) !== 35) return; // '#'\r\n  let id = 0;\r\n  for (let i = 1; i < raw.length; i++) {\r\n    const c = raw.charCodeAt(i);\r\n    if (c >= 48 && c <= 57) {\r\n      id = id * 10 + (c - 48);\r\n    } else {\r\n      break;\r\n    }\r\n  }\r\n  if (id === 0 || id >= idGroupMask.length) return;\r\n\r\n  const mask = idGroupMask[id];\r\n  if (mask === 0) return;\r\n\r\n  for (let g = 0; g < groupsData.length; g++) {\r\n    if (!(mask & (1 << g))) continue;\r\n    const gd = groupsData[g]!;\r\n    const line = gd.rewrittenLines.has(id) ? gd.rewrittenLines.get(id)! : raw;\r\n    writers[g]!.write(line);\r\n    writers[g]!.write(\"\\n\");\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { LodMaterial, LODMesh } from \"../lod\";\r\nimport { RenderedFaces, RepresentationClass } from \"../../../Schema\";\r\nimport { FragmentsModel } from \"./fragments-model\";\r\n\r\n/**\r\n * Interface representing a change event when attributes are deleted from a model item.\r\n */\r\ninterface AttrsDeleteChange {\r\n  /** Indicates this is a \"deleted\" type change */\r\n  type: \"deleted\";\r\n}\r\n\r\n/**\r\n * Interface representing a change event when attributes are added to a model item.\r\n */\r\ninterface AttrsAddChange {\r\n  /** Indicates this is an \"added\" type change */\r\n  type: \"added\";\r\n  /** Record containing the newly added attribute data */\r\n  data: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Interface representing a change event when attributes are modified in a model item.\r\n */\r\ninterface AttrsModifyChange {\r\n  /** Indicates this is a \"modified\" type change */\r\n  type: \"modified\";\r\n  /** Record containing the newly added attribute data */\r\n  added: Record<string, any>;\r\n  /** Array of strings representing the deleted attribute keys */\r\n  deleted: string[];\r\n  /** Record containing the modified attribute data */\r\n  modified: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Union type representing all possible attribute change types.\r\n */\r\nexport type AttrsChange =\r\n  | AttrsDeleteChange\r\n  | AttrsModifyChange\r\n  | AttrsAddChange;\r\n\r\n/**\r\n * Interface representing a change event when relations are modified in a model item.\r\n */\r\nexport interface RelsModifyChange {\r\n  /** Indicates this is a \"modified\" type change */\r\n  type: \"modified\";\r\n  /** Record containing the newly added relation data */\r\n  added: Record<string, Set<number>>;\r\n  /** Set of strings representing the deleted relation keys */\r\n  deleted: Set<string>;\r\n  /** Record containing the removed relation data */\r\n  removed: Record<string, Set<number>>;\r\n  /** Record containing the modified relation data */\r\n  modified: Record<string, Set<number>>;\r\n}\r\n\r\n/**\r\n * Union type representing all possible relation change types.\r\n */\r\nexport type RelsChange = RelsModifyChange;\r\n\r\n/**\r\n * Type representing a unique identifier for a model item. This can be either a string or a number.\r\n */\r\nexport type Identifier = string | number;\r\n\r\n/**\r\n * Interface representing the attributes of a model item.\r\n */\r\nexport interface Attributes {\r\n  /** Unique local identifier for the item */\r\n  localId: number;\r\n  /** Optional category identifier */\r\n  category?: number;\r\n  /** Optional globally unique identifier */\r\n  guid?: string;\r\n  /** Additional arbitrary attributes can be added with any name and value */\r\n  [name: string]: any;\r\n}\r\n\r\n/**\r\n * Represents attribute data for a model item.\r\n */\r\nexport type AttributeData = {\r\n  /** The value of the attribute, which can be any type */\r\n  value: any;\r\n  /** Optional type identifier for the attribute value */\r\n  type?: number;\r\n};\r\n\r\n/**\r\n * Union type representing all possible material types.\r\n */\r\nexport type BIMMaterial = LodMaterial | THREE.MeshLambertMaterial;\r\n\r\n/**\r\n * Interface representing the definition of a material.\r\n */\r\nexport type MaterialDefinition = {\r\n  /** The color of the material */\r\n  color: THREE.Color;\r\n  /** The faces rendered by the material */\r\n  renderedFaces: RenderedFaces;\r\n  /** The opacity of the material */\r\n  opacity: number;\r\n  /** Whether the material is transparent */\r\n  transparent: boolean;\r\n  /**\r\n   * Internal flag to preserve base material properties when applying highlights.\r\n   * When true, only explicitly set properties (like color or opacity) are applied.\r\n   */\r\n  preserveOriginalMaterial?: boolean;\r\n  /** An optional custom ID for the material */\r\n  customId?: string;\r\n  /**\r\n   * Whether to have depth test enabled when rendering this material.\r\n   * @default true\r\n   */\r\n  depthTest?: boolean;\r\n\r\n  /**\r\n   * Whether to write to the depth buffer. Set to false for transparent objects\r\n   * that shouldn't occlude other geometry\r\n   * @default true\r\n   */\r\n  depthWrite?: boolean;\r\n\r\n  /** The local ID of the material */\r\n  localId?: number;\r\n  \r\n  /**\r\n   * Internal array tracking which properties were explicitly set by the caller.\r\n   * Used with preserveOriginalMaterial to avoid overwriting original material \r\n   * properties with default values during serialization.\r\n   */\r\n  _explicitProps?: string[];\r\n};\r\nexport interface MaterialData {\r\n  data: MaterialDefinition;\r\n  transparent?: boolean;\r\n  instancing?: boolean;\r\n}\r\n\r\n/**\r\n * The maximum value for a 2-byte unsigned integer.\r\n */\r\nexport const limitOf2Bytes = 0x10000;\r\n\r\nexport enum ObjectClass {\r\n  LINE = 0,\r\n  SHELL = 1,\r\n}\r\n\r\nexport enum TileRequestClass {\r\n  UPDATE = 0,\r\n  CREATE = 1,\r\n  DELETE = 2,\r\n  FINISH = 3,\r\n}\r\n\r\n/**\r\n * Enum representing the current level of detail (LOD) for a mesh.\r\n */\r\nexport const enum CurrentLod {\r\n  /** Represents the full geometry of the model */\r\n  GEOMETRY = 0,\r\n  /** Represents the wireframe representation of the model */\r\n  WIRES = 1,\r\n  /** Represents the invisible representation of the model */\r\n  INVISIBLE = 2,\r\n}\r\n\r\nexport enum MultiThreadingRequestClass {\r\n  CREATE_MODEL = 0,\r\n  DELETE_MODEL = 1,\r\n  EXECUTE = 2,\r\n  RAYCAST = 3,\r\n  FETCH_BOXES = 4,\r\n  REFRESH_VIEW = 5,\r\n  RECOMPUTE_MESHES = 6,\r\n  CREATE_MATERIAL = 7,\r\n  THROW_ERROR = 8,\r\n  LOAD_PROGRESS = 9,\r\n  ABORT_MODEL = 10,\r\n}\r\n\r\n/**\r\n * Error thrown when a model load is aborted via `FragmentsModels.abort()`.\r\n */\r\nexport class LoadAbortedError extends Error {\r\n  constructor(modelId: string) {\r\n    super(`Fragments: Load of model \"${modelId}\" was aborted.`);\r\n    this.name = \"LoadAbortedError\";\r\n  }\r\n}\r\n\r\n/**\r\n * Progress event emitted during model loading.\r\n */\r\nexport type LoadProgressEvent = {\r\n  /** The model this progress event belongs to. */\r\n  modelId: string;\r\n  /** Current loading stage. */\r\n  stage: \"decompressing\" | \"parsing\" | \"generating\" | \"done\";\r\n  /** Progress within the current stage, from 0 to 1. */\r\n  progress: number;\r\n};\r\n\r\n/**\r\n * Enum representing the configuration class for an item in a Fragments model.\r\n */\r\nexport enum ItemConfigClass {\r\n  /** Represents the visibility configuration for an item */\r\n  VISIBLE = 0,\r\n}\r\n\r\n/**\r\n * Enum representing the snapping class for a raycast operation.\r\n */\r\nexport enum SnappingClass {\r\n  /** Represents a point snapping class */\r\n  POINT = 0,\r\n  /** Represents a line snapping class */\r\n  LINE = 1,\r\n  /** Represents a face snapping class */\r\n  FACE = 2,\r\n}\r\n\r\n/**\r\n * Interface representing a map of model IDs to their corresponding local IDs.\r\n */\r\nexport interface ModelIdMap {\r\n  [key: string]: number[] | undefined;\r\n}\r\n\r\n/**\r\n * Union type representing all possible data buffer types.\r\n */\r\nexport type DataBuffer =\r\n  | Float32Array\r\n  | Uint8ClampedArray\r\n  | Int32Array\r\n  | Uint8Array\r\n  | Uint32Array\r\n  | Float64Array\r\n  | Int8Array\r\n  | Uint16Array\r\n  | Int16Array;\r\n\r\n/**\r\n * Union type representing all possible mesh types.\r\n */\r\nexport type BIMMesh = THREE.Mesh | LODMesh;\r\n\r\n/**\r\n * Interface representing the data of a mesh.\r\n */\r\nexport type MeshData = {\r\n  /** The transformation matrix of the mesh */\r\n  transform: THREE.Matrix4;\r\n  /** The sample ID of the mesh */\r\n  sampleId?: number;\r\n  /** The indices of the mesh */\r\n  indices?: Uint8Array | Uint16Array | Uint32Array;\r\n  /** The positions of the mesh */\r\n  positions?: Float32Array | Float64Array;\r\n  /** The normals of the mesh */\r\n  normals?: Int16Array;\r\n  /** The local ID of the mesh */\r\n  localId?: number;\r\n  /** The representation ID of the mesh */\r\n  representationId?: number;\r\n};\r\n\r\n/**\r\n * Interface representing the data for a raycast operation.\r\n */\r\nexport interface RaycastData {\r\n  /** The camera used for the raycast */\r\n  camera: THREE.PerspectiveCamera | THREE.OrthographicCamera;\r\n  /** The mouse position */\r\n  mouse: THREE.Vector2;\r\n  /** The DOM element where the scene is rendered */\r\n  dom: HTMLCanvasElement;\r\n}\r\n\r\nexport interface SnappingRaycastData extends RaycastData {\r\n  snappingClasses: SnappingClass[];\r\n}\r\n\r\n/**\r\n * Interface representing the result of a rectangle raycast operation.\r\n */\r\nexport interface RectangleRaycastResult {\r\n  /** The local IDs of the items */\r\n  localIds: number[];\r\n  /** The Fragments model that was hit */\r\n  fragments: FragmentsModel;\r\n}\r\n\r\n/**\r\n * Interface representing the data for a rectangle raycast operation.\r\n */\r\nexport interface RectangleRaycastData {\r\n  /** The camera used for the raycast */\r\n  camera: THREE.PerspectiveCamera | THREE.OrthographicCamera;\r\n  /** The DOM element where the scene is rendered */\r\n  dom: HTMLCanvasElement;\r\n  /** The top left corner of the rectangle */\r\n  topLeft: THREE.Vector2;\r\n  /** The bottom right corner of the rectangle */\r\n  bottomRight: THREE.Vector2;\r\n  /** Whether the rectangle is fully included in the view */\r\n  fullyIncluded: boolean;\r\n}\r\n\r\n/**\r\n * Interface representing the result of a raycast operation.\r\n */\r\nexport interface RaycastResult {\r\n  /** The local ID of the item */\r\n  localId: number;\r\n  /** The item ID */\r\n  itemId: number;\r\n  /** The point of the raycast */\r\n  point: THREE.Vector3;\r\n  /** The normal of the raycast */\r\n  normal?: THREE.Vector3;\r\n  /** The distance of the raycast */\r\n  distance: number;\r\n  /** The distance of the raycast from the ray origin */\r\n  rayDistance?: number;\r\n  /** The object that was hit */\r\n  object: THREE.Object3D;\r\n  /** The Fragments model that was hit */\r\n  fragments: FragmentsModel;\r\n  /** The ray used for the raycast */\r\n  ray?: THREE.Ray;\r\n  /** The frustum used for the raycast */\r\n  frustum: THREE.Frustum;\r\n  /** The representation class of the raycast */\r\n  representationClass: RepresentationClass;\r\n  /** The snapping class of the raycast */\r\n  snappingClass: SnappingClass;\r\n  /** The first edge of the snapped edge */\r\n  snappedEdgeP1?: THREE.Vector3;\r\n  /** The second edge of the snapped edge */\r\n  snappedEdgeP2?: THREE.Vector3;\r\n  /** The points of the raycasted face */\r\n  facePoints?: Float32Array;\r\n  /** The indices of the raycasted face */\r\n  faceIndices?: Uint16Array;\r\n}\r\n\r\n/**\r\n * Interface representing the attributes of an item in a Fragments model.\r\n */\r\nexport interface ItemAttribute {\r\n  /** The value of the attribute, which can be any type */\r\n  value: any;\r\n  /** Optional type identifier for the attribute value */\r\n  type?: string;\r\n}\r\n\r\n/**\r\n * Interface representing the data of an item in a Fragments model.\r\n */\r\nexport interface ItemData {\r\n  [name: string]: ItemAttribute | ItemData[];\r\n}\r\n\r\n/**\r\n * Interface representing an item in a spatial tree.\r\n */\r\nexport interface SpatialTreeItem {\r\n  /** The category of the item */\r\n  category: string | null;\r\n  /** The local ID of the item */\r\n  localId: number | null;\r\n  /** The children of the item */\r\n  children?: SpatialTreeItem[];\r\n}\r\n\r\n/**\r\n * Interface representing the configuration for item data in a Fragments model.\r\n */\r\nexport interface ItemsDataConfig {\r\n  /**\r\n   * An array of attribute names to include in the item data.\r\n   */\r\n  attributes?: string[];\r\n  /**\r\n   * A boolean indicating whether to include default attributes in the item data.\r\n   */\r\n  attributesDefault: boolean;\r\n  /**\r\n   * A record of relation names to their configuration.\r\n   */\r\n  relations?: Record<string, { attributes: boolean; relations: boolean }>;\r\n  /**\r\n   * The default configuration for relations.\r\n   */\r\n  relationsDefault: { attributes: boolean; relations: boolean };\r\n}\r\n\r\nexport const ALIGNMENT_CATEGORY = \"ThatOpenAlignment\";\r\n\r\nexport const GRID_CATEGORY = \"ThatOpenGrid\";\r\n\r\nexport enum AlignmentCurveType {\r\n  NONE = 0,\r\n  LINES = 1,\r\n  CLOTHOID = 2,\r\n  ELLIPSE_ARC = 3,\r\n  PARABOLA = 4,\r\n}\r\n\r\nexport type AlignmentCurve = {\r\n  points: Float32Array | number[];\r\n  type: AlignmentCurveType;\r\n};\r\n\r\nexport type AlignmentData = {\r\n  absolute: AlignmentCurve[];\r\n  horizontal: AlignmentCurve[];\r\n  vertical: AlignmentCurve[];\r\n};\r\n\r\nexport type GridAxisData = {\r\n  tag: string;\r\n  curve: number[];\r\n};\r\n\r\nexport type GridData = {\r\n  id: number;\r\n  transform: number[];\r\n  uAxes: GridAxisData[];\r\n  vAxes: GridAxisData[];\r\n  wAxes: GridAxisData[];\r\n};\r\n\r\n/** Interface representing the Coordinate Reference System (CRS) data extracted from an IFC model's IFCPROJECTEDCRS and IFCMAPCONVERSION entities. */\r\nexport interface CRSData {\r\n  /** The CRS name/identifier, e.g. \"EPSG:3947\" */\r\n  name: string | null;\r\n  /** Description of the CRS, e.g. \"RGF93_CC47\" */\r\n  description: string | null;\r\n  /** The geodetic datum name, e.g. \"RGF93\" */\r\n  geodeticDatum: string | null;\r\n  /** The vertical datum name */\r\n  verticalDatum: string | null;\r\n  /** The map projection name */\r\n  mapProjection: string | null;\r\n  /** The map zone identifier */\r\n  mapZone: string | null;\r\n  /** The map unit name, e.g. \"METRE\" */\r\n  mapUnit: string | null;\r\n  /** Map conversion parameters from IFCMAPCONVERSION (null if not present) */\r\n  mapConversion: {\r\n    /** Easting coordinate of the map origin */\r\n    eastings: number;\r\n    /** Northing coordinate of the map origin */\r\n    northings: number;\r\n    /** Orthogonal height of the map origin */\r\n    orthogonalHeight: number;\r\n    /** X component of the abscissa of the X axis */\r\n    xAxisAbscissa: number;\r\n    /** Y component of the ordinate of the X axis */\r\n    xAxisOrdinate: number;\r\n    /** Scale factor applied to the map */\r\n    scale: number;\r\n  } | null;\r\n}\r\n\r\nexport type CustomDataItem = {\r\n  data: {\r\n    value: string;\r\n    type: string;\r\n  };\r\n};\r\n\r\n/**\r\n * Interface representing the configuration for virtual properties in a Fragments model.\r\n */\r\nexport interface VirtualPropertiesConfig {\r\n  /** An array of extra relations to include in the virtual model */\r\n  extraRelations?: {\r\n    category: string;\r\n    relation: string;\r\n    inverseName: string;\r\n  }[];\r\n}\r\n\r\n/**\r\n * Interface representing the configuration for a virtual model.\r\n */\r\nexport interface VirtualModelConfig {\r\n  /** Optional properties configuration for the virtual model */\r\n  properties?: VirtualPropertiesConfig;\r\n}\r\n\r\n/**\r\n * Union type representing all possible item selection types.\r\n */\r\nexport type ItemSelectionType =\r\n  | \"withCondition\" // to use with the finder\r\n  | \"ofCategory\"\r\n  | \"withGeometry\"\r\n  | \"children\"\r\n  | \"withVisiblity\"\r\n  | \"highlighted\";\r\n\r\n/**\r\n * Interface representing the input for a selection query in a Fragments model.\r\n */\r\nexport interface MappedSelectionInput {\r\n  /**\r\n   * The category of the item to select.\r\n   */\r\n  ofCategory: string;\r\n}\r\n\r\n/**\r\n * Union type representing all possible selection input types.\r\n */\r\nexport type SelectionInputType<T extends ItemSelectionType> =\r\n  T extends keyof MappedSelectionInput ? MappedSelectionInput[T] : never;\r\n\r\n/**\r\n * Union type representing all possible item information types.\r\n */\r\nexport type ItemInformationType =\r\n  | \"data\"\r\n  | \"attributes\"\r\n  | \"relations\"\r\n  | \"guid\"\r\n  | \"category\"\r\n  | \"geometry\"\r\n  | \"visibility\"\r\n  | \"highlight\"\r\n  | \"mergedBoxes\"\r\n  | \"children\";\r\n\r\n/**\r\n * Interface representing the input for a result query in a Fragments model.\r\n * @template T - The type of item information to query.\r\n */\r\nexport interface MappedResultInput {\r\n  /**\r\n   * A partial configuration for item data.\r\n   */\r\n  data: Partial<ItemsDataConfig>;\r\n}\r\n\r\n/**\r\n * Union type representing all possible result input types.\r\n */\r\nexport type ResultInputType<T extends ItemInformationType> =\r\n  T extends keyof MappedResultInput ? MappedResultInput[T] : never;\r\n\r\n/**\r\n * Interface representing the result of an information query for a specific item type.\r\n * @template T - The type of item information to query.\r\n */\r\nexport interface MappedInformationResult {\r\n  /**\r\n   * An array of attribute records for the item.\r\n   * Each record contains a string key and a value of type any.\r\n   */\r\n  attributes: (Record<string, { value: any; type?: string }> | null)[];\r\n  /**\r\n   * An array of category strings for the item.\r\n   */\r\n  category: string[];\r\n  /**\r\n   * An array of child item IDs for the item.\r\n   */\r\n  children: number[];\r\n  /**\r\n   * An array of data records for the item.\r\n   */\r\n  data: ItemData[];\r\n  /**\r\n   * An array of geometry data for the item.\r\n   */\r\n  geometry: MeshData[][];\r\n  /**\r\n   * An array of GUID strings for the item.\r\n   */\r\n  guid: (string | null)[];\r\n  /**\r\n   * An array of highlight materials for the item.\r\n   */\r\n  highlight: MaterialDefinition[];\r\n  /**\r\n   * An array of relation records for the item.\r\n   */\r\n  relations: (Record<string, number[]> | null)[];\r\n  /**\r\n   * An array of visibility flags for the item.\r\n   */\r\n  visibility: boolean[];\r\n  /**\r\n   * The merged bounding box for the item.\r\n   */\r\n  mergedBoxes: THREE.Box3;\r\n}\r\n\r\n/**\r\n * Type representing the result of an information query for a specific item type.\r\n * @template T - The type of item information to query.\r\n */\r\nexport type InformationResultType<T extends ItemInformationType> =\r\n  MappedInformationResult[T];\r\n\r\nexport type QueryAggregation = \"exclusive\" | \"inclusive\";\r\n\r\nexport type GetItemsByAttributeParams = {\r\n  name: RegExp; // Making it a RegExp we can match attribues like Name and LongName in one single attribute query\r\n  value?: RegExp | RegExp[] | number | boolean; // By making the value optional it means the attribute must exist regardless the value\r\n  // condition?: any; // set this here to not forget about conditions for numerical values (>, >=, <, <=)\r\n  type?: RegExp;\r\n  negate?: boolean;\r\n  itemIds?: number[];\r\n};\r\n\r\nexport type GetItemsByRelationParams = {\r\n  /** Relation tag on the *source* item (e.g. \"IsDefinedBy\") */\r\n  name: string;\r\n  /** Set of *target* item localIds that must appear in the chosen relation */\r\n  targetItemIds?: Set<number>;\r\n  /** Optional subset of candidate *source* items; if omitted all items are scanned. */\r\n  sourceItemIds?: Iterable<number>;\r\n};\r\n\r\nexport type ItemsQueryParams = {\r\n  categories?: RegExp[];\r\n  attributes?: {\r\n    aggregation?: QueryAggregation;\r\n    queries: GetItemsByAttributeParams[];\r\n  };\r\n  relation?: {\r\n    name: string;\r\n    query?: ItemsQueryParams; // By making the query optional it means the item must have the given relation regardless of its items (e.g. To take items that have property sets )\r\n  };\r\n};\r\n\r\nexport interface ItemsQueryConfig {\r\n  localIds?: number[];\r\n}\r\n\r\nexport interface AttributesUniqueValuesParams {\r\n  key?: string; // the key name to be used in the result\r\n  get: RegExp; // the attribute name whose value to take\r\n  categories?: RegExp[];\r\n  // the queries an attribute set must match to be considered\r\n  attributes?: {\r\n    aggregation?: QueryAggregation;\r\n    queries: GetItemsByAttributeParams[];\r\n  };\r\n}\r\n\r\nexport interface ModelSection {\r\n  buffer: Float32Array;\r\n  index: number;\r\n  fillsIndices: number[];\r\n}\r\n\r\n/**\r\n * Enum representing the mode of the LOD / culling system.\r\n */\r\nexport enum LodMode {\r\n  /** Hides invisible items, displays far away items as LOD geometry, displays close items as full geometry */\r\n  DEFAULT = 0,\r\n  /** Displays all items as full geometry */\r\n  ALL_VISIBLE = 1,\r\n  /** Hides invisible items, displays the rest as full geometry */\r\n  ALL_GEOMETRY = 2,\r\n}\r\n","import * as THREE from \"three\";\r\n\r\nexport class PlanesUtils {\r\n  private static tempPoint = new THREE.Vector3();\r\n  private static dimensions = [\"x\", \"y\", \"z\"] as const;\r\n\r\n  static containedInParallelPlanes(ps: THREE.Plane[], point: THREE.Vector3) {\r\n    let result = true;\r\n    for (const clipPlane of ps) {\r\n      const distance = clipPlane.distanceToPoint(point);\r\n      const isInFront = distance >= 0;\r\n      result = result && isInFront;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  static collides(box: THREE.Box3, ps: THREE.Plane[], included: boolean) {\r\n    for (const plane of ps) {\r\n      const distance = this.getPointDistance(plane, included, box);\r\n      if (distance < 0) {\r\n        return false;\r\n      }\r\n    }\r\n    return true;\r\n  }\r\n\r\n  private static getPointDistance(\r\n    plane: THREE.Plane,\r\n    included: boolean,\r\n    box: THREE.Box3,\r\n  ) {\r\n    const normal = plane.normal;\r\n    for (const dim of this.dimensions) {\r\n      const isPositive = normal[dim] >= 0.0;\r\n      const isMax = isPositive !== included;\r\n      if (isMax) {\r\n        this.tempPoint[dim] = box.max[dim];\r\n      } else {\r\n        this.tempPoint[dim] = box.min[dim];\r\n      }\r\n    }\r\n    return plane.distanceToPoint(this.tempPoint);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { PlanesUtils } from \"./planes-utils\";\r\n\r\nexport class CameraUtils {\r\n  static transform(\r\n    input: THREE.Frustum,\r\n    transform: THREE.Matrix4,\r\n    result = new THREE.Frustum(),\r\n  ) {\r\n    for (let i = 0; i < result.planes.length; i++) {\r\n      const resultPlane = result.planes[i];\r\n      const inputPlane = input.planes[i];\r\n      resultPlane.copy(inputPlane);\r\n      resultPlane.applyMatrix4(transform);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  static isIncluded(box: THREE.Box3, ps: THREE.Plane[]) {\r\n    return PlanesUtils.collides(box, ps, true);\r\n  }\r\n\r\n  static collides(box: THREE.Box3, ps: THREE.Plane[]) {\r\n    return PlanesUtils.collides(box, ps, false);\r\n  }\r\n}\r\n","\nexport default function earcut(data, holeIndices, dim = 2) {\n\n    const hasHoles = holeIndices && holeIndices.length;\n    const outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n    let outerNode = linkedList(data, 0, outerLen, dim, true);\n    const triangles = [];\n\n    if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n    let minX, minY, invSize;\n\n    if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n    // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n    if (data.length > 80 * dim) {\n        minX = Infinity;\n        minY = Infinity;\n        let maxX = -Infinity;\n        let maxY = -Infinity;\n\n        for (let i = dim; i < outerLen; i += dim) {\n            const x = data[i];\n            const y = data[i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n        }\n\n        // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n        invSize = Math.max(maxX - minX, maxY - minY);\n        invSize = invSize !== 0 ? 32767 / invSize : 0;\n    }\n\n    earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);\n\n    return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n    let last;\n\n    if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n        for (let i = start; i < end; i += dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n    } else {\n        for (let i = end - dim; i >= start; i -= dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n    }\n\n    if (last && equals(last, last.next)) {\n        removeNode(last);\n        last = last.next;\n    }\n\n    return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n    if (!start) return start;\n    if (!end) end = start;\n\n    let p = start,\n        again;\n    do {\n        again = false;\n\n        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n            removeNode(p);\n            p = end = p.prev;\n            if (p === p.next) break;\n            again = true;\n\n        } else {\n            p = p.next;\n        }\n    } while (again || p !== end);\n\n    return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n    if (!ear) return;\n\n    // interlink polygon nodes in z-order\n    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n    let stop = ear;\n\n    // iterate through ears, slicing them one by one\n    while (ear.prev !== ear.next) {\n        const prev = ear.prev;\n        const next = ear.next;\n\n        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n            triangles.push(prev.i, ear.i, next.i); // cut off the triangle\n\n            removeNode(ear);\n\n            // skipping the next vertex leads to less sliver triangles\n            ear = next.next;\n            stop = next.next;\n\n            continue;\n        }\n\n        ear = next;\n\n        // if we looped through the whole remaining polygon and can't find any more ears\n        if (ear === stop) {\n            // try filtering points and slicing again\n            if (!pass) {\n                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n            // if this didn't work, try curing all small self-intersections locally\n            } else if (pass === 1) {\n                ear = cureLocalIntersections(filterPoints(ear), triangles);\n                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n            // as a last resort, try splitting the remaining polygon into two\n            } else if (pass === 2) {\n                splitEarcut(ear, triangles, dim, minX, minY, invSize);\n            }\n\n            break;\n        }\n    }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n    const a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // now make sure we don't have other points inside the potential ear\n    const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n    // triangle bbox\n    const x0 = Math.min(ax, bx, cx),\n        y0 = Math.min(ay, by, cy),\n        x1 = Math.max(ax, bx, cx),\n        y1 = Math.max(ay, by, cy);\n\n    let p = c.next;\n    while (p !== a) {\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.next;\n    }\n\n    return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n    const a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n    // triangle bbox\n    const x0 = Math.min(ax, bx, cx),\n        y0 = Math.min(ay, by, cy),\n        x1 = Math.max(ax, bx, cx),\n        y1 = Math.max(ay, by, cy);\n\n    // z-order range for the current triangle bbox;\n    const minZ = zOrder(x0, y0, minX, minY, invSize),\n        maxZ = zOrder(x1, y1, minX, minY, invSize);\n\n    let p = ear.prevZ,\n        n = ear.nextZ;\n\n    // look for points inside the triangle in both directions\n    while (p && p.z >= minZ && n && n.z <= maxZ) {\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n\n        if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    // look for remaining points in decreasing z-order\n    while (p && p.z >= minZ) {\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n    }\n\n    // look for remaining points in increasing z-order\n    while (n && n.z <= maxZ) {\n        if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles) {\n    let p = start;\n    do {\n        const a = p.prev,\n            b = p.next.next;\n\n        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n            triangles.push(a.i, p.i, b.i);\n\n            // remove two nodes involved\n            removeNode(p);\n            removeNode(p.next);\n\n            p = start = b;\n        }\n        p = p.next;\n    } while (p !== start);\n\n    return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n    // look for a valid diagonal that divides the polygon into two\n    let a = start;\n    do {\n        let b = a.next.next;\n        while (b !== a.prev) {\n            if (a.i !== b.i && isValidDiagonal(a, b)) {\n                // split the polygon in two by the diagonal\n                let c = splitPolygon(a, b);\n\n                // filter colinear points around the cuts\n                a = filterPoints(a, a.next);\n                c = filterPoints(c, c.next);\n\n                // run earcut on each half\n                earcutLinked(a, triangles, dim, minX, minY, invSize, 0);\n                earcutLinked(c, triangles, dim, minX, minY, invSize, 0);\n                return;\n            }\n            b = b.next;\n        }\n        a = a.next;\n    } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n    const queue = [];\n\n    for (let i = 0, len = holeIndices.length; i < len; i++) {\n        const start = holeIndices[i] * dim;\n        const end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        const list = linkedList(data, start, end, dim, false);\n        if (list === list.next) list.steiner = true;\n        queue.push(getLeftmost(list));\n    }\n\n    queue.sort(compareXYSlope);\n\n    // process holes from left to right\n    for (let i = 0; i < queue.length; i++) {\n        outerNode = eliminateHole(queue[i], outerNode);\n    }\n\n    return outerNode;\n}\n\nfunction compareXYSlope(a, b) {\n    let result = a.x - b.x;\n    // when the left-most point of 2 holes meet at a vertex, sort the holes counterclockwise so that when we find\n    // the bridge to the outer shell is always the point that they meet at.\n    if (result === 0) {\n        result = a.y - b.y;\n        if (result === 0) {\n            const aSlope = (a.next.y - a.y) / (a.next.x - a.x);\n            const bSlope = (b.next.y - b.y) / (b.next.x - b.x);\n            result = aSlope - bSlope;\n        }\n    }\n    return result;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n    const bridge = findHoleBridge(hole, outerNode);\n    if (!bridge) {\n        return outerNode;\n    }\n\n    const bridgeReverse = splitPolygon(bridge, hole);\n\n    // filter collinear points around the cuts\n    filterPoints(bridgeReverse, bridgeReverse.next);\n    return filterPoints(bridge, bridge.next);\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n    let p = outerNode;\n    const hx = hole.x;\n    const hy = hole.y;\n    let qx = -Infinity;\n    let m;\n\n    // find a segment intersected by a ray from the hole's leftmost point to the left;\n    // segment's endpoint with lesser x will be potential connection point\n    // unless they intersect at a vertex, then choose the vertex\n    if (equals(hole, p)) return p;\n    do {\n        if (equals(hole, p.next)) return p.next;\n        else if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n            const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n            if (x <= hx && x > qx) {\n                qx = x;\n                m = p.x < p.next.x ? p : p.next;\n                if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint\n            }\n        }\n        p = p.next;\n    } while (p !== outerNode);\n\n    if (!m) return null;\n\n    // look for points inside the triangle of hole point, segment intersection and endpoint;\n    // if there are no points found, we have a valid connection;\n    // otherwise choose the point of the minimum angle with the ray as connection point\n\n    const stop = m;\n    const mx = m.x;\n    const my = m.y;\n    let tanMin = Infinity;\n\n    p = m;\n\n    do {\n        if (hx >= p.x && p.x >= mx && hx !== p.x &&\n                pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n            const tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n            if (locallyInside(p, hole) &&\n                (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n                m = p;\n                tanMin = tan;\n            }\n        }\n\n        p = p.next;\n    } while (p !== stop);\n\n    return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n    return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n    let p = start;\n    do {\n        if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n        p.prevZ = p.prev;\n        p.nextZ = p.next;\n        p = p.next;\n    } while (p !== start);\n\n    p.prevZ.nextZ = null;\n    p.prevZ = null;\n\n    sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n    let numMerges;\n    let inSize = 1;\n\n    do {\n        let p = list;\n        let e;\n        list = null;\n        let tail = null;\n        numMerges = 0;\n\n        while (p) {\n            numMerges++;\n            let q = p;\n            let pSize = 0;\n            for (let i = 0; i < inSize; i++) {\n                pSize++;\n                q = q.nextZ;\n                if (!q) break;\n            }\n            let qSize = inSize;\n\n            while (pSize > 0 || (qSize > 0 && q)) {\n\n                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n                    e = p;\n                    p = p.nextZ;\n                    pSize--;\n                } else {\n                    e = q;\n                    q = q.nextZ;\n                    qSize--;\n                }\n\n                if (tail) tail.nextZ = e;\n                else list = e;\n\n                e.prevZ = tail;\n                tail = e;\n            }\n\n            p = q;\n        }\n\n        tail.nextZ = null;\n        inSize *= 2;\n\n    } while (numMerges > 1);\n\n    return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n    // coords are transformed into non-negative 15-bit integer range\n    x = (x - minX) * invSize | 0;\n    y = (y - minY) * invSize | 0;\n\n    x = (x | (x << 8)) & 0x00FF00FF;\n    x = (x | (x << 4)) & 0x0F0F0F0F;\n    x = (x | (x << 2)) & 0x33333333;\n    x = (x | (x << 1)) & 0x55555555;\n\n    y = (y | (y << 8)) & 0x00FF00FF;\n    y = (y | (y << 4)) & 0x0F0F0F0F;\n    y = (y | (y << 2)) & 0x33333333;\n    y = (y | (y << 1)) & 0x55555555;\n\n    return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n    let p = start,\n        leftmost = start;\n    do {\n        if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n        p = p.next;\n    } while (p !== start);\n\n    return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n    return (cx - px) * (ay - py) >= (ax - px) * (cy - py) &&\n           (ax - px) * (by - py) >= (bx - px) * (ay - py) &&\n           (bx - px) * (cy - py) >= (cx - px) * (by - py);\n}\n\n// check if a point lies within a convex triangle but false if its equal to the first point of the triangle\nfunction pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, px, py) {\n    return !(ax === px && ay === py) && pointInTriangle(ax, ay, bx, by, cx, cy, px, py);\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges\n           (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n            (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n            equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n    return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n    const o1 = sign(area(p1, q1, p2));\n    const o2 = sign(area(p1, q1, q2));\n    const o3 = sign(area(p2, q2, p1));\n    const o4 = sign(area(p2, q2, q1));\n\n    if (o1 !== o2 && o3 !== o4) return true; // general case\n\n    if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n    if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n    if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n    if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n    return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n    return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n    return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n    let p = a;\n    do {\n        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n                intersects(p, p.next, a, b)) return true;\n        p = p.next;\n    } while (p !== a);\n\n    return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n    return area(a.prev, a, a.next) < 0 ?\n        area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n        area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n    let p = a;\n    let inside = false;\n    const px = (a.x + b.x) / 2;\n    const py = (a.y + b.y) / 2;\n    do {\n        if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n                (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n            inside = !inside;\n        p = p.next;\n    } while (p !== a);\n\n    return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n    const a2 = createNode(a.i, a.x, a.y),\n        b2 = createNode(b.i, b.x, b.y),\n        an = a.next,\n        bp = b.prev;\n\n    a.next = b;\n    b.prev = a;\n\n    a2.next = an;\n    an.prev = a2;\n\n    b2.next = a2;\n    a2.prev = b2;\n\n    bp.next = b2;\n    b2.prev = bp;\n\n    return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n    const p = createNode(i, x, y);\n\n    if (!last) {\n        p.prev = p;\n        p.next = p;\n\n    } else {\n        p.next = last.next;\n        p.prev = last;\n        last.next.prev = p;\n        last.next = p;\n    }\n    return p;\n}\n\nfunction removeNode(p) {\n    p.next.prev = p.prev;\n    p.prev.next = p.next;\n\n    if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n    if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction createNode(i, x, y) {\n    return {\n        i, // vertex index in coordinates array\n        x, y, // vertex coordinates\n        prev: null, // previous and next vertex nodes in a polygon ring\n        next: null,\n        z: 0, // z-order curve value\n        prevZ: null, // previous and next nodes in z-order\n        nextZ: null,\n        steiner: false // indicates whether this is a steiner point\n    };\n}\n\n// return a percentage difference between the polygon area and its triangulation area;\n// used to verify correctness of triangulation\nexport function deviation(data, holeIndices, dim, triangles) {\n    const hasHoles = holeIndices && holeIndices.length;\n    const outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n\n    let polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));\n    if (hasHoles) {\n        for (let i = 0, len = holeIndices.length; i < len; i++) {\n            const start = holeIndices[i] * dim;\n            const end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n            polygonArea -= Math.abs(signedArea(data, start, end, dim));\n        }\n    }\n\n    let trianglesArea = 0;\n    for (let i = 0; i < triangles.length; i += 3) {\n        const a = triangles[i] * dim;\n        const b = triangles[i + 1] * dim;\n        const c = triangles[i + 2] * dim;\n        trianglesArea += Math.abs(\n            (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -\n            (data[a] - data[b]) * (data[c + 1] - data[a + 1]));\n    }\n\n    return polygonArea === 0 && trianglesArea === 0 ? 0 :\n        Math.abs((trianglesArea - polygonArea) / polygonArea);\n}\n\nfunction signedArea(data, start, end, dim) {\n    let sum = 0;\n    for (let i = start, j = end - dim; i < end; i += dim) {\n        sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n        j = i;\n    }\n    return sum;\n}\n\n// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts\nexport function flatten(data) {\n    const vertices = [];\n    const holes = [];\n    const dimensions = data[0][0].length;\n    let holeIndex = 0;\n    let prevLen = 0;\n\n    for (const ring of data) {\n        for (const p of ring) {\n            for (let d = 0; d < dimensions; d++) vertices.push(p[d]);\n        }\n        if (prevLen) {\n            holeIndex += prevLen;\n            holes.push(holeIndex);\n        }\n        prevLen = ring.length;\n    }\n    return {vertices, holes, dimensions};\n}\n","import * as THREE from \"three\";\r\n\r\n// @ts-ignore\r\nimport earcut from \"earcut\";\r\n\r\n// TODO: Fix for horizontal sections\r\n\r\nexport class SectionGenerator {\r\n  private _inverseMatrix = new THREE.Matrix4();\r\n  private _localPlane = new THREE.Plane();\r\n  private _tempLine = new THREE.Line3();\r\n  private _tempVector = new THREE.Vector3();\r\n  private _plane?: THREE.Plane;\r\n  private _plane2DCoordinateSystem = new THREE.Matrix4();\r\n  private _precission = 10000;\r\n\r\n  // Used if the plane is orthogonal to the cartesian planes\r\n  // private _planeAxis?: \"x\" | \"y\" | \"z\";\r\n\r\n  get plane() {\r\n    if (!this._plane) {\r\n      throw new Error(\"Fragments: Plane not set\");\r\n    }\r\n    return this._plane;\r\n  }\r\n\r\n  set plane(plane: THREE.Plane) {\r\n    this._plane = plane;\r\n  }\r\n\r\n  // This assumes that the mesh that contains the posAttr is aligned with the current plane\r\n  createEdges(data: { meshes: THREE.Mesh[]; posAttr: THREE.BufferAttribute }) {\r\n    const { meshes, posAttr } = data;\r\n\r\n    let index = 0;\r\n    posAttr.array.fill(0);\r\n\r\n    // The indexex of the points that draw the lines\r\n    const indexes: number[] = [];\r\n    let lastIndex = 0;\r\n\r\n    const tempMesh = new THREE.Mesh();\r\n\r\n    for (const mesh of meshes) {\r\n      if (!mesh.geometry) {\r\n        continue;\r\n      }\r\n\r\n      // @ts-ignore\r\n      if (!mesh.geometry.boundsTree) {\r\n        // @ts-ignore\r\n        mesh.geometry.computeBoundsTree();\r\n      }\r\n\r\n      // @ts-ignore\r\n      if (!mesh.geometry.boundsTree) {\r\n        throw new Error(\r\n          \"Fragments: Bounds tree not found for edges generation.\",\r\n        );\r\n      }\r\n\r\n      if (mesh instanceof THREE.InstancedMesh) {\r\n        if (mesh.count === 0) {\r\n          continue;\r\n        }\r\n        const instanced = mesh as THREE.InstancedMesh;\r\n\r\n        for (let i = 0; i < instanced.count; i++) {\r\n          tempMesh.geometry = mesh.geometry;\r\n          tempMesh.matrix.copy(mesh.matrix);\r\n\r\n          const tempMatrix = new THREE.Matrix4();\r\n          instanced.getMatrixAt(i, tempMatrix);\r\n          tempMesh.applyMatrix4(tempMatrix);\r\n          tempMesh.applyMatrix4(mesh.matrixWorld);\r\n          tempMesh.updateMatrix();\r\n          tempMesh.updateMatrixWorld();\r\n\r\n          this._inverseMatrix.copy(tempMesh.matrixWorld).invert();\r\n          this._localPlane.copy(this.plane).applyMatrix4(this._inverseMatrix);\r\n\r\n          index = this.shapecast(tempMesh, posAttr, index);\r\n\r\n          if (index !== lastIndex) {\r\n            indexes.push(index);\r\n            lastIndex = index;\r\n          }\r\n        }\r\n      } else {\r\n        this._inverseMatrix.copy(mesh.matrixWorld).invert();\r\n        this._localPlane.copy(this.plane).applyMatrix4(this._inverseMatrix);\r\n\r\n        index = this.shapecast(mesh, posAttr, index);\r\n\r\n        if (index !== lastIndex) {\r\n          indexes.push(index);\r\n          lastIndex = index;\r\n        }\r\n      }\r\n    }\r\n\r\n    return { indexes, index };\r\n  }\r\n\r\n  createFills(buffer: Float32Array, trianglesIndices: number[]) {\r\n    this.updatePlane2DCoordinateSystem();\r\n\r\n    const allIndices: number[] = [];\r\n    let currentTriangle = 0;\r\n\r\n    for (let i = 0; i < trianglesIndices.length; i++) {\r\n      const nextTriangle = trianglesIndices[i];\r\n\r\n      const vertices: number[] = [];\r\n\r\n      for (let j = currentTriangle; j < nextTriangle; j += 2) {\r\n        vertices.push(j * 3);\r\n      }\r\n\r\n      const indices = this.computeFill(vertices, buffer);\r\n\r\n      let indexCounter = 0;\r\n\r\n      for (const index of indices) {\r\n        allIndices.push(index);\r\n        indexCounter++;\r\n      }\r\n\r\n      currentTriangle = nextTriangle;\r\n    }\r\n\r\n    return allIndices;\r\n  }\r\n\r\n  private computeFill(vertices: number[], buffer: Float32Array) {\r\n    const indices = new Map();\r\n    const all2DVertices: { [index: number]: [number, number] } = {};\r\n    const shapes = new Map<number, number[]>();\r\n    let nextShapeID = 0;\r\n    const shapesEnds = new Map();\r\n    const shapesStarts = new Map();\r\n    const openShapes = new Set();\r\n\r\n    const p = this._precission;\r\n\r\n    for (let i = 0; i < vertices.length; i++) {\r\n      // Convert vertices to indices\r\n\r\n      const startVertexIndex = vertices[i];\r\n\r\n      let x1 = 0;\r\n      let y1 = 0;\r\n      let x2 = 0;\r\n      let y2 = 0;\r\n\r\n      const globalX1 = buffer[startVertexIndex];\r\n      const globalY1 = buffer[startVertexIndex + 1];\r\n      const globalZ1 = buffer[startVertexIndex + 2];\r\n      const globalX2 = buffer[startVertexIndex + 3];\r\n      const globalY2 = buffer[startVertexIndex + 4];\r\n      const globalZ2 = buffer[startVertexIndex + 5];\r\n\r\n      this._tempVector.set(globalX1, globalY1, globalZ1);\r\n      this._tempVector.applyMatrix4(this._plane2DCoordinateSystem);\r\n      x1 = Math.trunc(this._tempVector.x * p) / p;\r\n      y1 = Math.trunc(this._tempVector.y * p) / p;\r\n\r\n      this._tempVector.set(globalX2, globalY2, globalZ2);\r\n      this._tempVector.applyMatrix4(this._plane2DCoordinateSystem);\r\n      x2 = Math.trunc(this._tempVector.x * p) / p;\r\n      y2 = Math.trunc(this._tempVector.y * p) / p;\r\n\r\n      if (x1 === x2 && y1 === y2) {\r\n        continue;\r\n      }\r\n\r\n      const startCode = `${x1}|${y1}`;\r\n      const endCode = `${x2}|${y2}`;\r\n\r\n      if (!indices.has(startCode)) {\r\n        indices.set(startCode, startVertexIndex / 3);\r\n      }\r\n      if (!indices.has(endCode)) {\r\n        indices.set(endCode, startVertexIndex / 3 + 1);\r\n      }\r\n\r\n      const start = indices.get(startCode);\r\n      const end = indices.get(endCode);\r\n\r\n      all2DVertices[start] = [x1, y1];\r\n      all2DVertices[end] = [x2, y2];\r\n\r\n      const startMatchesStart = shapesStarts.has(start);\r\n      const startMatchesEnd = shapesEnds.has(start);\r\n      const endMatchesStart = shapesStarts.has(end);\r\n      const endMatchesEnd = shapesEnds.has(end);\r\n\r\n      const noMatches =\r\n        !startMatchesStart &&\r\n        !startMatchesEnd &&\r\n        !endMatchesStart &&\r\n        !endMatchesEnd;\r\n\r\n      if (noMatches) {\r\n        // New shape\r\n        shapesStarts.set(start, nextShapeID);\r\n        shapesEnds.set(end, nextShapeID);\r\n        openShapes.add(nextShapeID);\r\n        shapes.set(nextShapeID, [start, end]);\r\n        nextShapeID++;\r\n      } else if (startMatchesStart && endMatchesEnd) {\r\n        // Close shape or merge 2 shapes\r\n        const startIndex = shapesStarts.get(start);\r\n        const endIndex = shapesEnds.get(end);\r\n        const isShapeMerge = startIndex !== endIndex;\r\n        if (isShapeMerge) {\r\n          // merge start to end\r\n          const endShape = shapes.get(endIndex);\r\n          const startShape = shapes.get(startIndex);\r\n          if (!endShape || !startShape) {\r\n            continue;\r\n          }\r\n\r\n          shapes.delete(startIndex);\r\n          openShapes.delete(startIndex);\r\n\r\n          shapesEnds.set(startShape[startShape.length - 1], endIndex);\r\n          shapesEnds.delete(endShape[endShape.length - 1]);\r\n\r\n          for (const index of startShape) {\r\n            endShape.push(index);\r\n          }\r\n        } else {\r\n          openShapes.delete(endIndex);\r\n        }\r\n        shapesStarts.delete(start);\r\n        shapesEnds.delete(end);\r\n      } else if (startMatchesEnd && endMatchesStart) {\r\n        // Close shape or merge 2 shapes\r\n        const startIndex = shapesStarts.get(end);\r\n        const endIndex = shapesEnds.get(start);\r\n        const isShapeMerge = startIndex !== endIndex;\r\n        if (isShapeMerge) {\r\n          // merge start to end\r\n          const endShape = shapes.get(endIndex);\r\n          const startShape = shapes.get(startIndex);\r\n          if (!endShape || !startShape) {\r\n            continue;\r\n          }\r\n\r\n          shapes.delete(startIndex);\r\n          openShapes.delete(startIndex);\r\n\r\n          shapesEnds.set(startShape[startShape.length - 1], endIndex);\r\n          shapesEnds.delete(endShape[endShape.length - 1]);\r\n\r\n          for (const index of startShape) {\r\n            endShape.push(index);\r\n          }\r\n        } else {\r\n          openShapes.delete(endIndex);\r\n        }\r\n        shapesStarts.delete(end);\r\n        shapesEnds.delete(start);\r\n      } else if (startMatchesStart && endMatchesStart) {\r\n        // Merge 2 shapes, mirroring one of them\r\n        const startIndex1 = shapesStarts.get(end);\r\n        const startIndex2 = shapesStarts.get(start);\r\n        // merge start to end\r\n        const startShape2 = shapes.get(startIndex2);\r\n        const startShape1 = shapes.get(startIndex1);\r\n        if (!startShape2 || !startShape1) {\r\n          continue;\r\n        }\r\n\r\n        shapes.delete(startIndex1);\r\n        openShapes.delete(startIndex1);\r\n\r\n        shapesStarts.delete(startShape2[0]);\r\n        shapesStarts.delete(startShape1[0]);\r\n        shapesEnds.delete(startShape1[startShape1.length - 1]);\r\n        shapesStarts.set(startShape1[startShape1.length - 1], startIndex2);\r\n\r\n        startShape1.reverse();\r\n        startShape2.splice(0, 0, ...startShape1);\r\n      } else if (startMatchesEnd && endMatchesEnd) {\r\n        // Merge 2 shapes, mirroring one of them\r\n        const endIndex1 = shapesEnds.get(end);\r\n        const endIndex2 = shapesEnds.get(start);\r\n        // merge start to end\r\n        const endShape2 = shapes.get(endIndex2);\r\n        const endShape1 = shapes.get(endIndex1);\r\n        if (!endShape2 || !endShape1) {\r\n          continue;\r\n        }\r\n\r\n        shapes.delete(endIndex1);\r\n        openShapes.delete(endIndex1);\r\n\r\n        shapesEnds.delete(endShape2[endShape2.length - 1]);\r\n        shapesEnds.delete(endShape1[endShape1.length - 1]);\r\n        shapesStarts.delete(endShape1[0]);\r\n        shapesEnds.set(endShape1[0], endIndex2);\r\n\r\n        endShape1.reverse();\r\n        endShape2.push(...endShape1);\r\n      } else if (startMatchesStart) {\r\n        // existing contour on start - start\r\n        const shapeIndex = shapesStarts.get(start);\r\n        const shape = shapes.get(shapeIndex);\r\n        if (!shape) {\r\n          continue;\r\n        }\r\n        shape.unshift(end);\r\n        shapesStarts.delete(start);\r\n        shapesStarts.set(end, shapeIndex);\r\n      } else if (startMatchesEnd) {\r\n        // existing contour on start - end\r\n        const shapeIndex = shapesEnds.get(start);\r\n        const shape = shapes.get(shapeIndex);\r\n        if (!shape) {\r\n          continue;\r\n        }\r\n        shape.push(end);\r\n        shapesEnds.delete(start);\r\n        shapesEnds.set(end, shapeIndex);\r\n      } else if (endMatchesStart) {\r\n        // existing contour on end - start\r\n        const shapeIndex = shapesStarts.get(end);\r\n        const shape = shapes.get(shapeIndex);\r\n        if (!shape) {\r\n          continue;\r\n        }\r\n        shape.unshift(start);\r\n        shapesStarts.delete(end);\r\n        shapesStarts.set(start, shapeIndex);\r\n      } else if (endMatchesEnd) {\r\n        // existing contour on end - end\r\n        const shapeIndex = shapesEnds.get(end);\r\n        const shape = shapes.get(shapeIndex);\r\n        if (!shape) {\r\n          continue;\r\n        }\r\n        shape.push(start);\r\n        shapesEnds.delete(end);\r\n        shapesEnds.set(start, shapeIndex);\r\n      }\r\n    }\r\n\r\n    const trueIndices: number[] = [];\r\n\r\n    for (const [id, shape] of shapes) {\r\n      if (openShapes.has(id)) {\r\n        continue;\r\n      }\r\n\r\n      const vertices: number[] = [];\r\n      const indexMap = new Map();\r\n      let counter = 0;\r\n      for (const index of shape) {\r\n        const vertex = all2DVertices[index];\r\n        vertices.push(vertex[0], vertex[1]);\r\n        indexMap.set(counter++, index);\r\n      }\r\n\r\n      const result = earcut(vertices);\r\n      for (const index of result) {\r\n        const trueIndex = indexMap.get(index);\r\n        if (trueIndex === undefined) {\r\n          throw new Error(\"Fragments: Map error!\");\r\n        }\r\n        trueIndices.push(trueIndex);\r\n      }\r\n    }\r\n\r\n    return trueIndices;\r\n  }\r\n\r\n  private updatePlane2DCoordinateSystem() {\r\n    // Assuming the normal of the plane is called Z\r\n    this._plane2DCoordinateSystem = new THREE.Matrix4();\r\n\r\n    const zAxis = this.plane.normal;\r\n    const pos = new THREE.Vector3();\r\n    this.plane.coplanarPoint(pos);\r\n\r\n    // Create a coordinate system that works for any plane orientation\r\n    let xAxis: THREE.Vector3;\r\n    let yAxis: THREE.Vector3;\r\n\r\n    // If the plane is horizontal (normal is parallel to Z axis)\r\n    if (Math.abs(zAxis.z) > 0.99) {\r\n      // For horizontal planes, we can use the world X and Y axes directly\r\n      xAxis = new THREE.Vector3(1, 0, 0);\r\n      yAxis = new THREE.Vector3(0, 1, 0);\r\n    } else if (Math.abs(zAxis.x) > 0.99) {\r\n      // For planes aligned with X axis (normal is parallel to X axis)\r\n      // Use Y and Z axes for the 2D coordinate system\r\n      xAxis = new THREE.Vector3(0, 1, 0);\r\n      yAxis = new THREE.Vector3(0, 0, 1);\r\n    } else if (Math.abs(zAxis.y) > 0.99) {\r\n      // For planes aligned with Y axis (normal is parallel to Y axis)\r\n      // Use X and Z axes for the 2D coordinate system\r\n      xAxis = new THREE.Vector3(1, 0, 0);\r\n      yAxis = new THREE.Vector3(0, 0, 1);\r\n    } else {\r\n      // For other orientations, create a proper coordinate system\r\n      // Start with a vector that's guaranteed to not be parallel to zAxis\r\n      const tempVector =\r\n        Math.abs(zAxis.x) < 0.5\r\n          ? new THREE.Vector3(1, 0, 0)\r\n          : new THREE.Vector3(0, 1, 0);\r\n      xAxis = new THREE.Vector3();\r\n      xAxis.crossVectors(tempVector, zAxis).normalize();\r\n      yAxis = new THREE.Vector3();\r\n      yAxis.crossVectors(zAxis, xAxis).normalize();\r\n    }\r\n\r\n    // prettier-ignore\r\n    this._plane2DCoordinateSystem.fromArray([\r\n      xAxis.x, xAxis.y, xAxis.z, 0,\r\n      yAxis.x, yAxis.y, yAxis.z, 0,\r\n      zAxis.x, zAxis.y, zAxis.z, 0,\r\n      pos.x, pos.y, pos.z, 1,\r\n    ]);\r\n\r\n    this._plane2DCoordinateSystem.invert();\r\n  }\r\n\r\n  private shapecast(mesh: THREE.Mesh, posAttr: any, index: number) {\r\n    // @ts-ignore\r\n    mesh.geometry.boundsTree.shapecast({\r\n      intersectsBounds: (box: any) => {\r\n        return this._localPlane.intersectsBox(box) as any;\r\n      },\r\n\r\n      // @ts-ignore\r\n      intersectsTriangle: (tri: any) => {\r\n        // check each triangle edge to see if it intersects with the plane. If so then\r\n        // add it to the list of segments.\r\n        let count = 0;\r\n        this._tempLine.start.copy(tri.a);\r\n        this._tempLine.end.copy(tri.b);\r\n        if (this._localPlane.intersectLine(this._tempLine, this._tempVector)) {\r\n          const result = this._tempVector.applyMatrix4(mesh.matrixWorld);\r\n          posAttr.setXYZ(index, result.x, result.y, result.z);\r\n          count++;\r\n          index++;\r\n        }\r\n\r\n        this._tempLine.start.copy(tri.b);\r\n        this._tempLine.end.copy(tri.c);\r\n        if (this._localPlane.intersectLine(this._tempLine, this._tempVector)) {\r\n          const result = this._tempVector.applyMatrix4(mesh.matrixWorld);\r\n          posAttr.setXYZ(index, result.x, result.y, result.z);\r\n          count++;\r\n          index++;\r\n        }\r\n\r\n        this._tempLine.start.copy(tri.c);\r\n        this._tempLine.end.copy(tri.a);\r\n        if (this._localPlane.intersectLine(this._tempLine, this._tempVector)) {\r\n          const result = this._tempVector.applyMatrix4(mesh.matrixWorld);\r\n          posAttr.setXYZ(index, result.x, result.y, result.z);\r\n          count++;\r\n          index++;\r\n        }\r\n\r\n        // If we only intersected with one or three sides then just remove it. This could be handled\r\n        // more gracefully.\r\n        if (count !== 2) {\r\n          index -= count;\r\n        }\r\n      },\r\n    });\r\n    return index;\r\n  }\r\n}\r\n","import { DataBuffer } from \"../../model/model-types\";\r\n\r\nexport class CRCData {\r\n  readonly int: DataBuffer;\r\n  readonly float: DataBuffer;\r\n  readonly buffer: DataBuffer;\r\n  readonly s1 = 4;\r\n  readonly s2 = 8;\r\n\r\n  constructor() {\r\n    const { intBuffer, floatBuffer, buffer } = this.newBuffers();\r\n    this.int = intBuffer;\r\n    this.float = floatBuffer;\r\n    this.buffer = buffer;\r\n  }\r\n\r\n  private newBuffers() {\r\n    const intBuffer = new Int32Array(1);\r\n    const data = intBuffer.buffer;\r\n    const floatBuffer = new Float32Array(data);\r\n    const buffer = new Uint8Array(data);\r\n    return { intBuffer, floatBuffer, buffer };\r\n  }\r\n}\r\n","export class IntHelper {\r\n  private static readonly _max = 2147483647;\r\n  private static readonly _min = -2147483648;\r\n\r\n  static check(data: number) {\r\n    const isInteger = Number.isInteger(data);\r\n    const notOverflow = data < this._max;\r\n    const notUnderflow = data > this._min;\r\n    return isInteger && notOverflow && notUnderflow;\r\n  }\r\n}\r\n","/* eslint-disable no-bitwise */\r\n/* eslint-disable no-prototype-builtins */\r\n\r\nimport { MaterialDefinition } from \"../../model/model-types\";\r\nimport { CRCData } from \"./crc-data\";\r\nimport { IntHelper } from \"./int-helper\";\r\n\r\n// src: https://stackoverflow.com/questions/27939882/fast-crc-algorithm\r\n\r\ntype SupportedType = \"number\" | \"boolean\" | \"string\" | \"object\";\r\n\r\nexport class CRC {\r\n  private static readonly _polynomial = 0x82f63b78;\r\n  private readonly _core = new CRCData();\r\n  private readonly _handlers: {\r\n    [key: string]: (input: any) => void;\r\n  };\r\n\r\n  private _result = ~0;\r\n\r\n  get value() {\r\n    return ~this._result;\r\n  }\r\n\r\n  constructor() {\r\n    this._handlers = this.newHandlers();\r\n  }\r\n\r\n  fromMaterialData(\r\n    data: {\r\n      modelId: string;\r\n      objectClass: number;\r\n      currentLod: number;\r\n      templateId?: any;\r\n    } & MaterialDefinition,\r\n  ) {\r\n    const {\r\n      modelId,\r\n      objectClass,\r\n      currentLod,\r\n      templateId,\r\n      ...materialDefinition\r\n    } = data;\r\n    this.reset();\r\n    this.compute(modelId);\r\n    this.compute(objectClass);\r\n    this.compute(materialDefinition);\r\n    this.compute(currentLod);\r\n    this.compute(templateId !== undefined);\r\n  }\r\n\r\n  generate(input: (number | boolean | string | object)[]) {\r\n    this.reset();\r\n    for (const item of input) {\r\n      this.compute(item);\r\n    }\r\n    return this.value;\r\n  }\r\n\r\n  compute(input: number | boolean | string | object) {\r\n    const handler = this.getHandler(input);\r\n    handler(input);\r\n    return this;\r\n  }\r\n\r\n  reset() {\r\n    this._result = ~0;\r\n    return this;\r\n  }\r\n\r\n  private getHandler(input: string | number | boolean | object) {\r\n    const inputType = typeof input as SupportedType;\r\n    const handler = this._handlers[inputType];\r\n    if (!handler) {\r\n      throw new Error(\"Fragments: Unsupported input type\");\r\n    }\r\n    return handler;\r\n  }\r\n\r\n  private newHandlers() {\r\n    return {\r\n      number: this.handleNumber,\r\n      boolean: this.handleBoolean,\r\n      string: this.handleString,\r\n      object: this.handleObject,\r\n    };\r\n  }\r\n\r\n  private handleObject = (input: any) => {\r\n    const keys = Object.keys(input);\r\n    for (const key of keys) {\r\n      if (!input.hasOwnProperty(key)) {\r\n        continue;\r\n      }\r\n      this.compute(input[key]);\r\n    }\r\n  };\r\n\r\n  private handleString = (input: string) => {\r\n    const size = input.length;\r\n    for (let i = 0; i < size; ++i) {\r\n      const result = input.codePointAt(i)!;\r\n      this._core.int[0] = result;\r\n      this.update();\r\n    }\r\n  };\r\n\r\n  private handleBoolean = (input: boolean) => {\r\n    if (input) {\r\n      this._core.int[0] = 1;\r\n    } else {\r\n      this._core.int[0] = 0;\r\n    }\r\n    this.update();\r\n  };\r\n\r\n  private handleNumber = (input: number) => {\r\n    const isInt = IntHelper.check(input);\r\n    const target = isInt ? this._core.int : this._core.float;\r\n    target[0] = input;\r\n    this.update();\r\n  };\r\n\r\n  private update() {\r\n    for (let i = 0; i < this._core.s1; ++i) {\r\n      this._result ^= this._core.buffer[i];\r\n      for (let j = 0; j < this._core.s2; ++j) {\r\n        if (this._result & 1) {\r\n          this._result = (this._result >> 1) ^ CRC._polynomial;\r\n        } else {\r\n          this._result >>= 1;\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n","import { DataBuffer } from \"../../model/model-types\";\r\n\r\ntype Filter = (data: any) => boolean;\r\n\r\ninterface BufferData<T> {\r\n  position: number;\r\n  size: number;\r\n  data: T;\r\n  past: BufferData<T> | null;\r\n  following: BufferData<T> | null;\r\n}\r\n\r\nexport class MultiBufferData<T> {\r\n  private static _stash: Array<BufferData<any>> = [];\r\n  private _first: BufferData<T>;\r\n  private static _tempData = { position: 0, size: 0 } as BufferData<any>;\r\n  private static _inf = 0xffffffff;\r\n\r\n  constructor(size: number, firstElement: T) {\r\n    this._first = this.newData(size, firstElement);\r\n  }\r\n\r\n  static getComplementary(\r\n    data: any,\r\n    callback: (position: number, size: number) => void,\r\n  ) {\r\n    let past = 0;\r\n    const length = data.position.length;\r\n    past = this.makeBufferComplementary(length, data, past, callback);\r\n    if (past !== Infinity) {\r\n      callback(past, Infinity);\r\n    }\r\n  }\r\n\r\n  static get<T>(\r\n    data: MultiBufferData<T>,\r\n    positions: number[],\r\n    filter?: Filter,\r\n    callback?: (i: number, value: T) => void,\r\n  ) {\r\n    const { filtered, position, size } = this.getData(data, filter);\r\n    this.setAllBufferData(filtered, positions, position, size, callback);\r\n    return { position, size };\r\n  }\r\n\r\n  fullOf(data: T) {\r\n    const followingItem = this._first.following;\r\n    const first = this._first.data;\r\n    const noFollowing = followingItem === null;\r\n    const sameData = first === data;\r\n    return noFollowing && sameData;\r\n  }\r\n\r\n  update(position: number, data: T) {\r\n    const input = this.getBufferData(position);\r\n    const isSame = input.data === data;\r\n    if (!isSame) {\r\n      const { a, c, b } = this.newBuffers(position, input, data);\r\n      this.setupInputData(input, a, c);\r\n      this.setupUpdateBuffers(a, b, c);\r\n    }\r\n  }\r\n\r\n  size(filter?: Filter) {\r\n    let index = 0;\r\n    let data: any = this._first;\r\n    while (data !== null) {\r\n      const filterPass = this.doesFilterPass(filter, data);\r\n      if (filterPass) {\r\n        index++;\r\n      }\r\n      data = data.following;\r\n    }\r\n    return index;\r\n  }\r\n\r\n  private static setAllBufferData<T>(\r\n    filtered: BufferData<T>[],\r\n    positions: number[],\r\n    position: Uint32Array,\r\n    size: Uint32Array,\r\n    callback?: (index: number, data: T) => void,\r\n  ) {\r\n    for (let i = 0; i < filtered.length; ++i) {\r\n      const input = filtered[i];\r\n      this.transform(input, positions);\r\n      this.setBuffers(position, size, i);\r\n      if (callback) {\r\n        callback(i, input.data);\r\n      }\r\n    }\r\n  }\r\n\r\n  private static makeBufferComplementary(\r\n    length: any,\r\n    data: any,\r\n    past: number,\r\n    callback: (position: number, size: number) => void,\r\n  ) {\r\n    for (let i = 0; i < length; ++i) {\r\n      const input = this.getBuffers(data, i);\r\n      const { position, size } = input;\r\n      if (position > past) {\r\n        callback(past, position - past);\r\n      }\r\n      past = position + size;\r\n    }\r\n    return past;\r\n  }\r\n\r\n  private static setBuffers(position: DataBuffer, size: DataBuffer, i: number) {\r\n    position[i] = this._tempData.position;\r\n    const isInf = this._tempData.size === Infinity;\r\n    if (isInf) {\r\n      size[i] = this._inf;\r\n    } else {\r\n      size[i] = this._tempData.size;\r\n    }\r\n  }\r\n\r\n  private add(position: number, size: number, data: T) {\r\n    const stashExists = MultiBufferData._stash.length;\r\n    if (!stashExists) {\r\n      return this.newData(size, data, position);\r\n    }\r\n    const stashed = MultiBufferData._stash.pop();\r\n    if (!stashed) {\r\n      throw new Error(\"Fragments: No stash found\");\r\n    }\r\n    stashed.position = position;\r\n    stashed.size = size;\r\n    stashed.data = data;\r\n    return stashed;\r\n  }\r\n\r\n  private remove(data: BufferData<T>) {\r\n    if (data) {\r\n      data.following = null;\r\n      data.past = null;\r\n      MultiBufferData._stash.push(data);\r\n    }\r\n  }\r\n\r\n  private static getData<T>(data: MultiBufferData<T>, filter?: Filter) {\r\n    const filtered = data.filter(filter);\r\n    const length = filtered.length;\r\n    const position = new Uint32Array(length);\r\n    const size = new Uint32Array(length);\r\n    return { filtered, position, size };\r\n  }\r\n\r\n  private filter(filter?: Filter) {\r\n    const found = [];\r\n    let data: BufferData<T> | null = this._first;\r\n    while (data !== null) {\r\n      const filterPass = this.doesFilterPass(filter, data);\r\n      if (filterPass) {\r\n        found.push(data);\r\n      }\r\n      data = data.following;\r\n    }\r\n    return found;\r\n  }\r\n\r\n  private static transform(input: BufferData<any>, positions: number[]) {\r\n    const result = this.getTempData();\r\n    const finalPosition = input.position + input.size;\r\n    const isFinal = finalPosition === positions.length;\r\n    result.position = positions[input.position];\r\n    if (isFinal) {\r\n      result.size = Infinity;\r\n    } else {\r\n      const total = positions[finalPosition];\r\n      result.size = total - result.position;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private static getBuffers(data: any, i: number) {\r\n    const position = data.position[i];\r\n    const isInf = data.size[i] === this._inf;\r\n    let size: number;\r\n    if (isInf) {\r\n      size = Infinity;\r\n    } else {\r\n      size = data.size[i];\r\n    }\r\n    return { position, size };\r\n  }\r\n\r\n  private static getTempData() {\r\n    if (!this._tempData) {\r\n      return { position: 0, size: 0 } as BufferData<any>;\r\n    }\r\n    return this._tempData;\r\n  }\r\n\r\n  private doesFilterPass(filter: Filter | undefined, data: BufferData<T>) {\r\n    const noFilter = !filter;\r\n    const filterPass = noFilter || filter(data.data);\r\n    return filterPass;\r\n  }\r\n\r\n  private setupUpdateBuffers(\r\n    a: BufferData<any>,\r\n    b: BufferData<any>,\r\n    c: BufferData<any>,\r\n  ) {\r\n    this.chainBuffers(a, b, c);\r\n    this.setupFirstBuffer(a, b);\r\n    this.setupLastBuffer(c, b);\r\n    this.setupMiddleBufferStart(b);\r\n    this.setupMiddleBufferEnd(b);\r\n  }\r\n\r\n  private setupMiddleBufferEnd(b: BufferData<any>) {\r\n    if (b.following?.data === b.data) {\r\n      if (!b.following) {\r\n        return;\r\n      }\r\n      const newSize = b.following.size + b.size;\r\n      const following = b.following.following;\r\n      b.size = newSize;\r\n      this.remove(b.following);\r\n      b.following = following;\r\n      if (b.following) {\r\n        b.following.past = b;\r\n      }\r\n    }\r\n  }\r\n\r\n  private setupFirstBuffer(a: BufferData<any>, b: BufferData<any>) {\r\n    if (!a.size) {\r\n      if (a.past) {\r\n        a.past.following = b;\r\n      } else {\r\n        this._first = b;\r\n      }\r\n      b.past = a.past;\r\n      this.remove(a);\r\n    }\r\n  }\r\n\r\n  private setupMiddleBufferStart(b: BufferData<any>) {\r\n    if (b.past?.data === b.data) {\r\n      if (!b.past) {\r\n        return;\r\n      }\r\n      b.size = b.past.size + b.size;\r\n      b.position = b.past.position;\r\n      const past = b.past.past;\r\n      this.remove(b.past);\r\n      b.past = past;\r\n      if (b.past) {\r\n        b.past.following = b;\r\n      } else {\r\n        this._first = b;\r\n      }\r\n    }\r\n  }\r\n\r\n  private chainBuffers(\r\n    a: BufferData<any>,\r\n    b: BufferData<any>,\r\n    c: BufferData<any>,\r\n  ) {\r\n    a.following = b;\r\n    b.past = a;\r\n    b.following = c;\r\n    c.past = b;\r\n  }\r\n\r\n  private setupLastBuffer(c: BufferData<any>, b: BufferData<any>) {\r\n    if (!c.size) {\r\n      if (c.following) {\r\n        c.following.past = b;\r\n      }\r\n      b.following = c.following;\r\n      this.remove(c);\r\n    }\r\n  }\r\n\r\n  private newBuffers(position: number, input: any, data: T) {\r\n    const aSize = position - input.position;\r\n    const a = this.add(input.position, aSize, input.data);\r\n    const b = this.add(position, 1, data);\r\n    const cSize = input.size - a.size - 1;\r\n    const c = this.add(position + 1, cSize, input.data);\r\n    return { a, c, b };\r\n  }\r\n\r\n  private setupInputData(input: any, a: BufferData<any>, c: BufferData<any>) {\r\n    if (input.past) {\r\n      input.past.following = a;\r\n      a.past = input.past;\r\n    } else {\r\n      this._first = a;\r\n    }\r\n\r\n    if (input.following) {\r\n      input.following.past = c;\r\n      c.following = input.following;\r\n    }\r\n\r\n    this.remove(input);\r\n  }\r\n\r\n  private newData(size: number, data: T, position = 0) {\r\n    return {\r\n      position,\r\n      size,\r\n      past: null,\r\n      following: null,\r\n      data,\r\n    } as BufferData<T>;\r\n  }\r\n\r\n  private getBufferData(index: number) {\r\n    let found: any = this._first;\r\n    while (true) {\r\n      const notFound = found === null;\r\n      const lessThanIndex = found.position <= index;\r\n      const inScope = index < found.position + found.size;\r\n      const scoped = lessThanIndex && inScope;\r\n      if (notFound || scoped) {\r\n        return found;\r\n      }\r\n      found = found.following;\r\n    }\r\n  }\r\n}\r\n","type ForEachCallback<T> = (item: T, index: number) => void;\r\n\r\nexport class MiscHelper {\r\n  static fixNumber(value: number) {\r\n    if (Number.isNaN(value)) {\r\n      return 0;\r\n    }\r\n    if (!Number.isFinite(value)) {\r\n      return 0;\r\n    }\r\n    return value;\r\n  }\r\n\r\n  static forEach<T>(items: T[] | T, callback: ForEachCallback<T>) {\r\n    if (Array.isArray(items)) {\r\n      let counter = 0;\r\n      for (const item of items) {\r\n        callback(item, counter++);\r\n      }\r\n      return;\r\n    }\r\n    callback(items, 0);\r\n  }\r\n}\r\n","export class GPU {\r\n  private static readonly capacityFactor = 200;\r\n\r\n  static estimateCapacity() {\r\n    const factor = this.capacityFactor;\r\n    const width = window.screen.width;\r\n    const height = window.screen.height;\r\n    const ratio = window.devicePixelRatio;\r\n    const result = Math.trunc(width * height * ratio * ratio * factor);\r\n    return result;\r\n  }\r\n}\r\n","/* eslint-disable no-bitwise */\r\n\r\nimport {\r\n  DataBuffer,\r\n  ItemConfigClass,\r\n  limitOf2Bytes,\r\n} from \"../../model/model-types\";\r\n\r\nexport class BitUtils {\r\n  static check(data: DataBuffer, id: number, config: ItemConfigClass) {\r\n    const filter = this.get(config);\r\n    const currentData = data[id];\r\n    const result = Boolean(currentData & filter);\r\n    return result;\r\n  }\r\n\r\n  static apply(\r\n    data: DataBuffer,\r\n    id: number,\r\n    config: ItemConfigClass,\r\n    value: boolean,\r\n  ): void {\r\n    const filter = this.get(config);\r\n    if (value) {\r\n      data[id] |= filter;\r\n      return;\r\n    }\r\n    data[id] &= ~filter;\r\n  }\r\n\r\n  static checkMemory(id: number) {\r\n    if (id > limitOf2Bytes) {\r\n      throw new Error(\"Fragments: Memory overflow!\");\r\n    }\r\n  }\r\n\r\n  private static get(value: number) {\r\n    return 1 << value;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport {\r\n  BoundingBox,\r\n  Transform,\r\n  DoubleVector,\r\n  FloatVector,\r\n  Material,\r\n} from \"../../../../Schema\";\r\nimport { MiscHelper } from \"../misc\";\r\n\r\nexport class ParserHelper {\r\n  private static _temp = {\r\n    position: new THREE.Vector3(),\r\n    xDirection: new THREE.Vector3(),\r\n    yDirection: new THREE.Vector3(),\r\n    zDirection: new THREE.Vector3(),\r\n  };\r\n\r\n  private static _doubleVector = new DoubleVector();\r\n  private static _floatVector = new FloatVector();\r\n\r\n  static parseMaterial(material: Material) {\r\n    const r = material.r() / 255;\r\n    const g = material.g() / 255;\r\n    const b = material.b() / 255;\r\n    const opacity = material.a() / 255;\r\n    const transparent = material.a() < 255;\r\n    // IFC colors are stored in sRGB color space, so we need to tell Three.js\r\n    // to convert them to linear color space.\r\n    const color = new THREE.Color().setRGB(r, g, b, THREE.SRGBColorSpace);\r\n    const renderedFaces = material.renderedFaces();\r\n    return {\r\n      color,\r\n      renderedFaces,\r\n      opacity,\r\n      transparent,\r\n      localId: undefined as number | undefined,\r\n    };\r\n  }\r\n\r\n  static parseBox(data: BoundingBox, box: THREE.Box3) {\r\n    this.getBox(data, box, \"min\");\r\n    this.getBox(data, box, \"max\");\r\n  }\r\n\r\n  static parseTransform(transform: Transform, result: THREE.Matrix4) {\r\n    this.getVector(transform, \"position\", this._doubleVector);\r\n    this.getVector(transform, \"xDirection\", this._floatVector);\r\n    this.getVector(transform, \"yDirection\", this._floatVector);\r\n    this.computeZVector();\r\n    this.setTransform(result);\r\n    return result;\r\n  }\r\n\r\n  private static setTransform(result: THREE.Matrix4) {\r\n    const { x: xx, y: xy, z: xz } = this._temp.xDirection;\r\n    const { x: yx, y: yy, z: yz } = this._temp.yDirection;\r\n    const { x: zx, y: zy, z: zz } = this._temp.zDirection;\r\n    const { x: ox, y: oy, z: oz } = this._temp.position;\r\n    // prettier-ignore\r\n    result.set(\r\n        xx, yx, zx, ox,\r\n        xy, yy, zy, oy,\r\n        xz, yz, zz, oz,\r\n        0, 0, 0, 1\r\n    );\r\n  }\r\n\r\n  private static getBox(\r\n    data: BoundingBox,\r\n    box: THREE.Box3,\r\n    point: \"min\" | \"max\"\r\n  ) {\r\n    data[point](this._floatVector);\r\n    const x = this._floatVector.x();\r\n    const y = this._floatVector.y();\r\n    const z = this._floatVector.z();\r\n    box[point].x = MiscHelper.fixNumber(x);\r\n    box[point].y = MiscHelper.fixNumber(y);\r\n    box[point].z = MiscHelper.fixNumber(z);\r\n  }\r\n\r\n  private static getVector(\r\n    transform: Transform,\r\n    name: \"position\" | \"xDirection\" | \"yDirection\",\r\n    vector: DoubleVector | FloatVector\r\n  ) {\r\n    transform[name](vector);\r\n    const parsed = this._temp[name] as THREE.Vector3;\r\n    const x = vector.x();\r\n    const y = vector.y();\r\n    const z = vector.z();\r\n    parsed.x = MiscHelper.fixNumber(x);\r\n    parsed.y = MiscHelper.fixNumber(y);\r\n    parsed.z = MiscHelper.fixNumber(z);\r\n  }\r\n\r\n  private static computeZVector() {\r\n    this._temp.zDirection.crossVectors(\r\n      this._temp.xDirection,\r\n      this._temp.yDirection\r\n    );\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport {\r\n  BoundingBox,\r\n  Representation,\r\n  Sample,\r\n  Meshes,\r\n  Transform,\r\n} from \"../../../../Schema\";\r\nimport { ParserHelper } from \"./parser-helper\";\r\n\r\nexport class TransformHelper {\r\n  private static _transform = new Transform();\r\n  private static _min = new THREE.Vector3();\r\n  private static _max = new THREE.Vector3();\r\n  private static _center = new THREE.Vector3();\r\n  private static _distance = new THREE.Vector3();\r\n  private static _edge = new THREE.Line3();\r\n  private static _item = new THREE.Matrix4();\r\n  private static _sample = new THREE.Matrix4();\r\n  private static _box = new BoundingBox();\r\n  private static _transformers = {\r\n    x: () => this.setBoxX(),\r\n    y: () => this.setBoxY(),\r\n    z: () => this.setBoxZ(),\r\n  };\r\n\r\n  static get(sample: Sample, meshes: Meshes, transform: THREE.Matrix4) {\r\n    this.fetchSampleTransform(sample, meshes);\r\n    this.fetchItemTransform(sample, meshes);\r\n    transform.multiplyMatrices(this._item, this._sample);\r\n  }\r\n\r\n  static getBox(representation: Representation, bbox: THREE.Box3) {\r\n    representation.bbox(this._box);\r\n    ParserHelper.parseBox(this._box, bbox);\r\n  }\r\n\r\n  private static getBoxData(bbox: THREE.Box3) {\r\n    this._min.copy(bbox.min);\r\n    this._max.copy(bbox.max);\r\n    this._center.addVectors(this._min, this._max);\r\n    this._center.divideScalar(2);\r\n    bbox.getSize(this._distance);\r\n  }\r\n\r\n  static boxSize(bbox: THREE.Box3) {\r\n    this.getBoxData(bbox);\r\n    this.applyTransformer();\r\n    this._edge.start = this._min.clone();\r\n    this._edge.end = this._max.clone();\r\n    return this._edge;\r\n  }\r\n\r\n  private static applyTransformer() {\r\n    const { x, y, z } = this._distance;\r\n    const max = Math.max(x, y, z);\r\n    if (x === max) {\r\n      this._transformers.x();\r\n    } else if (y === max) {\r\n      this._transformers.y();\r\n    } else {\r\n      this._transformers.z();\r\n    }\r\n  }\r\n\r\n  private static fetchItemTransform(sample: Sample, meshes: Meshes) {\r\n    const itemId = sample.item();\r\n    meshes.globalTransforms(itemId, this._transform)!;\r\n    ParserHelper.parseTransform(this._transform, this._item);\r\n  }\r\n\r\n  private static fetchSampleTransform(sample: Sample, meshes: Meshes) {\r\n    const localTransformId = sample.localTransform();\r\n    meshes.localTransforms(localTransformId, this._transform)!;\r\n    ParserHelper.parseTransform(this._transform, this._sample);\r\n  }\r\n\r\n  private static setBoxZ() {\r\n    this._min.set(this._center.x, this._center.y, this._min.z);\r\n    this._max.set(this._center.x, this._center.y, this._max.z);\r\n  }\r\n\r\n  private static setBoxY() {\r\n    this._min.set(this._center.x, this._min.y, this._center.z);\r\n    this._max.set(this._center.x, this._max.y, this._center.z);\r\n  }\r\n\r\n  private static setBoxX() {\r\n    this._min.set(this._min.x, this._center.y, this._center.z);\r\n    this._max.set(this._max.x, this._center.y, this._center.z);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\n\r\nexport class BoxUtils {\r\n  private static _temp = {\r\n    vector: new THREE.Vector3(),\r\n  };\r\n\r\n  static getWidth(box: THREE.Box3) {\r\n    box.getSize(this._temp.vector);\r\n\r\n    if (this._temp.vector.x > this._temp.vector.y) {\r\n      this._temp.vector.set(\r\n        this._temp.vector.y,\r\n        this._temp.vector.x,\r\n        this._temp.vector.z,\r\n      );\r\n    }\r\n\r\n    if (this._temp.vector.y > this._temp.vector.z) {\r\n      this._temp.vector.set(\r\n        this._temp.vector.x,\r\n        this._temp.vector.z,\r\n        this._temp.vector.y,\r\n      );\r\n    }\r\n\r\n    if (this._temp.vector.x > this._temp.vector.y) {\r\n      this._temp.vector.set(\r\n        this._temp.vector.y,\r\n        this._temp.vector.x,\r\n        this._temp.vector.z,\r\n      );\r\n    }\r\n\r\n    return this._temp.vector.y;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\n\r\nexport class FaceUtils {\r\n  static getEarcutDimensions(normal: THREE.Vector3) {\r\n    // Project points in 2D for earcut algorithm, which only works in 2D\r\n\r\n    const absX = Math.abs(normal.x);\r\n    const absY = Math.abs(normal.y);\r\n    const absZ = Math.abs(normal.z);\r\n\r\n    const xDim = 0;\r\n    const yDim = 1;\r\n    const zDim = 2;\r\n\r\n    const isMostlyHorizontal = absZ > absX && absZ > absY;\r\n    if (isMostlyHorizontal) {\r\n      const lookingUp = normal.z > 0;\r\n      if (lookingUp) {\r\n        return [xDim, yDim];\r\n      }\r\n      return [yDim, xDim];\r\n    }\r\n\r\n    const isMostlyLookingToY = absY > absX && absY > absZ;\r\n    if (isMostlyLookingToY) {\r\n      const isLookingYPositive = normal.y > 0;\r\n      if (isLookingYPositive) {\r\n        return [zDim, xDim];\r\n      }\r\n      return [xDim, zDim];\r\n    }\r\n\r\n    // At this point, we know that the normal is mostly looking to the X axis\r\n\r\n    const isLookingXPositive = normal.x > 0;\r\n    if (isLookingXPositive) {\r\n      return [yDim, zDim];\r\n    }\r\n\r\n    return [zDim, yDim];\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { Line2 } from \"three/examples/jsm/lines/Line2.js\";\r\nimport { LineMaterial } from \"three/examples/jsm/lines/LineMaterial.js\";\r\nimport { LineGeometry } from \"three/examples/jsm/lines/LineGeometry.js\";\r\nimport { FragmentsModel } from \"./fragments-model\";\r\nimport {\r\n  AlignmentCurveType,\r\n  AlignmentCurve,\r\n  AlignmentData,\r\n} from \"./model-types\";\r\n\r\nexport class AlignmentsManager {\r\n  private model: FragmentsModel;\r\n\r\n  private _endpointsMaterials = {\r\n    interior: new THREE.PointsMaterial({\r\n      color: 0xeeeeee,\r\n      size: 8,\r\n      sizeAttenuation: false,\r\n      depthTest: false,\r\n    }),\r\n    exterior: new THREE.PointsMaterial({\r\n      color: 0xffffff,\r\n      size: 16,\r\n      sizeAttenuation: false,\r\n      depthTest: false,\r\n    }),\r\n  };\r\n\r\n  // Each alignment is a THREE.Group of THREE.Line2 (curves) and THREE.Points (endpoints)\r\n  private _absoluteAlignments = new THREE.Group();\r\n  private _horizontalAlignments = new THREE.Group();\r\n  private _verticalAlignments = new THREE.Group();\r\n\r\n  private _alignmentMaterials = new Map<AlignmentCurveType, LineMaterial>([\r\n    [\r\n      AlignmentCurveType.NONE,\r\n      new LineMaterial({\r\n        color: 0xffffff,\r\n        linewidth: 5,\r\n        depthTest: false,\r\n      }),\r\n    ],\r\n    [\r\n      AlignmentCurveType.LINES,\r\n      new LineMaterial({\r\n        color: 0xff00ff,\r\n        linewidth: 5,\r\n        depthTest: false,\r\n      }),\r\n    ],\r\n    [\r\n      AlignmentCurveType.CLOTHOID,\r\n      new LineMaterial({\r\n        color: 0xff0000,\r\n        linewidth: 5,\r\n        depthTest: false,\r\n      }),\r\n    ],\r\n    [\r\n      AlignmentCurveType.ELLIPSE_ARC,\r\n      new LineMaterial({\r\n        color: 0x00ffff,\r\n        linewidth: 5,\r\n        depthTest: false,\r\n      }),\r\n    ],\r\n    [\r\n      AlignmentCurveType.PARABOLA,\r\n      new LineMaterial({\r\n        color: 0x0000ff,\r\n        linewidth: 5,\r\n        depthTest: false,\r\n      }),\r\n    ],\r\n  ]);\r\n\r\n  constructor(model: FragmentsModel) {\r\n    this.model = model;\r\n  }\r\n\r\n  async getAlignments() {\r\n    if (!this._absoluteAlignments.children.length) {\r\n      await this.constructAlignments();\r\n    }\r\n    return this._absoluteAlignments;\r\n  }\r\n\r\n  async getHorizontalAlignments() {\r\n    if (!this._horizontalAlignments.children.length) {\r\n      await this.constructAlignments();\r\n    }\r\n    return this._horizontalAlignments;\r\n  }\r\n\r\n  async getVerticalAlignments() {\r\n    if (!this._verticalAlignments.children.length) {\r\n      await this.constructAlignments();\r\n    }\r\n    return this._verticalAlignments;\r\n  }\r\n\r\n  async getAlignmentStyles() {\r\n    return { ...this._alignmentMaterials, ...this._endpointsMaterials };\r\n  }\r\n\r\n  private async constructAlignments() {\r\n    const result = (await this.model.threads.invoke(\r\n      this.model.modelId,\r\n      \"getAlignments\",\r\n    )) as AlignmentData[];\r\n\r\n    // Construct the curves\r\n    for (const alignmentData of result) {\r\n      this.constructLine(alignmentData.absolute, this._absoluteAlignments);\r\n      this.constructLine(alignmentData.horizontal, this._horizontalAlignments);\r\n      this.constructLine(alignmentData.vertical, this._verticalAlignments);\r\n    }\r\n  }\r\n\r\n  private constructLine(data: AlignmentCurve[], parent: THREE.Group) {\r\n    if (!data.length) {\r\n      return;\r\n    }\r\n\r\n    const iPoints: number[] = [];\r\n    const ePoints: number[] = [];\r\n\r\n    const alignment = new THREE.Group();\r\n    parent.add(alignment);\r\n\r\n    const firstPoints = data[0].points;\r\n    const lastPoints = data[data.length - 1].points;\r\n    ePoints.push(lastPoints[0], lastPoints[1], lastPoints[2]);\r\n    ePoints.push(\r\n      firstPoints[firstPoints.length - 3],\r\n      firstPoints[firstPoints.length - 2],\r\n      firstPoints[firstPoints.length - 1],\r\n    );\r\n\r\n    for (const curve of data) {\r\n      const points = curve.points;\r\n\r\n      iPoints.push(points[0], points[1], points[2]);\r\n      iPoints.push(\r\n        points[points.length - 3],\r\n        points[points.length - 2],\r\n        points[points.length - 1],\r\n      );\r\n\r\n      const geometry = new LineGeometry();\r\n      geometry.setPositions(points);\r\n      const material = this._alignmentMaterials.get(curve.type);\r\n      const line = new Line2(geometry, material);\r\n      alignment.add(line);\r\n      line.renderOrder = 1;\r\n      // Otherwise we can't retrieve the points later (e.g. for raycasting)\r\n      line.userData.points = points;\r\n    }\r\n\r\n    const { interior, exterior } = this._endpointsMaterials;\r\n    this.constructPoints(iPoints, interior, alignment);\r\n    this.constructPoints(ePoints, exterior, alignment);\r\n  }\r\n\r\n  private constructPoints(\r\n    pointsArray: number[],\r\n    material: THREE.PointsMaterial,\r\n    alignment: THREE.Group,\r\n  ) {\r\n    const points = new THREE.Points();\r\n    const pointsGeom = new THREE.BufferGeometry();\r\n    const pointsBuffer = new Float32Array(pointsArray);\r\n    const pointsAttr = new THREE.BufferAttribute(pointsBuffer, 3);\r\n    pointsGeom.setAttribute(\"position\", pointsAttr);\r\n    points.geometry = pointsGeom;\r\n    points.material = material;\r\n    alignment.add(points);\r\n    points.renderOrder = 2;\r\n    // console.log(points);\r\n  }\r\n\r\n  dispose() {\r\n    this._absoluteAlignments.removeFromParent();\r\n    for (const alignment of this._absoluteAlignments.children) {\r\n      const line = alignment as THREE.Mesh;\r\n      line.geometry.dispose();\r\n      line.geometry = undefined as any;\r\n      line.material = undefined as any;\r\n    }\r\n    for (const material of Object.values(this._alignmentMaterials)) {\r\n      material.dispose();\r\n    }\r\n    this._alignmentMaterials = {} as any;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { MultiThreadingRequestClass, VirtualModelConfig } from \"./model-types\";\r\nimport { FragmentsModel } from \"./fragments-model\";\r\n\r\nexport class SetupManager {\r\n  async setup(\r\n    model: FragmentsModel,\r\n    bbox: THREE.Box3,\r\n    modelData: ArrayBuffer | Uint8Array,\r\n    raw?: boolean,\r\n    config?: VirtualModelConfig,\r\n  ) {\r\n    const message = this.getCreateModelMessage(model, modelData, raw, config);\r\n    const data = this.formatModelData(modelData);\r\n    const result = await model.threads.fetch(message, data);\r\n    this.updateBox(bbox, result);\r\n  }\r\n\r\n  private formatModelData(modelData: ArrayBuffer | Uint8Array) {\r\n    if (modelData instanceof ArrayBuffer) {\r\n      return [modelData];\r\n    }\r\n    return undefined;\r\n  }\r\n\r\n  private updateBox(bbox: THREE.Box3, result: any) {\r\n    bbox.min.copy(result.boundingBox.min);\r\n    bbox.max.copy(result.boundingBox.max);\r\n  }\r\n\r\n  private getCreateModelMessage(\r\n    model: FragmentsModel,\r\n    modelData: ArrayBuffer | Uint8Array,\r\n    raw: boolean | undefined,\r\n    config: VirtualModelConfig | undefined,\r\n  ) {\r\n    return {\r\n      class: MultiThreadingRequestClass.CREATE_MODEL,\r\n      modelId: model.modelId,\r\n      modelData,\r\n      raw,\r\n      config,\r\n    } as any;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { MultiThreadingRequestClass } from \"./model-types\";\r\nimport { FragmentsModel } from \"./fragments-model\";\r\n\r\nexport class BoxManager {\r\n  async getBoxes(model: FragmentsModel, localIds?: number[]) {\r\n    const ids = this.getIndividualBoxesIds(localIds);\r\n    const request = this.getBoxRequest(model, ids);\r\n    const response = await model.threads.fetch(request);\r\n    return this.getAllBoxes(response, model);\r\n  }\r\n\r\n  async getMergedBox(model: FragmentsModel, localIds: number[]) {\r\n    const request = this.getBoxRequest(model, [localIds]);\r\n    const { boxes } = await model.threads.fetch(request);\r\n    const [box] = boxes;\r\n    return this.getAbsoluteBox(box, model);\r\n  }\r\n\r\n  private getAbsoluteBox(box: any, model: FragmentsModel) {\r\n    const merged = new THREE.Box3();\r\n    merged.copy(box);\r\n    merged.applyMatrix4(model.object.matrixWorld);\r\n    return merged;\r\n  }\r\n\r\n  private getIndividualBoxesIds(localIds: number[] | undefined) {\r\n    if (!localIds) return undefined;\r\n    const ids: number[][] = [];\r\n    for (const id of localIds) {\r\n      ids.push([id]);\r\n    }\r\n    return ids;\r\n  }\r\n\r\n  private getAllBoxes(response: any, model: FragmentsModel) {\r\n    const rawBoxes = response.boxes;\r\n    const result: THREE.Box3[] = [];\r\n    for (const box of rawBoxes) {\r\n      const newBox = new THREE.Box3();\r\n      newBox.copy(box);\r\n      newBox.applyMatrix4(model.object.matrixWorld);\r\n      result.push(newBox);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private getBoxRequest(\r\n    model: FragmentsModel,\r\n    localIds: number[][] | undefined,\r\n  ) {\r\n    return {\r\n      class: MultiThreadingRequestClass.FETCH_BOXES,\r\n      modelId: model.modelId,\r\n      localIds,\r\n    };\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { FragmentsModel } from \"./fragments-model\";\r\n\r\nexport class CoordinatesManager {\r\n  private _coordinationMatrices = new Map<string, THREE.Matrix4>();\r\n\r\n  async getCoordinationMatrix(model: FragmentsModel) {\r\n    let matrix = this._coordinationMatrices.get(model.modelId);\r\n    if (matrix) {\r\n      return matrix;\r\n    }\r\n\r\n    matrix = new THREE.Matrix4();\r\n    this._coordinationMatrices.set(model.modelId, matrix);\r\n\r\n    const [x, y, z, xx, xy, xz, yx, yy, yz] = await this.getCoordinates(model);\r\n\r\n    const xDir = new THREE.Vector3(xx, xy, xz);\r\n    const yDir = new THREE.Vector3(yx, yy, yz);\r\n    const zDir = new THREE.Vector3().crossVectors(xDir, yDir);\r\n\r\n    matrix.set(\r\n      xx,\r\n      yx,\r\n      zDir.x,\r\n      x,\r\n      xy,\r\n      yy,\r\n      zDir.y,\r\n      y,\r\n      xz,\r\n      yz,\r\n      zDir.z,\r\n      z,\r\n      0,\r\n      0,\r\n      0,\r\n      1,\r\n    );\r\n\r\n    return matrix;\r\n  }\r\n\r\n  async getCoordinates(model: FragmentsModel) {\r\n    const id = model.modelId;\r\n    return model.threads.invoke(id, \"getCoordinates\") as Promise<number[]>;\r\n  }\r\n\r\n  async getPositions(model: FragmentsModel, localIds?: number[]) {\r\n    const args = [localIds];\r\n    const localPositions = await model.threads.invoke(\r\n      model.modelId,\r\n      \"getPositions\",\r\n      args,\r\n    );\r\n    return this.getAbsolutePositions(localPositions, model);\r\n  }\r\n\r\n  private getAbsolutePositions(\r\n    result: { x: number; y: number; z: number }[],\r\n    model: FragmentsModel,\r\n  ) {\r\n    const positions: THREE.Vector3[] = [];\r\n    for (const position of result) {\r\n      const { x, y, z } = position;\r\n      const vector = new THREE.Vector3(x, y, z);\r\n      vector.applyMatrix4(model.object.matrixWorld);\r\n      positions.push(vector);\r\n    }\r\n    return positions;\r\n  }\r\n}\r\n","import { AttrsChange, AttributeData } from \"./model-types\";\r\n\r\n/** A Map that represents a collection of attributes for an item in a Fragments model. */\r\nexport class ItemAttributes extends Map<string, AttributeData> {\r\n  /**\r\n   * A map of local IDs to their corresponding attribute changes.\r\n   * This is used to track changes to the attributes over time.\r\n   */\r\n  tracker: Map<number, AttrsChange> | null = null;\r\n\r\n  /**\r\n   * The local ID of the item.\r\n   */\r\n  localId: number;\r\n\r\n  /**\r\n   * Gets the attributes as a plain javascript object.\r\n   */\r\n  get object() {\r\n    const attr: Record<string, any> = {};\r\n    for (const [key, data] of this.entries()) {\r\n      attr[key] = data.value;\r\n    }\r\n    return attr;\r\n  }\r\n\r\n  /**\r\n   * Creates a new ItemAttributes instance.\r\n   * @param localId - The local ID of the item.\r\n   * @param iterable - An optional iterable of key-value pairs to initialize the map with.\r\n   */\r\n  constructor(\r\n    localId: number,\r\n    iterable?: Iterable<readonly [string, AttributeData]> | null | undefined,\r\n  ) {\r\n    super(iterable);\r\n    this.localId = localId;\r\n  }\r\n\r\n  /**\r\n   * A function that acts as a guard for adding items to the set.\r\n   * It determines whether a given value should be allowed to be added to the set.\r\n   *\r\n   * @param key - The key of the entry to be checked against the guard.\r\n   * @param value - The value of the entry to be checked against the guard.\r\n   * @returns A boolean indicating whether the value should be allowed to be added to the set.\r\n   *          By default, this function always returns true, allowing all values to be added.\r\n   *          You can override this behavior by providing a custom implementation.\r\n   */\r\n  guard: (key: string, value: AttributeData) => boolean = () => true;\r\n\r\n  /**\r\n   * Sets an attribute in the map.\r\n   * @param key - The key of the attribute to set.\r\n   * @param attr - The attribute data to set.\r\n   * @returns The updated map.\r\n   */\r\n  set(key: string, attr: AttributeData) {\r\n    const guard = this.guard ?? (() => true);\r\n    const isValid = guard(key, attr);\r\n    if (!isValid) return this;\r\n\r\n    const value =\r\n      attr.type !== undefined\r\n        ? attr\r\n        : { value: attr.value, type: this.getType(key) };\r\n\r\n    if (!this.tracker) return super.set(key, value);\r\n\r\n    if (this.localId === null) {\r\n      console.warn(\r\n        \"Item attributes are missing a valid localId. Changes can't be tracked.\",\r\n      );\r\n      return super.set(key, value);\r\n    }\r\n\r\n    let itemChanges = this.tracker.get(this.localId);\r\n    if (!itemChanges) {\r\n      itemChanges = { type: \"modified\", added: {}, deleted: [], modified: {} };\r\n      this.tracker.set(this.localId, itemChanges);\r\n    }\r\n\r\n    if (itemChanges.type === \"added\") {\r\n      itemChanges.data[key] = value;\r\n    } else if (itemChanges.type === \"modified\") {\r\n      if (this.has(key)) {\r\n        itemChanges.modified[key] = value;\r\n      } else if (itemChanges.deleted.includes(key)) {\r\n        itemChanges.deleted = itemChanges.deleted.filter((k) => k !== key);\r\n        itemChanges.modified[key] = value;\r\n      } else {\r\n        itemChanges.added[key] = value;\r\n      }\r\n    }\r\n\r\n    return super.set(key, value);\r\n  }\r\n\r\n  /**\r\n   * Sets the value of an attribute in the map.\r\n   * @param key - The key of the attribute to set.\r\n   * @param value - The value of the attribute to set.\r\n   * @returns The updated map.\r\n   */\r\n  setValue(key: string, value: any) {\r\n    return this.set(key, { value, type: this.getType(key) });\r\n  }\r\n\r\n  /**\r\n   * Sets the type of an attribute in the map.\r\n   * @param key - The key of the attribute to set.\r\n   * @param type - The type of the attribute to set.\r\n   * @returns The updated map.\r\n   */\r\n  setType(key: string, type: number) {\r\n    const value = this.getValue(key);\r\n    if (!value) return this;\r\n    return this.set(key, { value, type });\r\n  }\r\n\r\n  /**\r\n   * Deletes an attribute from the map.\r\n   * @param key - The key of the attribute to delete.\r\n   * @returns The updated map.\r\n   */\r\n  delete(key: string) {\r\n    if (!this.tracker) return super.delete(key);\r\n\r\n    const localId = this.get(\"localId\");\r\n    if (localId === undefined || typeof localId !== \"number\") {\r\n      console.warn(\r\n        \"Item attributes are missing a valid localId. Changes can't be tracked.\",\r\n      );\r\n      if (key === \"localId\") return false;\r\n      return super.delete(key);\r\n    }\r\n\r\n    if (key === \"localId\") return false;\r\n    if (!this.has(key)) return false;\r\n\r\n    let itemChanges = this.tracker.get(localId);\r\n    if (!itemChanges) {\r\n      itemChanges = { type: \"modified\", added: {}, deleted: [], modified: {} };\r\n      this.tracker.set(localId, itemChanges);\r\n    }\r\n\r\n    if (itemChanges.type === \"added\") {\r\n      delete itemChanges.data[key];\r\n    } else if (itemChanges.type === \"modified\") {\r\n      if (key in itemChanges.added) {\r\n        delete itemChanges.added[key];\r\n      } else if (key in itemChanges.modified) {\r\n        delete itemChanges.modified[key];\r\n        itemChanges.deleted.push(key);\r\n      } else {\r\n        itemChanges.deleted.push(key);\r\n      }\r\n    }\r\n\r\n    return super.delete(key);\r\n  }\r\n\r\n  /**\r\n   * Gets the value of an attribute from the map.\r\n   * @param key - The key of the attribute to get.\r\n   */\r\n  getValue(key: string) {\r\n    const data = this.get(key);\r\n    if (!data) return null;\r\n    return data.value;\r\n  }\r\n\r\n  /**\r\n   * Gets the type of an attribute from the map.\r\n   * @param key - The key of the attribute to get.\r\n   */\r\n  getType(key: string) {\r\n    return this.get(key)?.type;\r\n  }\r\n\r\n  // async getRelationAttribute(relation: string, attribute: string) {\r\n  //   return (await this.relations.getItems(relation))?.map((item) =>\r\n  //     item.getValue(attribute),\r\n  //   );\r\n  // }\r\n}\r\n","import { Item } from \"./item\";\r\nimport { RelsChange } from \"./model-types\";\r\n\r\n/** A Map that stores and manages relations between items in a Fragments model, keyed by relation name with Sets of related item IDs as values. */\r\nexport class ItemRelations extends Map<string, Set<number>> {\r\n  /**\r\n   * A map that tracks the changes to the relations of the item.\r\n   */\r\n  tracker: Map<number, RelsChange> | null = null;\r\n  /**\r\n   * The local ID of the item.\r\n   */\r\n  localId: number;\r\n\r\n  private get itemChanges() {\r\n    if (!this.tracker) return null;\r\n\r\n    if (!this.localId) {\r\n      console.warn(\"Item relations can't be tracked.\");\r\n      return null;\r\n    }\r\n\r\n    let itemChanges = this.tracker.get(this.localId);\r\n    if (!itemChanges) {\r\n      itemChanges = {\r\n        type: \"modified\",\r\n        added: {},\r\n        deleted: new Set(),\r\n        removed: {},\r\n        modified: {},\r\n      };\r\n      this.tracker.set(this.localId, itemChanges);\r\n    }\r\n\r\n    return itemChanges;\r\n  }\r\n\r\n  /**\r\n   * Creates a new ItemRelations instance.\r\n   * @param localId - The local ID of the item.\r\n   * @param iterable - An optional iterable of key-value pairs to initialize the map with.\r\n   */\r\n  constructor(\r\n    localId: number,\r\n    iterable?: Iterable<readonly [string, Set<number>]> | null | undefined,\r\n  ) {\r\n    super(iterable);\r\n    this.localId = localId;\r\n  }\r\n\r\n  /**\r\n   * A function that acts as a guard for adding items to the set.\r\n   * It determines whether a given value should be allowed to be added to the set.\r\n   *\r\n   * @param key - The key of the entry to be checked against the guard.\r\n   * @param value - The value of the entry to be checked against the guard.\r\n   * @returns A boolean indicating whether the value should be allowed to be added to the set.\r\n   *          By default, this function always returns true, allowing all values to be added.\r\n   *          You can override this behavior by providing a custom implementation.\r\n   */\r\n  guard: (key: string, value: Set<number>) => boolean = () => true;\r\n\r\n  /**\r\n   * Sets a new relation in the map.\r\n   * @param key - The key of the relation.\r\n   * @param value - The value of the relation.\r\n   * @returns The ItemRelations instance.\r\n   */\r\n  set(key: string, value: Set<number>) {\r\n    const keyExisted = this.has(key);\r\n\r\n    const guard = this.guard ?? (() => true);\r\n    const isValid = guard(key, value);\r\n    if (!isValid) return this;\r\n\r\n    const itemChanges = this.itemChanges;\r\n    if (!itemChanges) return super.set(key, value);\r\n\r\n    if (keyExisted) {\r\n      itemChanges.modified[key] = value;\r\n    } else {\r\n      itemChanges.added[key] = value;\r\n    }\r\n\r\n    return super.set(key, value);\r\n  }\r\n\r\n  /**\r\n   * Adds a new item to a target relation.\r\n   * @param key - The key of the relation.\r\n   * @param item - The item to add to the relation.\r\n   */\r\n  add(key: string, item: number) {\r\n    const keyExisted = this.has(key);\r\n\r\n    let items = this.get(key);\r\n    if (!items) {\r\n      items = new Set([item]);\r\n      this.set(key, items);\r\n      return true;\r\n    }\r\n\r\n    if (!items || items.has(item)) return false;\r\n\r\n    const itemChanges = this.itemChanges;\r\n    if (!itemChanges) {\r\n      items.add(item);\r\n      return true;\r\n    }\r\n\r\n    if (keyExisted) {\r\n      if (itemChanges.removed[key]?.has(item)) {\r\n        itemChanges.removed[key].delete(item);\r\n        if (itemChanges.removed[key].size === 0)\r\n          delete itemChanges.removed[key];\r\n      } else {\r\n        let modificationChanges = itemChanges.modified[key];\r\n        if (!modificationChanges) {\r\n          modificationChanges = new Set();\r\n          itemChanges.modified[key] = modificationChanges;\r\n        }\r\n        modificationChanges.add(item);\r\n      }\r\n    } else {\r\n      let addedChanges = itemChanges.added[key];\r\n      if (!addedChanges) {\r\n        addedChanges = new Set();\r\n        itemChanges.added[key] = addedChanges;\r\n      }\r\n      addedChanges.add(item);\r\n    }\r\n\r\n    items.add(item);\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Removes an item from a target relation.\r\n   * @param key - The key of the relation.\r\n   * @param item - The item to remove from the relation.\r\n   * @returns A boolean indicating whether the item was removed from the relation.\r\n   */\r\n  remove(key: string, item: number) {\r\n    const items = this.get(key);\r\n    if (!items) return false;\r\n\r\n    if (!items.has(item)) return false;\r\n\r\n    const itemChanges = this.itemChanges;\r\n    if (!itemChanges) return items.delete(item);\r\n\r\n    if (itemChanges.modified[key]?.has(item)) {\r\n      itemChanges.modified[key].delete(item);\r\n      if (itemChanges.modified[key].size === 0)\r\n        delete itemChanges.modified[key];\r\n    } else {\r\n      let removeChanges = itemChanges.removed[key];\r\n      if (!removeChanges) {\r\n        removeChanges = new Set();\r\n        itemChanges.removed[key] = removeChanges;\r\n      }\r\n      removeChanges.add(item);\r\n    }\r\n\r\n    return items.delete(item);\r\n  }\r\n\r\n  /**\r\n   * Deletes a relation from the map.\r\n   * @param key - The key of the relation to delete.\r\n   */\r\n  delete(key: string) {\r\n    if (!this.has(key)) return false;\r\n    const itemChanges = this.itemChanges;\r\n    if (!itemChanges) return super.delete(key);\r\n    itemChanges.deleted.add(key);\r\n    return super.delete(key);\r\n  }\r\n\r\n  /**\r\n   * An event handler that is called when items are requested.\r\n   */\r\n  onItemsRequested:\r\n    | ((ids: number[], includeRelations?: boolean) => Promise<Item[]>)\r\n    | null = null;\r\n\r\n  /**\r\n   * Gets the items of a relation.\r\n   * @param key - The key of the relation.\r\n   */\r\n  async getItems(key: string) {\r\n    if (!this.onItemsRequested) return null;\r\n    const relations = this.get(key);\r\n    if (!relations) return null;\r\n    const items = await this.onItemsRequested([...relations]);\r\n    return items;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { MeshData } from \"./model-types\";\r\nimport { FragmentsModel } from \"./fragments-model\";\r\n\r\n/**\r\n * Represents the geometry of an item in a Fragments model.\r\n */\r\nexport class ItemGeometry {\r\n  /**\r\n   * The model that the geometry belongs to.\r\n   */\r\n  readonly model: FragmentsModel;\r\n\r\n  /**\r\n   * The local ID of the item.\r\n   */\r\n  localId: number;\r\n\r\n  /**\r\n   * Creates a new ItemGeometry instance.\r\n   * @param model - The model that the geometry belongs to.\r\n   * @param localId - The local ID of the item.\r\n   */\r\n  constructor(model: FragmentsModel, localId: number) {\r\n    this.model = model;\r\n    this.localId = localId;\r\n  }\r\n\r\n  async get() {\r\n    const [geometries] = (await this.model.threads.invoke(\r\n      this.model.modelId,\r\n      \"getItemsGeometry\",\r\n      [[this.localId]],\r\n    )) as MeshData[][];\r\n\r\n    for (const geometryData of geometries) {\r\n      geometryData.transform = new THREE.Matrix4().fromArray(\r\n        geometryData.transform.elements,\r\n      );\r\n      const { indices, normals, positions, transform } = geometryData;\r\n      if (!this._indices) this._indices = [];\r\n      if (!this._normals) this._normals = [];\r\n      if (!this._positions) this._positions = [];\r\n      if (!this._transform) this._transform = [];\r\n      this._indices.push(indices as any);\r\n      this._normals.push(normals as any);\r\n      this._positions.push(positions as any);\r\n      this._transform.push(transform);\r\n    }\r\n\r\n    return geometries;\r\n  }\r\n\r\n  private _indices: Uint8Array[] | Uint16Array[] | Uint32Array[] | null = null;\r\n  /**\r\n   * Gets the indices of the item.\r\n   */\r\n  async getIndices() {\r\n    if (this._indices !== null) return this._indices;\r\n    await this.get();\r\n    return this._indices;\r\n  }\r\n\r\n  private _transform: THREE.Matrix4[] | null = null;\r\n  /**\r\n   * Gets the transform of the item.\r\n   */\r\n  async getTransform() {\r\n    if (this._transform !== null) return this._transform;\r\n    await this.get();\r\n    return this._transform;\r\n  }\r\n\r\n  private _normals: Int16Array[] | null = null;\r\n  /**\r\n   * Gets the normals of the item.\r\n   */\r\n  async getNormals() {\r\n    if (this._normals !== null) return this._normals;\r\n    await this.get();\r\n    return this._normals;\r\n  }\r\n\r\n  private _positions: Float32Array[] | Float64Array[] | null = null;\r\n  /**\r\n   * Gets the positions of the item.\r\n   */\r\n  async getPositions() {\r\n    if (this._positions !== null) return this._positions;\r\n    await this.get();\r\n    return this._positions;\r\n  }\r\n\r\n  private _vertices: THREE.Vector3[][] | null = null;\r\n  /**\r\n   * Gets the vertices of the item.\r\n   */\r\n  async getVertices() {\r\n    if (this._vertices) return this._vertices;\r\n\r\n    const allPositions = await this.getPositions();\r\n    const allTransforms = await this.getTransform();\r\n    if (!allPositions || !allTransforms) return this._vertices;\r\n\r\n    this._vertices = [];\r\n\r\n    for (let i = 0; i < allPositions.length; i++) {\r\n      const positions = allPositions[i];\r\n      const transform = allTransforms[i];\r\n      if (!positions || !transform) continue;\r\n\r\n      const currentVertices: THREE.Vector3[] = [];\r\n      this._vertices.push(currentVertices);\r\n\r\n      const numVertices = Object.keys(positions).length / 3;\r\n      const hashes: string[] = [];\r\n\r\n      for (let i = 0; i < numVertices; i++) {\r\n        const x = positions[i * 3];\r\n        const y = positions[i * 3 + 1];\r\n        const z = positions[i * 3 + 2];\r\n        if (\r\n          typeof x !== \"number\" ||\r\n          typeof y !== \"number\" ||\r\n          typeof z !== \"number\"\r\n        ) {\r\n          continue;\r\n        }\r\n        const hash = `${x},${y},${z}`;\r\n        if (hashes.includes(hash)) continue;\r\n        hashes.push(hash);\r\n\r\n        const vertex = new THREE.Vector3(x, y, z);\r\n        vertex.applyMatrix4(transform);\r\n        currentVertices.push(vertex);\r\n      }\r\n    }\r\n\r\n    return this._vertices;\r\n  }\r\n\r\n  private _triangles: THREE.Triangle[][] | null = null;\r\n  /**\r\n   * Gets the triangles of the item.\r\n   */\r\n  async getTriangles() {\r\n    if (this._triangles) return this._triangles;\r\n\r\n    const allIndices = await this.getIndices();\r\n    const allPositions = await this.getPositions();\r\n    const allTransforms = await this.getTransform();\r\n    if (!allIndices || !allPositions || !allTransforms) return this._triangles;\r\n\r\n    this._triangles = [];\r\n\r\n    for (let i = 0; i < allIndices.length; i++) {\r\n      const indices = allIndices[i];\r\n      const positions = allPositions[i];\r\n      const transform = allTransforms[i];\r\n      if (!indices || !positions || !transform) continue;\r\n\r\n      const currentTriangles: THREE.Triangle[] = [];\r\n      this._triangles.push(currentTriangles);\r\n\r\n      for (let i = 0; i < indices.length; i += 3) {\r\n        const a = indices[i];\r\n        const b = indices[i + 1];\r\n        const c = indices[i + 2];\r\n\r\n        const v1 = new THREE.Vector3(\r\n          positions[a * 3],\r\n          positions[a * 3 + 1],\r\n          positions[a * 3 + 2],\r\n        );\r\n\r\n        const v2 = new THREE.Vector3(\r\n          positions[b * 3],\r\n          positions[b * 3 + 1],\r\n          positions[b * 3 + 2],\r\n        );\r\n\r\n        const v3 = new THREE.Vector3(\r\n          positions[c * 3],\r\n          positions[c * 3 + 1],\r\n          positions[c * 3 + 2],\r\n        );\r\n\r\n        v1.applyMatrix4(transform);\r\n        v2.applyMatrix4(transform);\r\n        v3.applyMatrix4(transform);\r\n\r\n        currentTriangles.push(new THREE.Triangle(v1, v2, v3));\r\n      }\r\n    }\r\n\r\n    return this._triangles;\r\n  }\r\n\r\n  private _position: THREE.Vector3[] | null = null;\r\n  /**\r\n   * Gets the position of the item.\r\n   */\r\n  async getPosition() {\r\n    if (!this._position) {\r\n      if (this.localId === null) return null;\r\n      this._position = await this.model.getPositions([this.localId]);\r\n    }\r\n    return this._position;\r\n  }\r\n\r\n  private _box: THREE.Box3[] | null = null;\r\n  /**\r\n   * Gets the box of the item.\r\n   */\r\n  async getBox() {\r\n    if (!this._box) {\r\n      if (this.localId === null) return null;\r\n      this._box = await this.model.getBoxes([this.localId]);\r\n    }\r\n    return this._box;\r\n  }\r\n\r\n  /**\r\n   * Sets the visibility of the item.\r\n   * @param visible - Whether the item should be visible.\r\n   */\r\n  async setVisibility(visible: boolean) {\r\n    await this.model.setVisible([this.localId], visible);\r\n  }\r\n\r\n  /**\r\n   * Gets the visibility of the item.\r\n   */\r\n  async getVisibility() {\r\n    const [result] = await this.model.getVisible([this.localId]);\r\n    return result;\r\n  }\r\n}\r\n","import { ItemAttributes } from \"./item-attributes\";\r\nimport { ItemRelations } from \"./item-relations\";\r\nimport { ItemGeometry } from \"./item-geometry\";\r\nimport { FragmentsModel } from \"./fragments-model\";\r\nimport { Identifier } from \"./model-types\";\r\n\r\n/** Represents a single item in a Fragments model, providing methods to access and retrieve its attributes, relations, geometry, and data. */\r\nexport class Item {\r\n  /**\r\n   * The FragmentsModel instance that this item belongs to.\r\n   */\r\n  readonly model: FragmentsModel;\r\n\r\n  /**\r\n   * Creates a new Item instance.\r\n   * @param model - The FragmentsModel instance that this item belongs to.\r\n   * @param id - The identifier for the item, which can be either a number or a string.\r\n   */\r\n  constructor(model: FragmentsModel, id: Identifier) {\r\n    this.model = model;\r\n    if (typeof id === \"number\") this._localId = id;\r\n    if (typeof id === \"string\") this._guid = id;\r\n  }\r\n\r\n  private _localId: number | null = null;\r\n\r\n  /**\r\n   * Gets the local ID of the item.\r\n   */\r\n  async getLocalId() {\r\n    if (!this._localId) {\r\n      if (this._guid) {\r\n        [this._localId] = (await this.model.threads.invoke(\r\n          this.model.modelId,\r\n          \"getLocalIdsByGuids\",\r\n          // @ts-ignore\r\n          [[this._guid]],\r\n        )) as (number | null)[];\r\n      } else {\r\n        throw new Error(\"Fragments: Item localId couldn't be get.\");\r\n      }\r\n    }\r\n    return this._localId;\r\n  }\r\n\r\n  private _attributes: ItemAttributes | null = null;\r\n\r\n  /**\r\n   * Gets all the attributes of the item.\r\n   */\r\n  async getAttributes() {\r\n    if (this._attributes) return this._attributes;\r\n    const localId = await this.getLocalId();\r\n    if (localId === null) return null;\r\n\r\n    const data = (await this.model.threads.invoke(\r\n      this.model.modelId,\r\n      \"getItemAttributes\",\r\n      // @ts-ignore\r\n      [localId],\r\n    )) as { [name: string]: { value: any; type?: number } } | null;\r\n\r\n    this._attributes = new ItemAttributes(localId);\r\n\r\n    if (!data) {\r\n      const changes = this.model.attrsChanges.get(localId);\r\n      if (!(changes && changes.type === \"added\")) return null;\r\n      this._attributes.localId = localId;\r\n      for (const [key, value] of Object.entries(changes.data))\r\n        this._attributes.set(key, value);\r\n      return this._attributes;\r\n    }\r\n\r\n    const changes = this.model.attrsChanges.get(localId);\r\n    if (changes && changes.type === \"modified\") {\r\n      for (const [key, value] of Object.entries(changes.added))\r\n        this._attributes.set(key, value);\r\n    }\r\n\r\n    for (const name in data) {\r\n      const { value, type } = data[name];\r\n      if (changes?.type === \"modified\" && changes.deleted.includes(name))\r\n        continue;\r\n      if (changes?.type === \"modified\" && name in changes.modified) {\r\n        this._attributes.set(name, changes.modified[name]);\r\n      } else {\r\n        this._attributes.set(name, { value, type });\r\n      }\r\n    }\r\n\r\n    this._attributes.tracker = this.model.attrsChanges;\r\n    return this._attributes;\r\n  }\r\n\r\n  private _relations: ItemRelations | null = null;\r\n\r\n  /**\r\n   * Gets all the relations of the item to other items.\r\n   */\r\n  async getRelations() {\r\n    if (this._relations) return this._relations;\r\n    const localId = await this.getLocalId();\r\n    if (localId === null) return null;\r\n\r\n    const data = (await this.model.threads.invoke(\r\n      this.model.modelId,\r\n      \"getItemRelations\",\r\n      // @ts-ignore\r\n      [localId],\r\n    )) as { [name: string]: number[] } | null;\r\n    if (!data) return null;\r\n\r\n    this._relations = new ItemRelations(localId);\r\n    this._relations.onItemsRequested = async (ids) => {\r\n      const items: Item[] = [];\r\n      for (const id of ids) {\r\n        const item = this.model.getItem(id);\r\n        if (!item) continue;\r\n        items.push(item);\r\n      }\r\n      return items;\r\n    };\r\n\r\n    const changes = this.model.relsChanges.get(localId);\r\n    if (changes && changes.type === \"modified\") {\r\n      for (const [key, value] of Object.entries(changes.added))\r\n        this._relations.set(key, value);\r\n    }\r\n\r\n    for (const [relation, localIds] of Object.entries(data)) {\r\n      if (changes?.type === \"modified\" && changes.deleted.has(relation))\r\n        continue;\r\n      if (changes?.type === \"modified\" && relation in changes.modified) {\r\n        const data = new Set([...changes.modified[relation], ...localIds]);\r\n        this._relations.set(relation, new Set(data));\r\n      } else {\r\n        this._relations.set(relation, new Set(localIds));\r\n      }\r\n    }\r\n\r\n    this._relations.tracker = this.model.relsChanges;\r\n    return this._relations;\r\n  }\r\n\r\n  private _guid: string | null = null;\r\n  /**\r\n   * Gets the GUID of the item.\r\n   */\r\n  async getGuid() {\r\n    if (!this._guid) {\r\n      const localId = await this.getLocalId();\r\n      if (localId === null) return null;\r\n      [this._guid] = await this.model.threads.invoke(\r\n        this.model.modelId,\r\n        \"getGuidsByLocalIds\",\r\n        // @ts-ignore\r\n        [[localId]],\r\n      );\r\n    }\r\n    return this._guid;\r\n  }\r\n\r\n  private _category: string | null = null;\r\n  /**\r\n   * Gets the category of the item.\r\n   */\r\n  async getCategory() {\r\n    if (!this._category) {\r\n      const localId = await this.getLocalId();\r\n      if (localId === null) return null;\r\n      this._category = await this.model.threads.invoke(\r\n        this.model.modelId,\r\n        \"getItemCategory\",\r\n        // @ts-ignore\r\n        [localId],\r\n      );\r\n    }\r\n    return this._category;\r\n  }\r\n\r\n  private _geometry: ItemGeometry | null = null;\r\n  async getGeometry() {\r\n    if (this._geometry) return this._geometry;\r\n    const localId = await this.getLocalId();\r\n    if (localId === null) return null;\r\n    const geometry = new ItemGeometry(this.model, localId);\r\n    return geometry;\r\n  }\r\n\r\n  /**\r\n   * Gets all the data of the item.\r\n   */\r\n  async getData(collector: number[] = []) {\r\n    const localId = await this.getLocalId();\r\n    if (localId == null) return {};\r\n    collector.push(localId);\r\n    const attrs = (await this.getAttributes())?.object;\r\n    const rels = await this.getRelations();\r\n    const relAttrs: Record<string, any> = {};\r\n    if (rels) {\r\n      for (const key of rels.keys()) {\r\n        const keyItems: any = [];\r\n        relAttrs[key] = keyItems;\r\n        const relItems = await rels.getItems(key);\r\n        if (!relItems) continue;\r\n        for (const item of relItems) {\r\n          const itemId = await item.getLocalId();\r\n          if (!itemId) continue;\r\n          if (collector.find((id) => id === itemId) !== undefined) {\r\n            continue;\r\n          }\r\n          collector.push(itemId);\r\n          // const itemAttrs = (await item.getAttributes())?.object;\r\n          const itemAttrs = await item.getData(collector);\r\n          if (!itemAttrs) continue;\r\n          keyItems.push(itemAttrs);\r\n        }\r\n        // if (key === \"HasProperties\") console.log(keyItems);\r\n      }\r\n    }\r\n    const data = { ...attrs, ...relAttrs };\r\n    return data;\r\n  }\r\n}\r\n","import { ItemData, ItemsDataConfig, Identifier } from \"./model-types\";\r\nimport { FragmentsModel } from \"./fragments-model\";\r\nimport { Item } from \"./item\";\r\n\r\nexport class ItemsManager {\r\n  getItem(model: FragmentsModel, id: Identifier) {\r\n    return new Item(model, id);\r\n  }\r\n\r\n  async getItemsData(\r\n    model: FragmentsModel,\r\n    ids: Identifier[],\r\n    config?: Partial<ItemsDataConfig>,\r\n  ) {\r\n    return model.threads.invoke(model.modelId, \"getItemsData\", [\r\n      ids,\r\n      config,\r\n    ]) as Promise<ItemData[]>;\r\n  }\r\n\r\n  async getItemsChildren(model: FragmentsModel, ids: Identifier[]) {\r\n    return model.threads.invoke(model.modelId, \"getItemsChildren\", [\r\n      ids,\r\n    ]) as Promise<number[]>;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { LodMode, MultiThreadingRequestClass } from \"./model-types\";\r\nimport { FragmentsModel } from \"./fragments-model\";\r\nimport { MeshManager } from \"./mesh-manager\";\r\nimport { CameraUtils, GPU } from \"../utils\";\r\n\r\nexport class ViewManager {\r\n  getClippingPlanesEvent: () => THREE.Plane[] = () => [];\r\n\r\n  currentCamera: THREE.PerspectiveCamera | THREE.OrthographicCamera | null =\r\n    null;\r\n\r\n  private readonly _tempMatrix = new THREE.Matrix4();\r\n  private readonly _tempVec = new THREE.Vector3();\r\n  private readonly _tempFrustum = new THREE.Frustum();\r\n\r\n  private _updateCameraPositionEvent: (vector: THREE.Vector3) => void =\r\n    () => {};\r\n\r\n  private _updateCameraFrustumEvent: (frustum: THREE.Frustum) => void =\r\n    () => {};\r\n\r\n  private _updateFOVEvent: () => number | void = () => {};\r\n\r\n  private _updateOrthoSizeEvent: () => number | void = () => {};\r\n\r\n  async refreshView(model: FragmentsModel, meshes: MeshManager) {\r\n    const fov = this.setup(meshes, model);\r\n    const frustum = CameraUtils.transform(this._tempFrustum, this._tempMatrix);\r\n    const request: any = this.newViewRequest(frustum, fov, model);\r\n    await model.threads.fetch(request);\r\n  }\r\n\r\n  useCamera(camera: THREE.PerspectiveCamera | THREE.OrthographicCamera) {\r\n    const projScreenMatrix = new THREE.Matrix4();\r\n    this.setCameraPosition(camera);\r\n    this.setCameraFrustum(camera, projScreenMatrix);\r\n    this.setFov(camera);\r\n    this.setOrtho();\r\n    this.currentCamera = camera;\r\n  }\r\n\r\n  async setLodMode(model: FragmentsModel, lodMode: LodMode) {\r\n    return model.threads.invoke(model.modelId, \"setLodMode\", [\r\n      lodMode,\r\n    ]) as Promise<void>;\r\n  }\r\n\r\n  private getOrthoSize() {\r\n    let orthoSize = this._updateOrthoSizeEvent();\r\n    if (orthoSize) {\r\n      const modelScale = this._tempMatrix.getMaxScaleOnAxis();\r\n      orthoSize *= modelScale;\r\n    }\r\n    return orthoSize;\r\n  }\r\n\r\n  private setup(meshes: MeshManager, model: FragmentsModel) {\r\n    meshes.requests.clean(model.modelId);\r\n    this._tempMatrix.copy(model.object.matrixWorld).invert();\r\n    this._updateCameraPositionEvent(this._tempVec);\r\n    this._updateCameraFrustumEvent(this._tempFrustum);\r\n    const fov = this._updateFOVEvent();\r\n    return fov;\r\n  }\r\n\r\n  private newViewRequest(\r\n    frustum: THREE.Frustum,\r\n    fov: number | void,\r\n    model: FragmentsModel,\r\n  ) {\r\n    const view: any = this.newView(frustum, fov, model);\r\n    const request: any = {};\r\n    request.class = MultiThreadingRequestClass.REFRESH_VIEW;\r\n    request.modelId = model.modelId;\r\n    request.cameraFrustum = frustum;\r\n    request.view = view;\r\n    return request;\r\n  }\r\n\r\n  private newView(\r\n    frustum: THREE.Frustum,\r\n    fov: number | void,\r\n    model: FragmentsModel,\r\n  ) {\r\n    const view: any = {};\r\n    view.cameraFrustum = frustum;\r\n    view.cameraPosition = this._tempVec.applyMatrix4(this._tempMatrix);\r\n    view.fov = fov;\r\n    view.orthogonalDimension = this.getOrthoSize();\r\n    view.viewSize = Math.max(window.innerWidth, window.innerHeight);\r\n    view.graphicThreshold = GPU.estimateCapacity();\r\n    view.graphicQuality = model.graphicsQuality * -1.5 + 2;\r\n    view.clippingPlanes = this.getPlanes();\r\n    view.modelPlacement = model.object.matrixWorld;\r\n    return view;\r\n  }\r\n\r\n  private setOrtho() {\r\n    // TODO: return ortho size in meters of biggest camera dimension (width or height)\r\n    this._updateOrthoSizeEvent = () => {\r\n      return undefined;\r\n    };\r\n  }\r\n\r\n  private setFov(camera: THREE.PerspectiveCamera | THREE.OrthographicCamera) {\r\n    this._updateFOVEvent = () => {\r\n      if (camera instanceof THREE.PerspectiveCamera) {\r\n        return camera.fov;\r\n      }\r\n      return undefined;\r\n    };\r\n  }\r\n\r\n  private getPlanes() {\r\n    const planes: THREE.Plane[] = [];\r\n    const originalPlanes = this.getClippingPlanesEvent();\r\n    for (const plane of originalPlanes) {\r\n      const cloned = plane.clone();\r\n      cloned.applyMatrix4(this._tempMatrix);\r\n      planes.push(cloned);\r\n    }\r\n    return planes;\r\n  }\r\n\r\n  private setCameraPosition(\r\n    camera: THREE.PerspectiveCamera | THREE.OrthographicCamera,\r\n  ) {\r\n    this._updateCameraPositionEvent = (position: THREE.Vector3) => {\r\n      position.copy(camera.position);\r\n    };\r\n  }\r\n\r\n  private setCameraFrustum(\r\n    camera: THREE.PerspectiveCamera | THREE.OrthographicCamera,\r\n    projScreenMatrix: THREE.Matrix4,\r\n  ) {\r\n    this._updateCameraFrustumEvent = (frustum: THREE.Frustum) => {\r\n      camera.updateProjectionMatrix();\r\n      camera.updateWorldMatrix(true, true);\r\n      const { projectionMatrix, matrixWorldInverse } = camera;\r\n      projScreenMatrix.multiplyMatrices(projectionMatrix, matrixWorldInverse);\r\n      frustum.setFromProjectionMatrix(projScreenMatrix);\r\n    };\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport {\r\n  MultiThreadingRequestClass,\r\n  RaycastData,\r\n  RaycastResult,\r\n  RectangleRaycastData,\r\n  RectangleRaycastResult,\r\n  SnappingRaycastData,\r\n} from \"./model-types\";\r\nimport { FragmentsModel } from \"./fragments-model\";\r\nimport { MeshManager } from \"./mesh-manager\";\r\nimport { CameraUtils } from \"../utils\";\r\n\r\ninterface Point {\r\n  x: number;\r\n  y: number;\r\n}\r\n\r\nexport class RaycastManager {\r\n  private _caster = new THREE.Raycaster();\r\n  private readonly _ray = new THREE.Ray();\r\n  private readonly _frustum = new THREE.Frustum();\r\n  private readonly _inverseTransform = new THREE.Matrix4();\r\n\r\n  private readonly _t = new THREE.Plane();\r\n  private readonly _r = new THREE.Plane();\r\n  private readonly _b = new THREE.Plane();\r\n  private readonly _l = new THREE.Plane();\r\n  private readonly _n = new THREE.Plane();\r\n  private readonly _f = new THREE.Plane();\r\n\r\n  private readonly _tl = new THREE.Vector3();\r\n  private readonly _tr = new THREE.Vector3();\r\n  private readonly _bl = new THREE.Vector3();\r\n  private readonly _br = new THREE.Vector3();\r\n  private readonly _tln = new THREE.Vector3();\r\n  private readonly _brn = new THREE.Vector3();\r\n  private readonly _tlp = new THREE.Vector2();\r\n  private readonly _brp = new THREE.Vector2();\r\n\r\n  private readonly distance = 10;\r\n\r\n  async raycast(model: FragmentsModel, data: RaycastData) {\r\n    const { frustum, ray } = this.getRayAndFrustum(data);\r\n    const request = this.getRequest(model, frustum, ray);\r\n    if (!request) return null;\r\n    const response = await model.threads.fetch(request);\r\n    if (response.results && response.results.length) {\r\n      const [firstHit] = response.results;\r\n      return this.getResult({\r\n        hit: firstHit,\r\n        frustum,\r\n        ray,\r\n        model,\r\n      });\r\n    }\r\n    return null;\r\n  }\r\n\r\n  async raycastAll(model: FragmentsModel, data: RaycastData) {\r\n    const { frustum, ray } = this.getRayAndFrustum(data);\r\n    const request = this.getRequest(model, frustum, ray);\r\n    if (!request) return null;\r\n    request.returnAll = true;\r\n    const allResults: RaycastResult[] = [];\r\n    const response = await model.threads.fetch(request);\r\n    if (response.results && response.results.length) {\r\n      for (const hit of response.results) {\r\n        allResults.push(\r\n          this.getResult({\r\n            hit,\r\n            frustum,\r\n            ray,\r\n            model,\r\n          }),\r\n        );\r\n      }\r\n      return allResults;\r\n    }\r\n    return null;\r\n  }\r\n\r\n  async rectangleRaycast(\r\n    model: FragmentsModel,\r\n    meshes: MeshManager,\r\n    data: RectangleRaycastData,\r\n  ) {\r\n    const frustum = this.getFrustum(data);\r\n    const request = this.getRequest(model, frustum);\r\n    if (!request) return null;\r\n    request.fullyIncluded = data.fullyIncluded;\r\n    const response = await model.threads.fetch(request);\r\n    if (response.localIds && response.localIds.length) {\r\n      return this.newRectangleCastResponse(response, meshes);\r\n    }\r\n    return null;\r\n  }\r\n\r\n  async raycastWithSnapping(model: FragmentsModel, data: SnappingRaycastData) {\r\n    const { frustum, ray } = this.getRayAndFrustum(data);\r\n    const request = this.getRequest(model, frustum, ray);\r\n    if (!request) return null;\r\n    request.snappingClass = data.snappingClasses;\r\n    const response = await model.threads.fetch(request);\r\n    if (response.results) {\r\n      return this.newRaycastSnapResult(response, frustum, ray, model);\r\n    }\r\n    return null;\r\n  }\r\n\r\n  private screenRectToFrustum(\r\n    screenTopLeft: THREE.Vector2,\r\n    screenBottomRight: THREE.Vector2,\r\n    container: HTMLElement,\r\n    camera: THREE.Camera,\r\n  ) {\r\n    this.screenToCast(screenTopLeft, container, this._tlp);\r\n    this.screenToCast(screenBottomRight, container, this._brp);\r\n    this.setVectors(camera);\r\n    this.setPlanes(camera);\r\n    return this.newFrustum();\r\n  }\r\n\r\n  private screenToCasterPoint(point: Point, viewer: any, camera: THREE.Camera) {\r\n    const casterPoint = this.screenToCast(point, viewer);\r\n    this._caster.setFromCamera(casterPoint, camera);\r\n    return this._caster.ray.clone();\r\n  }\r\n\r\n  private setPlanes(camera: THREE.Camera) {\r\n    this.setBasePoints();\r\n    camera.getWorldDirection(this._n.normal);\r\n    this.setEnds(camera);\r\n  }\r\n\r\n  private setVectors(camera: THREE.Camera) {\r\n    this.setVector(this._tl, this._tlp, this._tlp, 1, camera);\r\n    this.setVector(this._tr, this._brp, this._tlp, 1, camera);\r\n    this.setVector(this._bl, this._tlp, this._brp, 1, camera);\r\n    this.setVector(this._br, this._brp, this._brp, 1, camera);\r\n    this.setVector(this._tln, this._tlp, this._tlp, 0, camera);\r\n    this.setVector(this._brn, this._brp, this._brp, 0, camera);\r\n  }\r\n\r\n  private newFrustum() {\r\n    return new THREE.Frustum(\r\n      this._t,\r\n      this._b,\r\n      this._l,\r\n      this._r,\r\n      this._f,\r\n      this._n,\r\n    );\r\n  }\r\n\r\n  private setEnds(camera: THREE.Camera) {\r\n    if (camera instanceof THREE.OrthographicCamera) {\r\n      const camPos = camera.position;\r\n      const normalDotPos = this._n.normal.dot(camPos);\r\n      this._n.constant = -(normalDotPos + camera.near);\r\n      this._f.constant = -(normalDotPos - camera.far);\r\n    } else {\r\n      this._n.constant = camera.position.length();\r\n      this._f.constant = Infinity;\r\n    }\r\n    this._f.normal = this._n.normal;\r\n  }\r\n\r\n  private screenToCast(p: Point, element: any, result = new THREE.Vector2()) {\r\n    // src: https://stackoverflow.com/a/69971471\r\n    const rect = element.getBoundingClientRect();\r\n    // Calculate scale factors\r\n    const scaleX = rect.width / element.clientWidth;\r\n    const scaleY = rect.height / element.clientHeight;\r\n    // Adjust mouse coordinates for scale\r\n    const x = (p.x - rect.left) / scaleX;\r\n    const y = (p.y - rect.top) / scaleY;\r\n    result.x = (x / element.clientWidth) * 2 - 1;\r\n    result.y = -(y / element.clientHeight) * 2 + 1;\r\n    return result;\r\n  }\r\n\r\n  private setVector(\r\n    v1: THREE.Vector3,\r\n    v2: THREE.Vector2,\r\n    v3: THREE.Vector2,\r\n    value: number,\r\n    camera: THREE.Camera,\r\n  ) {\r\n    v1.set(v2.x, v3.y, value);\r\n    v1.unproject(camera);\r\n  }\r\n\r\n  private setPlane(\r\n    plane: THREE.Plane,\r\n    v1: THREE.Vector3,\r\n    v2: THREE.Vector3,\r\n    v3: THREE.Vector3,\r\n  ) {\r\n    plane.setFromCoplanarPoints(v1, v2, v3);\r\n  }\r\n\r\n  private setBasePoints() {\r\n    this.setPlane(this._t, this._tln, this._tl, this._tr);\r\n    this.setPlane(this._r, this._brn, this._tr, this._br);\r\n    this.setPlane(this._b, this._brn, this._br, this._bl);\r\n    this.setPlane(this._l, this._tln, this._bl, this._tl);\r\n  }\r\n\r\n  private setupRay(ray: THREE.Ray | undefined, message: any) {\r\n    if (ray) {\r\n      this._ray.copy(ray);\r\n      this._ray.applyMatrix4(this._inverseTransform);\r\n      (message as any).ray = this._ray;\r\n    }\r\n  }\r\n\r\n  private setupMatrix(object: THREE.Object3D) {\r\n    this._inverseTransform.copy(object.matrixWorld);\r\n    this._inverseTransform.invert();\r\n  }\r\n\r\n  private getRequest(\r\n    model: FragmentsModel,\r\n    frustum: THREE.Frustum,\r\n    ray?: THREE.Ray,\r\n  ) {\r\n    const { object, box, modelId } = model;\r\n    const collidesModel = frustum.intersectsBox(box);\r\n    if (collidesModel) {\r\n      return this.newCastRequest(object, modelId, ray, frustum);\r\n    }\r\n    return null;\r\n  }\r\n\r\n  private getRayAndFrustum(data: RaycastData) {\r\n    this.updateCamera(data.camera);\r\n    const { bottomLeft, topRight } = this.getCorners(data.mouse);\r\n    const ray = this.screenToCasterPoint(data.mouse, data.dom, data.camera);\r\n    const frustum = this.screenRectToFrustum(\r\n      bottomLeft,\r\n      topRight,\r\n      data.dom,\r\n      data.camera,\r\n    );\r\n    return { ray, frustum };\r\n  }\r\n\r\n  private getFrustum(data: {\r\n    camera: THREE.PerspectiveCamera | THREE.OrthographicCamera;\r\n    dom: HTMLCanvasElement;\r\n    topLeft: THREE.Vector2;\r\n    bottomRight: THREE.Vector2;\r\n  }) {\r\n    this.updateCamera(data.camera);\r\n    return this.screenRectToFrustum(\r\n      data.topLeft,\r\n      data.bottomRight,\r\n      data.dom,\r\n      data.camera,\r\n    );\r\n  }\r\n\r\n  private getCorners(mouse: THREE.Vector2) {\r\n    const bottomLeft = mouse.clone().subScalar(this.distance);\r\n    const topRight = mouse.clone().addScalar(this.distance);\r\n    return { bottomLeft, topRight };\r\n  }\r\n\r\n  private getResult(data: {\r\n    hit: any;\r\n    frustum: THREE.Frustum;\r\n    model: FragmentsModel;\r\n    ray?: THREE.Ray;\r\n  }) {\r\n    const { hit, frustum, ray, model } = data;\r\n    const result: Partial<RaycastResult> = {};\r\n    this.setPoint(model, hit, result);\r\n    this.setNormal(model, hit, result);\r\n    this.setDistance(model, hit, result);\r\n    this.setRayDistance(model, hit, result);\r\n    this.setBasicHitData(model, hit, result, ray, frustum);\r\n    this.setSnapEdge(model, hit, result, \"snappedEdgeP1\");\r\n    this.setSnapEdge(model, hit, result, \"snappedEdgeP2\");\r\n    result.facePoints = hit.facePoints;\r\n    result.faceIndices = hit.faceIndices;\r\n    return result as RaycastResult;\r\n  }\r\n\r\n  private updateCamera(\r\n    camera: THREE.PerspectiveCamera | THREE.OrthographicCamera,\r\n  ) {\r\n    camera.updateProjectionMatrix();\r\n    camera.updateWorldMatrix(true, true);\r\n  }\r\n\r\n  private newCastRequest(\r\n    object: THREE.Object3D,\r\n    modelId: string,\r\n    ray: THREE.Ray | undefined,\r\n    frustum: THREE.Frustum,\r\n  ) {\r\n    this.setupMatrix(object);\r\n    const request: any = {};\r\n    request.class = MultiThreadingRequestClass.RAYCAST;\r\n    request.modelId = modelId;\r\n    this.setupRay(ray, request);\r\n    CameraUtils.transform(frustum, this._inverseTransform, this._frustum);\r\n    request.frustum = this._frustum;\r\n    return request;\r\n  }\r\n\r\n  private setSnapEdge(\r\n    model: FragmentsModel,\r\n    hit: any,\r\n    result: Partial<RaycastResult>,\r\n    key: \"snappedEdgeP1\" | \"snappedEdgeP2\",\r\n  ) {\r\n    if (hit[key]) {\r\n      const edge = new THREE.Vector3();\r\n      edge.copy(hit[key]);\r\n      edge.applyMatrix4(model.object.matrixWorld);\r\n      result[key] = edge;\r\n    } else {\r\n      result[key] = undefined;\r\n    }\r\n  }\r\n\r\n  private setNormal(\r\n    model: FragmentsModel,\r\n    hit: any,\r\n    result: Partial<RaycastResult>,\r\n  ) {\r\n    if (hit.normal) {\r\n      const normal = new THREE.Vector3();\r\n      normal.copy(hit.normal);\r\n      normal.transformDirection(model.object.matrixWorld);\r\n      normal.normalize();\r\n      result.normal = normal;\r\n      return;\r\n    }\r\n    result.normal = undefined;\r\n  }\r\n\r\n  private setDistance(\r\n    model: FragmentsModel,\r\n    hit: any,\r\n    result: Partial<RaycastResult>,\r\n  ) {\r\n    const cameraDist = Math.sqrt(hit.cameraSquaredDistance);\r\n    const modelScale = model.object.matrixWorld.getMaxScaleOnAxis();\r\n    result.distance = cameraDist * modelScale;\r\n  }\r\n\r\n  private setPoint(\r\n    model: FragmentsModel,\r\n    hit: any,\r\n    result: Partial<RaycastResult>,\r\n  ) {\r\n    const point = new THREE.Vector3();\r\n    point.copy(hit.point);\r\n    point.applyMatrix4(model.object.matrixWorld);\r\n    result.point = point;\r\n  }\r\n\r\n  private newRaycastSnapResult(\r\n    response: any,\r\n    frustum: THREE.Frustum,\r\n    ray: THREE.Ray,\r\n    model: FragmentsModel,\r\n  ) {\r\n    const results: RaycastResult[] = [];\r\n    for (const hit of response.results) {\r\n      const result = this.getResult({ hit, frustum, ray, model });\r\n      results.push(result);\r\n    }\r\n    return results;\r\n  }\r\n\r\n  private newRectangleCastResponse(response: any, meshes: MeshManager) {\r\n    const result: RectangleRaycastResult = {\r\n      localIds: response.localIds,\r\n      fragments: meshes.list.get(response.modelId)!,\r\n    };\r\n    return result;\r\n  }\r\n\r\n  private setRayDistance(\r\n    model: FragmentsModel,\r\n    hit: any,\r\n    result: Partial<RaycastResult>,\r\n  ) {\r\n    if (hit.raySquaredDistance !== undefined) {\r\n      const modelScale = model.object.matrixWorld.getMaxScaleOnAxis();\r\n      const rayDist = Math.sqrt(hit.raySquaredDistance);\r\n      result.rayDistance = rayDist * modelScale;\r\n      return;\r\n    }\r\n    result.rayDistance = undefined;\r\n  }\r\n\r\n  private setBasicHitData(\r\n    model: FragmentsModel,\r\n    hit: any,\r\n    result: Partial<RaycastResult>,\r\n    ray: THREE.Ray | undefined,\r\n    frustum: THREE.Frustum,\r\n  ) {\r\n    result.itemId = hit.itemId;\r\n    result.localId = hit.localId;\r\n    result.object = model.object;\r\n    result.fragments = model;\r\n    result.ray = ray;\r\n    result.frustum = frustum;\r\n    result.representationClass = hit.representationClass;\r\n    result.snappingClass = hit.snappingClass;\r\n  }\r\n}\r\n","import { FragmentsModel } from \"./fragments-model\";\r\n\r\nexport class VisibilityManager {\r\n  async resetVisible(model: FragmentsModel) {\r\n    await model.threads.invoke(model.modelId, \"resetVisible\");\r\n  }\r\n\r\n  async getItemsByVisibility(model: FragmentsModel, visible: boolean) {\r\n    return model.threads.invoke(model.modelId, \"getItemsByVisibility\", [\r\n      visible,\r\n    ]) as Promise<number[]>;\r\n  }\r\n\r\n  async getVisible(model: FragmentsModel, localIds: number[]) {\r\n    return model.threads.invoke(model.modelId, \"getVisible\", [\r\n      localIds,\r\n    ]) as Promise<boolean[]>;\r\n  }\r\n}\r\n","export class LodShaders {\r\n  static vertex = `\r\n            #include <common>\r\n            #include <clipping_planes_pars_vertex>\r\n\r\n            attribute float itemFilter;\r\n            uniform vec2 lodSize;\r\n            attribute vec3 itemFirst;\r\n            attribute vec3 itemLast;\r\n\r\n            float lodWidth = 2.0;\r\n            \r\n            void cutLodLine(const in vec4 first, inout vec4 second ) {\r\n                float projValue1 = projectionMatrix[2][2];\r\n                float projValue2 = projectionMatrix[3][2];\r\n                float approxResult = -(projValue2 / projValue1) / 2.0;\r\n                float diff1 = approxResult - first.z;\r\n                float diff2 = second.z - first.z;\r\n                float cutFilter = diff1 / diff2;\r\n                second.xyz = mix(first.xyz, second.xyz, cutFilter);\r\n            }\r\n                \r\n            varying float vHighlight;\r\n\r\n            void main() {\r\n                if (itemFilter == 0.0) {\r\n                    gl_Position = vec4(0,0,0,0);\r\n                    return;\r\n                }\r\n\r\n                vHighlight = itemFilter > 1.5 ? 1.0 : 0.0;\r\n\r\n                vec4 rawFirst = vec4(itemFirst, 1.0);\r\n                vec4 rawLast = vec4(itemLast, 1.0);\r\n                vec4 first = modelViewMatrix * rawFirst;\r\n                vec4 last = modelViewMatrix * rawLast;\r\n                \r\n                bool lodPerspective = projectionMatrix[2][3] == -1.0;\r\n                if (lodPerspective) {\r\n                    bool firstCut = first.z < 0.0 && last.z >= 0.0;\r\n                    bool lastCut = last.z < 0.0 && first.z >= 0.0;\r\n                    if (firstCut) {\r\n                        cutLodLine( first, last );\r\n                    } else if (lastCut) {\r\n                        cutLodLine( last, first );\r\n                    }\r\n                }\r\n\r\n                vec4 firstCut = projectionMatrix * first;\r\n                vec4 lastCut = projectionMatrix * last;\r\n                vec3 firstNdc = firstCut.xyz / firstCut.w;\r\n                vec3 lastNdc = lastCut.xyz / lastCut.w;\r\n\r\n                vec2 lodOrientation = lastNdc.xy - firstNdc.xy;\r\n\r\n                float lodRatio = lodSize.x / lodSize.y;\r\n                lodOrientation.x *= lodRatio;\r\n                lodOrientation = normalize(lodOrientation);\r\n                \r\n                vec2 lodDistance = vec2(lodOrientation.y, - lodOrientation.x);\r\n                lodOrientation.x /= lodRatio;\r\n                lodDistance.x /= lodRatio;\r\n\r\n                if (position.x < 0.0) { \r\n                    lodDistance *= - 1.0;\r\n                }\r\n\r\n                if (position.y < 0.0) {\r\n                    lodDistance += -lodOrientation;\r\n                } else if (position.y > 1.0) {\r\n                    lodDistance += lodOrientation;\r\n                }\r\n\r\n                lodDistance *= lodWidth;\r\n                lodDistance /= lodSize.y;\r\n\r\n                bool isFirst = position.y < 0.5;\r\n                vec4 lodPosition = isFirst ? firstCut : lastCut;\r\n                lodDistance *= lodPosition.w;\r\n                lodPosition.xy += lodDistance;\r\n                gl_Position = lodPosition;\r\n\r\n                vec4 mvPosition = isFirst ? first : last;\r\n                #include <clipping_planes_vertex>\r\n            }\r\n    `;\r\n\r\n  static fragment = `\r\n            #include <common>\r\n            #include <clipping_planes_pars_fragment>\r\n\r\n            uniform vec3 lodColor;\r\n            uniform float lodOpacity;\r\n            uniform vec3 highlightColor;\r\n            uniform float highlightOpacity;\r\n\r\n            varying float vHighlight;\r\n\r\n            void main() {\r\n                #include <clipping_planes_fragment>\r\n                vec3 color = mix(lodColor, highlightColor, vHighlight);\r\n                float alpha = mix(lodOpacity, highlightOpacity, vHighlight);\r\n                gl_FragColor = vec4(color, alpha);\r\n                #include <colorspace_fragment>\r\n            }\r\n    `;\r\n}\r\n","import * as THREE from \"three\";\r\nimport { LineMaterialParameters } from \"three/examples/jsm/Addons.js\";\r\nimport { LODGeometry } from \"./lod-geometry\";\r\nimport { LodShaders } from \"./lod-shaders\";\r\nimport { LODMesh } from \"./lod-mesh\";\r\n\r\nexport class LodHelper {\r\n  static tempVec = new THREE.Vector3();\r\n  static tempBox = new THREE.Box3();\r\n\r\n  static setupLodMeshResize(mesh: LODMesh) {\r\n    mesh.onBeforeRender = (renderer) => {\r\n      renderer.getSize(mesh.material[0].lodSize);\r\n    };\r\n  }\r\n\r\n  static setupLodAttributes(geometry: THREE.InstancedBufferGeometry): void {\r\n    geometry.setIndex(LodHelper.indices);\r\n    geometry.setAttribute(\"position\", LodHelper.vertices);\r\n  }\r\n\r\n  static setLodBuffer(\r\n    lodGeometry: LODGeometry,\r\n    data: Float32Array,\r\n    onFinish?: () => void,\r\n  ) {\r\n    let itemFirst = lodGeometry.getItemFirst();\r\n    let itemLast = lodGeometry.getItemLast();\r\n    let dataBuffer = this.setItemFirst(lodGeometry, itemFirst, data, itemLast);\r\n    const result = this.resetAttributes(itemFirst, dataBuffer, data, itemLast);\r\n    ({ itemFirst, dataBuffer, itemLast } = result);\r\n    this.setupFinish(onFinish, dataBuffer);\r\n    lodGeometry.setAttribute(\"itemFirst\", itemFirst);\r\n    lodGeometry.setAttribute(\"itemLast\", itemLast);\r\n  }\r\n\r\n  static setLodVisibility(lodGeometry: LODGeometry, visible: any): void {\r\n    const itemFilter = this.setupItemFilter(lodGeometry);\r\n    this.applyVisibilityState(lodGeometry, visible, itemFilter);\r\n    itemFilter.needsUpdate = true;\r\n  }\r\n\r\n  static getInterAttribute(\r\n    geometry: THREE.InstancedBufferGeometry,\r\n    name: string,\r\n  ) {\r\n    return geometry.getAttribute(name) as THREE.InterleavedBufferAttribute;\r\n  }\r\n\r\n  static computeLodSphere(geometry: LODGeometry) {\r\n    if (!geometry.boundingSphere) {\r\n      return;\r\n    }\r\n    const itemFirst = geometry.getItemFirst();\r\n    if (itemFirst) {\r\n      const midPoint = LodHelper.getLodMidPoint(geometry, itemFirst);\r\n      const radius = LodHelper.getLodRadius(midPoint, itemFirst);\r\n      geometry.boundingSphere.radius = radius;\r\n    }\r\n  }\r\n\r\n  static newLodMaterialParams(parameters: LineMaterialParameters) {\r\n    const customUniforms = {\r\n      lodColor: { value: new THREE.Color(parameters.color) },\r\n      lodSize: { value: new THREE.Vector2(1, 1) },\r\n      lodOpacity: { value: parameters.opacity ?? 1 },\r\n      highlightColor: { value: new THREE.Color(1, 1, 1) },\r\n      highlightOpacity: { value: 1 },\r\n    };\r\n\r\n    const uniforms = THREE.UniformsUtils.merge([\r\n      THREE.UniformsLib.common,\r\n      customUniforms,\r\n    ]);\r\n    const transparent = parameters.transparent ?? false;\r\n\r\n    return {\r\n      uniforms,\r\n      transparent,\r\n      vertexShader: LodShaders.vertex,\r\n      fragmentShader: LodShaders.fragment,\r\n    };\r\n  }\r\n\r\n  static setLodFilter(geometry: LODGeometry, data: any): void {\r\n    const itemFilter = geometry.getItemFilter();\r\n    const bufferData = itemFilter.array as Uint8Array;\r\n\r\n    for (let i = 0; i < data.position.length; ++i) {\r\n      const first = data.position[i] / 2;\r\n      const size = data.size[i] / 2;\r\n      if (size === 0xffffffff) {\r\n        bufferData.fill(1, first);\r\n      } else {\r\n        bufferData.fill(1, first, first + size);\r\n      }\r\n    }\r\n    itemFilter.needsUpdate = true;\r\n  }\r\n\r\n  static setLodHighlight(geometry: LODGeometry, data: any): void {\r\n    const itemFilter = geometry.getItemFilter();\r\n    const bufferData = itemFilter.array as Uint8Array;\r\n\r\n    for (let i = 0; i < data.position.length; ++i) {\r\n      const first = data.position[i] / 2;\r\n      const size = data.size[i] / 2;\r\n      if (size === 0xffffffff) {\r\n        bufferData.fill(2, first);\r\n      } else {\r\n        bufferData.fill(2, first, first + size);\r\n      }\r\n    }\r\n    itemFilter.needsUpdate = true;\r\n  }\r\n\r\n  static getInstancedAttribute(\r\n    geometry: THREE.InstancedBufferGeometry,\r\n    name: string,\r\n  ) {\r\n    return geometry.getAttribute(name) as THREE.InstancedBufferAttribute;\r\n  }\r\n\r\n  static computeLodBox(geometry: LODGeometry) {\r\n    if (!geometry.boundingBox) {\r\n      return;\r\n    }\r\n    const position = geometry.getItemFirst();\r\n    if (position) {\r\n      const buffer = position.data.array;\r\n      geometry.boundingBox.setFromArray(buffer);\r\n      return;\r\n    }\r\n    geometry.boundingBox.makeEmpty();\r\n  }\r\n\r\n  private static setDataBuffer(\r\n    dataBuffer: THREE.InstancedInterleavedBuffer | null,\r\n    itemFirst: THREE.InterleavedBufferAttribute,\r\n    data: Float32Array,\r\n  ) {\r\n    dataBuffer = itemFirst.data as THREE.InstancedInterleavedBuffer;\r\n    dataBuffer.array = data;\r\n    dataBuffer.needsUpdate = true;\r\n    return dataBuffer;\r\n  }\r\n\r\n  private static disposeAllData(geometry: THREE.InstancedBufferGeometry) {\r\n    delete geometry.attributes.itemFilter;\r\n    delete geometry.attributes.position;\r\n    geometry.index = null;\r\n    geometry.dispose();\r\n    LodHelper.setupLodAttributes(geometry);\r\n  }\r\n\r\n  private static setItemFirst(\r\n    lodGeometry: LODGeometry,\r\n    itemFirst: THREE.InterleavedBufferAttribute,\r\n    data: Float32Array,\r\n    itemLast: THREE.InterleavedBufferAttribute,\r\n  ) {\r\n    let dataBuffer: THREE.InstancedInterleavedBuffer | null = null;\r\n    if (itemFirst) {\r\n      const sizeMatch = data.length === itemFirst.data.array.length;\r\n      if (sizeMatch) {\r\n        dataBuffer = this.setDataBuffer(dataBuffer, itemFirst, data);\r\n      } else {\r\n        (itemFirst as any) = undefined;\r\n        (itemLast as any) = undefined;\r\n        this.disposeAllData(lodGeometry);\r\n      }\r\n    }\r\n    return dataBuffer;\r\n  }\r\n\r\n  private static setupFinish(\r\n    onFinish: (() => void) | undefined,\r\n    dataBuffer: THREE.InstancedInterleavedBuffer | null,\r\n  ) {\r\n    if (onFinish) {\r\n      // @ts-ignore\r\n      dataBuffer.onUploadCallback = onFinish;\r\n    }\r\n  }\r\n\r\n  private static resetAttributes(\r\n    itemFirst: THREE.InterleavedBufferAttribute,\r\n    dataBuffer: THREE.InstancedInterleavedBuffer | null,\r\n    data: Float32Array,\r\n    itemLast: THREE.InterleavedBufferAttribute,\r\n  ) {\r\n    if (!itemFirst) {\r\n      dataBuffer = new THREE.InstancedInterleavedBuffer(data, 6, 1);\r\n      itemFirst = new THREE.InterleavedBufferAttribute(dataBuffer, 3, 0);\r\n      itemLast = new THREE.InterleavedBufferAttribute(dataBuffer, 3, 3);\r\n    }\r\n    return { itemFirst, dataBuffer, itemLast };\r\n  }\r\n\r\n  private static setupItemFilter(lodGeometry: LODGeometry) {\r\n    const itemFirst = lodGeometry.getItemFirst();\r\n    const size = itemFirst.count;\r\n\r\n    let itemFilter = lodGeometry.getItemFilter();\r\n    if (itemFilter) {\r\n      itemFilter.array.fill(0);\r\n    } else {\r\n      itemFilter = new THREE.InstancedBufferAttribute(new Uint8Array(size), 1);\r\n      lodGeometry.setAttribute(\"itemFilter\", itemFilter);\r\n    }\r\n    return itemFilter;\r\n  }\r\n\r\n  private static applyVisibilityState(\r\n    lodGeometry: LODGeometry,\r\n    visible: any,\r\n    itemFilter: THREE.InstancedBufferAttribute,\r\n  ) {\r\n    if (visible === true) {\r\n      itemFilter.array.fill(1);\r\n      return;\r\n    }\r\n\r\n    if (visible) {\r\n      this.setLodFilter(lodGeometry, visible as any);\r\n    }\r\n  }\r\n\r\n  private static getLodMidPoint(\r\n    geometry: LODGeometry,\r\n    itemFirst: THREE.InterleavedBufferAttribute,\r\n  ) {\r\n    const midpoint = geometry.boundingSphere!.center;\r\n    this.tempBox.setFromArray(itemFirst.data.array);\r\n    this.tempBox.getCenter(midpoint);\r\n    return midpoint;\r\n  }\r\n\r\n  private static getLodRadius(\r\n    midPoint: THREE.Vector3,\r\n    itemFirst: THREE.InterleavedBufferAttribute,\r\n  ) {\r\n    let threshold = 0;\r\n    const size = itemFirst.data.array.length;\r\n    for (let i = 0; i < size; i += 3) {\r\n      const dataBuffer = itemFirst.data.array;\r\n      LodHelper.tempVec.fromArray(dataBuffer, i);\r\n      const distance = midPoint.distanceToSquared(LodHelper.tempVec);\r\n      threshold = Math.max(threshold, distance);\r\n    }\r\n    return Math.sqrt(threshold);\r\n  }\r\n\r\n  // prettier-ignore\r\n  private static vertices = new THREE.Float32BufferAttribute(\r\n    [\r\n      -1, 2, 0, \r\n       1, 2, 0, \r\n      -1, 1, 0, \r\n       1, 1, 0, \r\n      -1, 0, 0, \r\n       1, 0, 0, \r\n      -1,-1, 0, \r\n       1,-1, 0,\r\n    ],\r\n    3,\r\n  );\r\n\r\n  // prettier-ignore\r\n  private static indices = new THREE.Uint8BufferAttribute(\r\n    [\r\n      0, 2, 1, \r\n      2, 3, 1, \r\n      2, 4, 3, \r\n      4, 5, 3, \r\n      4, 6, 5, \r\n      6, 7, 5\r\n    ],\r\n    1,\r\n  );\r\n}\r\n","import * as THREE from \"three\";\r\nimport { LodMaterial } from \"./lod-material\";\r\nimport { LODGeometry } from \"./lod-geometry\";\r\nimport { LodHelper } from \"./lod-helper\";\r\n\r\nexport class LODMesh extends THREE.Mesh {\r\n  geometry: LODGeometry;\r\n  material: LodMaterial[];\r\n\r\n  constructor(geometry: LODGeometry, material: LodMaterial[]) {\r\n    super(geometry, material);\r\n    this.geometry = geometry;\r\n    this.material = material;\r\n    LodHelper.setupLodMeshResize(this);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { LodHelper } from \"./lod-helper\";\r\n\r\nexport class LODGeometry extends THREE.InstancedBufferGeometry {\r\n  isLODGeometry = true;\r\n\r\n  isFiltered(): boolean {\r\n    const filter = this.getItemFilter();\r\n    return Boolean(filter);\r\n  }\r\n\r\n  constructor() {\r\n    super();\r\n    LodHelper.setupLodAttributes(this);\r\n  }\r\n\r\n  override computeBoundingBox() {\r\n    if (!this.boundingBox) {\r\n      this.boundingBox = new THREE.Box3();\r\n    }\r\n    LodHelper.computeLodBox(this);\r\n  }\r\n\r\n  override applyMatrix4(matrix: THREE.Matrix4) {\r\n    this.applyTransformToBuffers(matrix);\r\n    this.updateBounds();\r\n    return this;\r\n  }\r\n\r\n  override computeBoundingSphere() {\r\n    if (!this.boundingSphere) {\r\n      this.boundingSphere = new THREE.Sphere();\r\n    }\r\n    LodHelper.computeLodSphere(this);\r\n  }\r\n\r\n  getItemFilter() {\r\n    return LodHelper.getInstancedAttribute(this, \"itemFilter\");\r\n  }\r\n\r\n  getItemLast() {\r\n    return LodHelper.getInterAttribute(this, \"itemLast\");\r\n  }\r\n\r\n  getItemFirst() {\r\n    return LodHelper.getInterAttribute(this, \"itemFirst\");\r\n  }\r\n\r\n  private applyTransformToBuffers(matrix: THREE.Matrix4) {\r\n    const first = this.getItemFirst();\r\n    first.applyMatrix4(matrix);\r\n    const last = this.getItemLast();\r\n    last.applyMatrix4(matrix);\r\n  }\r\n\r\n  private updateBounds() {\r\n    if (this.boundingBox) {\r\n      this.computeBoundingBox();\r\n    }\r\n    if (this.boundingSphere) {\r\n      this.computeBoundingSphere();\r\n    }\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { LineMaterialParameters } from \"three/examples/jsm/lines/LineMaterial.js\";\r\nimport { LodHelper } from \"./lod-helper\";\r\n\r\nexport class LodMaterial extends THREE.ShaderMaterial {\r\n  readonly isLodMaterial = true;\r\n  readonly isLineMaterial = true;\r\n\r\n  get lodSize(): THREE.Vector2 {\r\n    return this.uniforms.lodSize.value;\r\n  }\r\n\r\n  set lodColor(color: THREE.Color) {\r\n    this.uniforms.lodColor.value = color;\r\n  }\r\n\r\n  set lodSize(value: THREE.Vector2) {\r\n    this.uniforms.lodSize.value.copy(value);\r\n  }\r\n\r\n  get lodColor(): THREE.Color {\r\n    return this.uniforms.lodColor.value;\r\n  }\r\n\r\n  set lodOpacity(value: number) {\r\n    this.uniforms.lodOpacity.value = value;\r\n  }\r\n\r\n  get lodOpacity(): number {\r\n    return this.uniforms.lodOpacity.value;\r\n  }\r\n\r\n  set highlightColor(color: THREE.Color) {\r\n    this.uniforms.highlightColor.value = color;\r\n  }\r\n\r\n  get highlightColor(): THREE.Color {\r\n    return this.uniforms.highlightColor.value;\r\n  }\r\n\r\n  set highlightOpacity(value: number) {\r\n    this.uniforms.highlightOpacity.value = value;\r\n  }\r\n\r\n  get highlightOpacity(): number {\r\n    return this.uniforms.highlightOpacity.value;\r\n  }\r\n\r\n  constructor(parameters: LineMaterialParameters) {\r\n    super(LodHelper.newLodMaterialParams(parameters));\r\n    this.clipping = true;\r\n    this.lights = false;\r\n    this.needsUpdate = true;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { LineMaterialParameters } from \"three/examples/jsm/lines/LineMaterial.js\";\r\nimport {\r\n  ObjectClass,\r\n  MaterialDefinition,\r\n  CurrentLod,\r\n  BIMMesh,\r\n  BIMMaterial,\r\n  MaterialData,\r\n} from \"./model-types\";\r\nimport { CRC } from \"../utils\";\r\nimport { LodMaterial } from \"../lod\";\r\nimport { DataMap } from \"../../../Utils\";\r\n\r\nexport class MaterialManager {\r\n  readonly list = new DataMap<number, BIMMaterial>();\r\n\r\n  private readonly _modelMaterialMapping = new Map<string, Set<number>>();\r\n  private readonly _definitions = new Map<string, MaterialDefinition[]>();\r\n  private readonly _idGenerator = new CRC();\r\n  private readonly white = 0xffffffff;\r\n\r\n  static resetColors(definitions: MaterialDefinition[]) {\r\n    for (const definition of definitions) {\r\n      if (!(definition && definition.color)) continue;\r\n      const { color } = definition;\r\n      if (color.isColor) continue;\r\n      const { r, g, b } = color;\r\n      // IFC colors are stored in sRBG color space\r\n      definition.color = new THREE.Color().setRGB(\r\n        r,\r\n        g,\r\n        b,\r\n        THREE.SRGBColorSpace\r\n      );\r\n    }\r\n  }\r\n\r\n  dispose(modelId: string) {\r\n    this._definitions.delete(modelId);\r\n    const ids = this._modelMaterialMapping.get(modelId);\r\n    if (!ids) return;\r\n    for (const id of ids) {\r\n      const material = this.list.get(id);\r\n      if (!material) continue;\r\n      material.dispose();\r\n      this.list.delete(id);\r\n    }\r\n    this._modelMaterialMapping.delete(modelId);\r\n  }\r\n\r\n  get(data: MaterialDefinition, request: any) {\r\n    const { modelId, objectClass, currentLod, templateId } = request;\r\n    if (!(modelId && objectClass !== undefined && currentLod !== undefined)) {\r\n      throw new Error(\r\n        \"Fragments: material definition information is missing to create the material.\"\r\n      );\r\n    }\r\n\r\n    this._idGenerator.fromMaterialData({\r\n      modelId,\r\n      objectClass,\r\n      currentLod,\r\n      templateId,\r\n      ...data,\r\n    });\r\n\r\n    const { value: id } = this._idGenerator;\r\n\r\n    const material = this.getUniqueMaterial(id, data, request);\r\n    return material;\r\n  }\r\n\r\n  addDefinitions(modelID: string, materials: MaterialDefinition[]) {\r\n    const definitions = this._definitions.get(modelID);\r\n    if (definitions) {\r\n      definitions.push(...materials);\r\n    } else {\r\n      this._definitions.set(modelID, materials);\r\n    }\r\n  }\r\n\r\n  createHighlights(mesh: BIMMesh, request: any) {\r\n    const {\r\n      tileData: { highlightData, highlightIds },\r\n      modelId,\r\n      material: index,\r\n    } = request;\r\n\r\n    const { geometry } = mesh;\r\n    const materials = (mesh.material as THREE.Material[]).slice(0, 2);\r\n    const localMap = new Map<number, number>();\r\n\r\n    const materialDefinitions = this._definitions.get(modelId);\r\n    if (!materialDefinitions) return materials;\r\n\r\n    for (let i = 0; i < highlightData.position.length; i++) {\r\n      const highlightIndex = highlightIds[i];\r\n      this.processHighlight(\r\n        localMap,\r\n        highlightIndex,\r\n        materialDefinitions,\r\n        index,\r\n        request,\r\n        materials\r\n      );\r\n      const first = highlightData.position[i];\r\n      const value = highlightData.size[i];\r\n      const isWhite = value === this.white;\r\n      const size = isWhite ? Infinity : value;\r\n      geometry.addGroup(first, size, localMap.get(highlightIds[i])!);\r\n    }\r\n\r\n    return materials;\r\n  }\r\n\r\n  getHighlightProps(\r\n    highlightIndex: number,\r\n    originalIndex: number,\r\n    modelId: string,\r\n  ) {\r\n    const materialDefinitions = this._definitions.get(modelId);\r\n    if (!materialDefinitions) return undefined;\r\n    const originalDefinition = materialDefinitions[originalIndex];\r\n    const newDefinition = materialDefinitions[highlightIndex];\r\n    if (!newDefinition || !originalDefinition) return undefined;\r\n    const {\r\n      preserveOriginalMaterial,\r\n      _explicitProps,\r\n      ...highlightDefinition\r\n    } = newDefinition;\r\n    const combined: MaterialDefinition = { ...originalDefinition };\r\n    if (preserveOriginalMaterial) {\r\n      for (const prop of _explicitProps ?? []) {\r\n        if ((highlightDefinition as any)[prop] !== undefined) {\r\n          (combined as any)[prop] = (highlightDefinition as any)[prop];\r\n        }\r\n      }\r\n    } else {\r\n      Object.assign(combined, highlightDefinition);\r\n    }\r\n    return combined;\r\n  }\r\n\r\n  getFromRequest(request: any) {\r\n    const { material: index, modelId } = request;\r\n    const modelMaterials = this._definitions.get(modelId);\r\n    const definition = modelMaterials?.[index];\r\n    if (!definition) {\r\n      throw new Error(`Fragments: Missing mesh material for index ${index}`);\r\n    }\r\n    const material = this.get(definition, request);\r\n    return material;\r\n  }\r\n\r\n  private newLODMaterial(data: MaterialData, request: any) {\r\n    const { data: definition } = data;\r\n    const color = new THREE.Color(definition.color);\r\n    if (request.currentLod === CurrentLod.WIRES) {\r\n      color.multiplyScalar(0.85);\r\n    }\r\n\r\n    const parameters: LineMaterialParameters = {\r\n      color,\r\n      ...this.getParameters(definition),\r\n    };\r\n\r\n    const material = new LodMaterial(parameters);\r\n    material.userData = { customId: definition.customId };\r\n    return material;\r\n  }\r\n\r\n  private getParameters(data: MaterialDefinition) {\r\n    const { opacity, transparent } = data;\r\n    const isTranslucent = opacity < 1;\r\n    const parameters: THREE.MaterialParameters = {\r\n      opacity,\r\n      transparent: transparent || isTranslucent,\r\n      clipIntersection: false,\r\n    };\r\n    return parameters;\r\n  }\r\n\r\n  private new(data: MaterialDefinition, request: any) {\r\n    const { objectClass, templateId } = request;\r\n    let material: BIMMaterial;\r\n\r\n    if (objectClass === ObjectClass.SHELL) {\r\n      material = new THREE.MeshLambertMaterial({\r\n        color: data.color,\r\n        transparent: data.opacity < 1,\r\n        opacity: data.opacity,\r\n        userData: { customId: data.customId, localId: data.localId },\r\n        depthTest: data.depthTest ?? true,\r\n        depthWrite: data.depthWrite ?? true,\r\n        side: data.renderedFaces === 1 ? THREE.DoubleSide : THREE.FrontSide,\r\n      });\r\n    } else if (objectClass === ObjectClass.LINE) {\r\n      material = this.newLODMaterial(\r\n        { data, instancing: templateId !== undefined },\r\n        request\r\n      );\r\n    } else {\r\n      throw new Error(\"Fragments: Unsupported object class\");\r\n    }\r\n\r\n    return material;\r\n  }\r\n\r\n  private addMaterialToModel(modelId: string, id: number) {\r\n    let modelMaterials = this._modelMaterialMapping.get(modelId);\r\n    if (!modelMaterials) {\r\n      modelMaterials = new Set();\r\n      this._modelMaterialMapping.set(modelId, modelMaterials);\r\n    }\r\n    modelMaterials.add(id);\r\n  }\r\n\r\n  private processHighlight(\r\n    localMap: Map<number, number>,\r\n    highlightIndex: any,\r\n    materialDefinitions: MaterialDefinition[],\r\n    index: any,\r\n    request: any,\r\n    materials: THREE.Material[]\r\n  ) {\r\n    if (!localMap.has(highlightIndex)) {\r\n      const originalDefinition = materialDefinitions[index];\r\n      const newDefinition = materialDefinitions[highlightIndex];\r\n      const { preserveOriginalMaterial, _explicitProps, ...highlightDefinition } = newDefinition;\r\n      const combinedDefinition: MaterialDefinition = { ...originalDefinition };\r\n      if (preserveOriginalMaterial) {\r\n        for (const prop of _explicitProps ?? []) {\r\n          if ((highlightDefinition as any)[prop] !== undefined) {\r\n            (combinedDefinition as any)[prop] = (highlightDefinition as any)[prop];\r\n          }\r\n        }\r\n      } else {\r\n        Object.assign(combinedDefinition, highlightDefinition);\r\n      }\r\n      const material = this.get(combinedDefinition, request);\r\n      materials.push(material);\r\n      localMap.set(highlightIndex, materials.length - 1);\r\n    }\r\n  }\r\n\r\n  private getUniqueMaterial(\r\n    id: number,\r\n    data: MaterialDefinition,\r\n    request: any\r\n  ) {\r\n    const modelId = request.modelId;\r\n    const material = this.list.get(id);\r\n    if (material) return material;\r\n    const newMaterial = this.new(data, request);\r\n    this.list.set(id, newMaterial);\r\n    this.addMaterialToModel(modelId, id);\r\n    return this.list.get(id)!;\r\n  }\r\n}\r\n","import { MaterialDefinition } from \"./model-types\";\r\nimport { FragmentsModel } from \"./fragments-model\";\r\nimport { MaterialManager } from \"./material-manager\";\r\n\r\nexport class HighlightManager {\r\n  async getHighlight(model: FragmentsModel, localIds?: number[]) {\r\n    const materials = (await model.threads.invoke(\r\n      model.modelId,\r\n      \"getHighlight\",\r\n      [localIds],\r\n    )) as MaterialDefinition[];\r\n    MaterialManager.resetColors(materials);\r\n    return materials;\r\n  }\r\n\r\n  async highlight(\r\n    model: FragmentsModel,\r\n    localIds: number[] | undefined,\r\n    highlightMaterial: MaterialDefinition,\r\n  ) {\r\n    await model.threads.invoke(model.modelId, \"highlight\", [\r\n      localIds,\r\n      highlightMaterial,\r\n    ]);\r\n  }\r\n\r\n  async setColor(\r\n    model: FragmentsModel,\r\n    localIds: number[] | undefined,\r\n    color: MaterialDefinition[\"color\"],\r\n  ) {\r\n    await model.threads.invoke(model.modelId, \"setColor\", [localIds, color]);\r\n  }\r\n\r\n  async resetColor(model: FragmentsModel, localIds: number[] | undefined) {\r\n    await model.threads.invoke(model.modelId, \"resetColor\", [localIds]);\r\n  }\r\n\r\n  async setOpacity(\r\n    model: FragmentsModel,\r\n    localIds: number[] | undefined,\r\n    opacity: number,\r\n  ) {\r\n    await model.threads.invoke(model.modelId, \"setOpacity\", [localIds, opacity]);\r\n  }\r\n\r\n  async resetOpacity(model: FragmentsModel, localIds: number[] | undefined) {\r\n    await model.threads.invoke(model.modelId, \"resetOpacity\", [localIds]);\r\n  }\r\n\r\n  async getHighlightItemIds(model: FragmentsModel) {\r\n    return model.threads.invoke(\r\n      model.modelId,\r\n      \"getHighlightItemIds\",\r\n    ) as Promise<number[]>;\r\n  }\r\n\r\n  async resetHighlight(model: FragmentsModel, localIds?: number[]) {\r\n    await model.threads.invoke(model.modelId, \"resetHighlight\", [localIds]);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { FragmentsModel } from \"./fragments-model\";\r\nimport { ModelSection } from \"./model-types\";\r\n\r\nexport class SectionManager {\r\n  async getSection(\r\n    model: FragmentsModel,\r\n    plane: THREE.Plane,\r\n    localIds?: number[],\r\n  ) {\r\n    const args = [plane, localIds];\r\n    const result = (await model.threads.invoke(\r\n      model.modelId,\r\n      \"getSection\",\r\n      args,\r\n    )) as ModelSection;\r\n    return result;\r\n  }\r\n}\r\n","import {\r\n  CRSData,\r\n  MultiThreadingRequestClass,\r\n  ItemsQueryParams,\r\n  SpatialTreeItem,\r\n  ItemsQueryConfig,\r\n} from \"./model-types\";\r\nimport { AlignmentsManager } from \"./alignments-manager\";\r\nimport { FragmentsModel } from \"./fragments-model\";\r\nimport { MeshManager } from \"./mesh-manager\";\r\nimport { GridsManager } from \"./grids-manager\";\r\n\r\nexport class DataManager {\r\n  async dispose(\r\n    model: FragmentsModel,\r\n    meshes: MeshManager,\r\n    alignments: AlignmentsManager,\r\n    grids: GridsManager,\r\n  ) {\r\n    meshes.list.delete(model.modelId);\r\n    await this.requestModelDelete(model);\r\n    model.threads.delete(model.modelId);\r\n    model.object.removeFromParent();\r\n    this.deleteAllTiles(model);\r\n    meshes.materials.dispose(model.modelId);\r\n    alignments.dispose();\r\n    grids.dispose();\r\n  }\r\n\r\n  async getBuffer(model: FragmentsModel, raw: boolean) {\r\n    return model.threads.invoke(model.modelId, \"getBuffer\", [\r\n      raw,\r\n    ]) as Promise<ArrayBuffer>;\r\n  }\r\n\r\n  async getCategories(model: FragmentsModel) {\r\n    return model.threads.invoke(model.modelId, \"getCategories\") as Promise<\r\n      string[]\r\n    >;\r\n  }\r\n\r\n  async getMaxLocalId(model: FragmentsModel) {\r\n    return model.threads.invoke(\r\n      model.modelId,\r\n      \"getMaxLocalId\",\r\n    ) as Promise<number>;\r\n  }\r\n\r\n  async getLocalIdsByGuids(model: FragmentsModel, guids: string[]) {\r\n    return model.threads.invoke(model.modelId, \"getLocalIdsByGuids\", [\r\n      guids,\r\n    ]) as Promise<(number | null)[]>;\r\n  }\r\n\r\n  async getSpatialStructure(model: FragmentsModel) {\r\n    return model.threads.invoke(\r\n      model.modelId,\r\n      \"getSpatialStructure\",\r\n    ) as Promise<SpatialTreeItem>;\r\n  }\r\n\r\n  async getItemsWithGeometry(model: FragmentsModel) {\r\n    const localIds = (await model.threads.invoke(\r\n      model.modelId,\r\n      \"getItemsWithGeometry\",\r\n      [],\r\n    )) as number[];\r\n    const items = localIds.map((id) => model.getItem(id));\r\n    return items;\r\n  }\r\n\r\n  async getItemsWithGeometryCategories(model: FragmentsModel) {\r\n    return model.threads.invoke(\r\n      model.modelId,\r\n      \"getItemsWithGeometryCategories\",\r\n      [],\r\n    ) as Promise<(string | null)[]>;\r\n  }\r\n\r\n  async getItemsIdsWithGeometry(model: FragmentsModel) {\r\n    return model.threads.invoke(\r\n      model.modelId,\r\n      \"getItemsWithGeometry\",\r\n      [],\r\n    ) as Promise<number[]>;\r\n  }\r\n\r\n  async getItemsOfCategories(model: FragmentsModel, categories: RegExp[]) {\r\n    const args = [categories];\r\n    const data = (await model.threads.invoke(\r\n      model.modelId,\r\n      \"getItemsOfCategories\",\r\n      args,\r\n    )) as { [category: string]: number[] };\r\n    return data;\r\n  }\r\n\r\n  async getItemsByQuery(\r\n    model: FragmentsModel,\r\n    params: ItemsQueryParams,\r\n    config?: ItemsQueryConfig,\r\n  ) {\r\n    const args = [params, config];\r\n    const localIds = (await model.threads.invoke(\r\n      model.modelId,\r\n      \"getItemsByQuery\",\r\n      args,\r\n    )) as number[];\r\n    return localIds;\r\n  }\r\n\r\n  async getMetadata<T extends Record<string, any> = Record<string, any>>(\r\n    model: FragmentsModel,\r\n  ) {\r\n    return model.threads.invoke(model.modelId, \"getMetadata\", []) as Promise<T>;\r\n  }\r\n\r\n  async getCRS(model: FragmentsModel) {\r\n    return model.threads.invoke(\r\n      model.modelId,\r\n      \"getCRS\",\r\n      [],\r\n    ) as Promise<CRSData | null>;\r\n  }\r\n\r\n  async getGuidsByLocalIds(model: FragmentsModel, localIds: number[]) {\r\n    return model.threads.invoke(model.modelId, \"getGuidsByLocalIds\", [\r\n      localIds,\r\n    ]) as Promise<(string | null)[]>;\r\n  }\r\n\r\n  private async requestModelDelete(model: FragmentsModel) {\r\n    await model.threads.fetch({\r\n      class: MultiThreadingRequestClass.DELETE_MODEL,\r\n      modelId: model.modelId,\r\n    });\r\n  }\r\n\r\n  private deleteAllTiles(model: FragmentsModel) {\r\n    for (const [tileId] of model.tiles) {\r\n      model.tiles.delete(tileId);\r\n    }\r\n  }\r\n}\r\n","import {\r\n  InformationResultType,\r\n  ItemInformationType,\r\n  ItemSelectionType,\r\n  ResultInputType,\r\n  SelectionInputType,\r\n} from \"./model-types\";\r\nimport { FragmentsModel } from \"./fragments-model\";\r\n\r\nexport class SequenceManager {\r\n  async getSequenced<\r\n    T extends ItemInformationType,\r\n    U extends ItemSelectionType,\r\n  >(\r\n    model: FragmentsModel,\r\n    result: T,\r\n    fromItems: U[],\r\n    inputs?: {\r\n      selector?: Partial<Record<U, SelectionInputType<U>>>;\r\n      result?: ResultInputType<T>;\r\n    },\r\n  ) {\r\n    const args = [result, fromItems, inputs];\r\n    const response = await model.threads.invoke(\r\n      model.modelId,\r\n      \"getSequenced\",\r\n      args,\r\n    );\r\n    return response as Promise<InformationResultType<T>>;\r\n  }\r\n}\r\n","import { FragmentsModel, FragmentsModels } from \"../..\";\r\nimport * as EDIT from \"../../../Utils/edit\";\r\nimport { FragmentsConnection } from \"../multithreading/fragments-connection\";\r\nimport { EditUtils } from \"../../../Utils/edit/edit-utils\";\r\n\r\nexport class EditHelper {\r\n  private _deltaModels: { [modelId: string]: FragmentsModel[] | null } = {};\r\n  private readonly _fragments: FragmentsModels;\r\n  private readonly _connection: FragmentsConnection;\r\n\r\n  constructor(core: FragmentsModels, connection: FragmentsConnection) {\r\n    this._fragments = core;\r\n    this._connection = connection;\r\n  }\r\n\r\n  async edit(\r\n    modelId: string,\r\n    actions: EDIT.EditRequest[],\r\n    config = {\r\n      removeRedo: true,\r\n    },\r\n  ) {\r\n    const model = this._fragments.models.list.get(modelId);\r\n    if (!model) {\r\n      throw new Error(`Model ${modelId} not found`);\r\n    }\r\n\r\n    // Get old delta models\r\n    const oldDeltaModels = this._deltaModels[modelId] || [];\r\n    this._deltaModels[modelId] = null;\r\n\r\n    // Apply new edits\r\n\r\n    // We want to do this when users makes new actions\r\n    // to make sure that the redo actions are not stored\r\n    // We don't want to do this when users uses undo/redo\r\n    if (config.removeRedo) {\r\n      model._setRequests({ undoneRequests: [] });\r\n    }\r\n\r\n    const { deltaModelBuffer, ids } = await model._edit(actions);\r\n\r\n    // Add local ids to actions.\r\n    // The ids array only contains entries for requests that received new\r\n    // local ids (those that didn't already have one). We must use a\r\n    // separate counter so that pre-existing localIds (e.g. DELETE requests\r\n    // prepended to a CREATE batch) don't shift the mapping.\r\n    let idsIdx = 0;\r\n    for (let i = 0; i < actions.length; i++) {\r\n      if (actions[i].localId !== undefined) {\r\n        continue;\r\n      }\r\n      actions[i].localId = ids[idsIdx++];\r\n    }\r\n\r\n    // Load new delta models\r\n    // For now we just generate one, maybe we want to generate multiple in the future?\r\n    const deltaModel = await this.load(deltaModelBuffer as any, model);\r\n    this._deltaModels[modelId] = [deltaModel];\r\n    model.deltaModelId = deltaModel.modelId;\r\n\r\n    // Dispose old delta models and remove from models list\r\n    const deletePromises = [];\r\n    for (const oldDeltaModel of oldDeltaModels) {\r\n      deletePromises.push(oldDeltaModel.dispose());\r\n      this._fragments.models.list.delete(oldDeltaModel.modelId);\r\n    }\r\n    await Promise.all(deletePromises);\r\n\r\n    //  Return the local ids of the requests as an array\r\n\r\n    return ids;\r\n  }\r\n\r\n  async save(modelId: string) {\r\n    const model = this._fragments.models.list.get(modelId);\r\n    if (!model) {\r\n      console.log(`Model ${modelId} not found`);\r\n      return null;\r\n    }\r\n\r\n    const parent = model.object.parent;\r\n\r\n    const requests = await model._getRequests();\r\n\r\n    const camera = model.camera || undefined;\r\n    const newModelBuffer = await model._save();\r\n\r\n    // Dispose all model\r\n    await model.dispose();\r\n\r\n    // Add new model\r\n    const newModel = await this._fragments.load(newModelBuffer as any, {\r\n      modelId,\r\n      raw: true,\r\n      camera,\r\n    });\r\n\r\n    // If there were some undone actions, pass them to the new model\r\n    await newModel._setRequests({ undoneRequests: requests.undoneRequests });\r\n\r\n    if (parent) {\r\n      parent.add(newModel.object);\r\n    }\r\n\r\n    // Return actions (e.g. to create action history, control z, etc.)\r\n    return requests;\r\n  }\r\n\r\n  async reset(modelId: string) {\r\n    const model = this._fragments.models.list.get(modelId);\r\n    if (!model) {\r\n      console.log(`Model ${modelId} not found`);\r\n      return;\r\n    }\r\n\r\n    await model._reset();\r\n    await this.disposeDeltaModels(modelId);\r\n  }\r\n\r\n  async getRequests(modelId: string) {\r\n    const model = this._fragments.models.list.get(modelId);\r\n    if (!model) {\r\n      throw new Error(`Model ${modelId} not found`);\r\n    }\r\n    return model._getRequests();\r\n  }\r\n\r\n  async selectRequest(modelId: string, index: number) {\r\n    const model = this._fragments.models.list.get(modelId);\r\n    if (!model) {\r\n      throw new Error(`Model ${modelId} not found`);\r\n    }\r\n    return model._selectRequest(index);\r\n  }\r\n\r\n  async _update(modelId: string) {\r\n    const models = this._deltaModels[modelId];\r\n    if (models) {\r\n      const promises = [];\r\n      for (const deltaModel of models) {\r\n        promises.push(deltaModel._refreshView());\r\n      }\r\n      await Promise.all(promises);\r\n    }\r\n  }\r\n\r\n  private async disposeDeltaModels(modelId: string) {\r\n    const models = this._deltaModels[modelId];\r\n    if (models) {\r\n      for (const deltaModel of models) {\r\n        await deltaModel.dispose();\r\n      }\r\n      this._deltaModels[modelId] = [];\r\n    }\r\n  }\r\n\r\n  private async load(buffer: ArrayBuffer, parentModel: FragmentsModel) {\r\n    const deltaId = EditUtils.DELTA_MODEL_ID;\r\n    const modelId = `${parentModel.modelId}${deltaId}${performance.now()}`;\r\n\r\n    const deltaModel = new FragmentsModel(\r\n      modelId,\r\n      this._fragments.models,\r\n      this._connection,\r\n      this._fragments.editor,\r\n    );\r\n\r\n    deltaModel._setDeltaModel(parentModel.modelId);\r\n\r\n    // Skip model updates until we have the data set\r\n    deltaModel.frozen = true;\r\n\r\n    deltaModel.graphicsQuality = this._fragments.settings.graphicsQuality;\r\n\r\n    try {\r\n      this._fragments.models.list.set(deltaModel.modelId, deltaModel);\r\n      await deltaModel._setup(buffer, true);\r\n      parentModel.object.add(deltaModel.object);\r\n    } catch (e) {\r\n      this._fragments.models.list.delete(deltaModel.modelId);\r\n      throw e;\r\n    }\r\n\r\n    const camera = parentModel.camera;\r\n\r\n    if (camera) {\r\n      deltaModel.useCamera(camera);\r\n    }\r\n\r\n    // Model has all the data, so it can start updating.\r\n    // Don't use the frozen setter (which fires _refreshView without await).\r\n    // Instead, unfreeze and explicitly await the view refresh + tile processing\r\n    // so that new tiles are in the scene BEFORE we return (and the caller\r\n    // disposes the old delta model).\r\n    (deltaModel as any)._frozen = false;\r\n    await deltaModel._refreshView();\r\n    await this._fragments.models.forceUpdateFinish();\r\n\r\n    return deltaModel;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport {\r\n  EditRequest,\r\n  EditRequestType,\r\n  RawMaterial,\r\n  GeomsFbUtils,\r\n  NewElementData,\r\n  EditUtils,\r\n  RawItemData,\r\n} from \"../../../Utils\";\r\nimport { FragmentsModels, ItemAttribute, ItemData } from \"../..\";\r\nimport { Element } from \"./element\";\r\nimport * as TFB from \"../../../Schema\";\r\nimport * as ET from \"../../../Utils/edit/edit-types\";\r\n\r\nexport class ElementsHelper {\r\n  private _nextTempIds: { [modelId: string]: number } = {};\r\n\r\n  private _requests: {\r\n    [modelId: string]: {\r\n      update: {\r\n        [localId: number | string]: EditRequest;\r\n      };\r\n\r\n      create: {\r\n        [localId: number | string]: EditRequest;\r\n      };\r\n\r\n      remove: {\r\n        [localId: number | string]: EditRequest;\r\n      };\r\n      relations: {\r\n        create: {\r\n          [localId: number | string]: EditRequest;\r\n        };\r\n        update: {\r\n          [localId: number | string]: EditRequest;\r\n        };\r\n        remove: {\r\n          [localId: number | string]: EditRequest;\r\n        };\r\n      };\r\n    };\r\n  } = {};\r\n\r\n  private _fragments: FragmentsModels;\r\n\r\n  constructor(fragments: FragmentsModels) {\r\n    this._fragments = fragments;\r\n  }\r\n\r\n  getRequests(modelId: string) {\r\n    const modelRequests = this.getModelRequests(modelId);\r\n    this._requests[modelId] = this.newRequests();\r\n\r\n    const {\r\n      create,\r\n      update,\r\n      remove,\r\n      relations: { create: relCreate, update: relUpdate, remove: relRemove },\r\n    } = modelRequests;\r\n\r\n    const createRequests = Object.values(create);\r\n    const updateRequests = Object.values(update);\r\n    const removeRequests = Object.values(remove);\r\n    const relCreateRequests = Object.values(relCreate);\r\n    const relUpdateRequests = Object.values(relUpdate);\r\n    const relRemoveRequests = Object.values(relRemove);\r\n\r\n    const requests = [\r\n      ...removeRequests,\r\n      ...createRequests,\r\n      ...updateRequests,\r\n      ...relCreateRequests,\r\n      ...relUpdateRequests,\r\n      ...relRemoveRequests,\r\n    ];\r\n\r\n    if (requests.length > 0) {\r\n      return requests;\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  createMaterial(modelId: string, material: THREE.MeshLambertMaterial) {\r\n    const tempId = this.getNextTempId(modelId);\r\n    const data: RawMaterial = {\r\n      r: material.color.r * 255,\r\n      g: material.color.g * 255,\r\n      b: material.color.b * 255,\r\n      a: material.opacity * 255,\r\n      renderedFaces: material.side === THREE.DoubleSide ? 1 : 0,\r\n      stroke: 0,\r\n    };\r\n    this.addRequest(modelId, tempId, \"create\", {\r\n      type: EditRequestType.CREATE_MATERIAL,\r\n      tempId,\r\n      data,\r\n    });\r\n    return tempId;\r\n  }\r\n\r\n  createLocalTransform(modelId: string, transform: THREE.Matrix4) {\r\n    const tempId = this.getNextTempId(modelId);\r\n    const data = GeomsFbUtils.transformFromMatrix(transform);\r\n    this.addRequest(modelId, tempId, \"create\", {\r\n      type: EditRequestType.CREATE_LOCAL_TRANSFORM,\r\n      tempId,\r\n      data,\r\n    });\r\n    return tempId;\r\n  }\r\n\r\n  createShell(modelId: string, geometry: THREE.BufferGeometry) {\r\n    const tempId = this.getNextTempId(modelId);\r\n    const shell = GeomsFbUtils.representationFromGeometry(geometry);\r\n    this.addRequest(modelId, tempId, \"create\", {\r\n      type: EditRequestType.CREATE_REPRESENTATION,\r\n      tempId,\r\n      data: shell,\r\n    });\r\n    return tempId;\r\n  }\r\n\r\n  createCircleExtrusion(modelId: string, data: ET.RawCircleExtrusion) {\r\n    const bbox = GeomsFbUtils.bboxFromCircleExtrusion(data);\r\n\r\n    const tempId = this.getNextTempId(modelId);\r\n    this.addRequest(modelId, tempId, \"create\", {\r\n      type: EditRequestType.CREATE_REPRESENTATION,\r\n      tempId,\r\n      data: {\r\n        representationClass: TFB.RepresentationClass.CIRCLE_EXTRUSION,\r\n        bbox,\r\n        geometry: data,\r\n      },\r\n    });\r\n    return tempId;\r\n  }\r\n\r\n  createGlobalTransform(\r\n    modelId: string,\r\n    transform: THREE.Matrix4,\r\n    itemId: number | string,\r\n  ) {\r\n    const tempId = this.getNextTempId(modelId);\r\n    const data = GeomsFbUtils.transformFromMatrix(transform);\r\n    this.addRequest(modelId, tempId, \"create\", {\r\n      type: EditRequestType.CREATE_GLOBAL_TRANSFORM,\r\n      tempId,\r\n      data: {\r\n        itemId,\r\n        ...data,\r\n      },\r\n    });\r\n    return tempId;\r\n  }\r\n\r\n  createSample(\r\n    modelId: string,\r\n    data: {\r\n      localTransform: number | string;\r\n      representation: number | string;\r\n      material: number | string;\r\n      globalTransform: number | string;\r\n    },\r\n  ) {\r\n    const { localTransform, representation, material, globalTransform } = data;\r\n    const tempId = this.getNextTempId(modelId);\r\n    this.addRequest(modelId, tempId, \"create\", {\r\n      type: EditRequestType.CREATE_SAMPLE,\r\n      tempId,\r\n      data: {\r\n        localTransform,\r\n        representation,\r\n        material,\r\n        item: globalTransform,\r\n      },\r\n    });\r\n    return tempId;\r\n  }\r\n\r\n  createItem(modelId: string, item: RawItemData) {\r\n    const tempId = this.getNextTempId(modelId);\r\n    this.addRequest(modelId, tempId, \"create\", {\r\n      type: EditRequestType.CREATE_ITEM,\r\n      tempId,\r\n      data: item,\r\n    });\r\n    return tempId;\r\n  }\r\n\r\n  setItem(modelId: string, item: ItemData) {\r\n    const localIdAttr = item._localId as ItemAttribute;\r\n    if (!localIdAttr) {\r\n      throw new Error(\"No local id provided for the item to set\");\r\n    }\r\n\r\n    const localId = localIdAttr.value;\r\n    const data = EditUtils.itemDataToRawItemData(item);\r\n\r\n    this.addRequest(modelId, localIdAttr.value, \"update\", {\r\n      type: EditRequestType.UPDATE_ITEM,\r\n      localId,\r\n      data,\r\n    });\r\n  }\r\n\r\n  async relate(\r\n    modelId: string,\r\n    itemId: number,\r\n    relationName: string,\r\n    itemIds: number[],\r\n  ) {\r\n    // Get the relation of the item\r\n\r\n    const model = this._fragments.models.list.get(modelId);\r\n    if (!model) {\r\n      throw new Error(`Model ${modelId} not found`);\r\n    }\r\n\r\n    const relations = await model.getRelations([itemId]);\r\n    const relationData = relations.get(itemId);\r\n    if (!relationData) {\r\n      // Item not related: create relation and add given items\r\n      this.addRelationRequest(modelId, itemId, \"create\", {\r\n        type: EditRequestType.CREATE_RELATION,\r\n        localId: itemId,\r\n        data: {\r\n          data: {\r\n            [relationName]: itemIds,\r\n          },\r\n        },\r\n      });\r\n      return;\r\n    }\r\n\r\n    // Item is related: update relation\r\n\r\n    if (!relationData.data[relationName]) {\r\n      // Relation not found: create relation and add given items\r\n      relationData.data[relationName] = itemIds;\r\n    } else {\r\n      const uniqueRels = new Set(relationData.data[relationName]);\r\n      for (const id of itemIds) {\r\n        uniqueRels.add(id);\r\n      }\r\n      relationData.data[relationName] = Array.from(uniqueRels);\r\n    }\r\n\r\n    this.addRelationRequest(modelId, itemId, \"update\", {\r\n      type: EditRequestType.UPDATE_RELATION,\r\n      localId: itemId,\r\n      data: relationData,\r\n    });\r\n  }\r\n\r\n  async unrelate(\r\n    modelId: string,\r\n    itemId: number,\r\n    relationName: string,\r\n    itemIds: number[],\r\n  ) {\r\n    // Get the relation of the item\r\n\r\n    const model = this._fragments.models.list.get(modelId);\r\n    if (!model) {\r\n      throw new Error(`Model ${modelId} not found`);\r\n    }\r\n\r\n    const relations = await model.getRelations([itemId]);\r\n    const relationData = relations.get(itemId);\r\n    if (!relationData) {\r\n      // Item not related: just return\r\n      return;\r\n    }\r\n\r\n    // Item is related: update relation\r\n\r\n    if (!relationData.data[relationName]) {\r\n      // Relation not found: just return\r\n      return;\r\n    }\r\n\r\n    // Delete given items from relation\r\n    const uniqueRels = new Set(relationData.data[relationName]);\r\n    for (const id of itemIds) {\r\n      uniqueRels.delete(id);\r\n    }\r\n    relationData.data[relationName] = Array.from(uniqueRels);\r\n\r\n    this.addRelationRequest(modelId, itemId, \"update\", {\r\n      type: EditRequestType.UPDATE_RELATION,\r\n      localId: itemId,\r\n      data: relationData,\r\n    });\r\n  }\r\n\r\n  async get(modelId: string, localIds: Iterable<number>) {\r\n    const model = this._fragments.models.list.get(modelId);\r\n    if (!model) {\r\n      throw new Error(`Model ${modelId} not found`);\r\n    }\r\n    return model._getElements(localIds);\r\n  }\r\n\r\n  async create(modelId: string, elements: NewElementData[]) {\r\n    for (const element of elements) {\r\n      const { attributes, samples, globalTransform } = element;\r\n\r\n      // Create the item\r\n      const tempId = this.getNextTempId(modelId);\r\n      const data = EditUtils.itemDataToRawItemData(attributes);\r\n      this.addRequest(modelId, tempId, \"create\", {\r\n        type: EditRequestType.CREATE_ITEM,\r\n        tempId,\r\n        data,\r\n      });\r\n\r\n      // Create the meshes\r\n      const gtId = this.createGlobalTransform(modelId, globalTransform, tempId);\r\n      for (const sample of samples) {\r\n        const { localTransform, representation, material } = sample;\r\n        let ltId: number | string;\r\n        if (\r\n          typeof localTransform !== \"number\" &&\r\n          typeof localTransform !== \"string\"\r\n        ) {\r\n          ltId = this.createLocalTransform(modelId, localTransform);\r\n        } else {\r\n          ltId = localTransform;\r\n        }\r\n        let reprId: number | string;\r\n        if (\r\n          typeof representation !== \"number\" &&\r\n          typeof representation !== \"string\"\r\n        ) {\r\n          reprId = this.createShell(modelId, representation);\r\n        } else {\r\n          reprId = representation;\r\n        }\r\n        let matId: number | string;\r\n        if (typeof material !== \"number\" && typeof material !== \"string\") {\r\n          matId = this.createMaterial(modelId, material);\r\n        } else {\r\n          matId = material;\r\n        }\r\n        this.createSample(modelId, {\r\n          localTransform: ltId,\r\n          representation: reprId,\r\n          material: matId,\r\n          globalTransform: gtId,\r\n        });\r\n      }\r\n    }\r\n\r\n    const requests = this.getRequests(modelId);\r\n    if (!requests) {\r\n      console.log(\"Something went wrong, no requests sent\");\r\n      return null;\r\n    }\r\n\r\n    const itemIndices: number[] = [];\r\n    for (let i = 0; i < requests.length; i++) {\r\n      if (requests[i].type === EditRequestType.CREATE_ITEM) {\r\n        itemIndices.push(i);\r\n      }\r\n    }\r\n\r\n    const result = await this._fragments.editor.edit(modelId, requests);\r\n\r\n    const itemIds = itemIndices.map((index) => result[index]);\r\n\r\n    return this.get(modelId, itemIds);\r\n  }\r\n\r\n  delete(modelId: string, elements: Element[]) {\r\n    for (const element of elements) {\r\n      element.delete();\r\n      const currentRequests = element.getRequests();\r\n      if (currentRequests) {\r\n        for (const request of currentRequests) {\r\n          const id = request.localId as number;\r\n          if (id) {\r\n            this.addRequest(modelId, id, \"remove\", request);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  async applyChanges(modelId: string, elements: Element[] = []) {\r\n    const allRequests: EditRequest[] = [];\r\n    for (const element of elements) {\r\n      const requests = element.getRequests();\r\n      if (requests) {\r\n        allRequests.push(...requests);\r\n      }\r\n    }\r\n    const requests = this.getRequests(modelId);\r\n    if (requests) {\r\n      allRequests.push(...requests);\r\n    }\r\n    if (allRequests.length > 0) {\r\n      return this._fragments.editor.edit(modelId, allRequests);\r\n    }\r\n    return [];\r\n  }\r\n\r\n  async deleteData(\r\n    modelId: string,\r\n    data: {\r\n      itemIds?: Iterable<number>;\r\n      materialIds?: Iterable<number>;\r\n      localTransformIds?: Iterable<number>;\r\n      representationIds?: Iterable<number>;\r\n      sampleIds?: Iterable<number>;\r\n      filterInUse?: boolean;\r\n    },\r\n  ) {\r\n    const model = this._fragments.models.list.get(modelId);\r\n    if (!model) {\r\n      throw new Error(`Model ${modelId} not found`);\r\n    }\r\n\r\n    const filterInUse = data.filterInUse ?? true;\r\n\r\n    const {\r\n      itemIds,\r\n      materialIds,\r\n      localTransformIds,\r\n      representationIds,\r\n      sampleIds,\r\n    } = data;\r\n\r\n    const usedMaterials = new Set<number>();\r\n    const usedLocalTransforms = new Set<number>();\r\n    const usedGlobalTransforms = new Set<number>();\r\n    const usedRepresentations = new Set<number>();\r\n\r\n    if (filterInUse) {\r\n      const samples = await model.getSamples();\r\n      for (const sample of samples.values()) {\r\n        usedMaterials.add(sample.material);\r\n        usedLocalTransforms.add(sample.localTransform);\r\n        usedGlobalTransforms.add(sample.item);\r\n        usedRepresentations.add(sample.representation);\r\n      }\r\n    }\r\n\r\n    if (materialIds) {\r\n      for (const materialId of materialIds) {\r\n        if (filterInUse && usedMaterials.has(materialId)) {\r\n          console.log(`Material ${materialId} is used, skipping`);\r\n          continue;\r\n        }\r\n        if (this.isBeingCreated(modelId, materialId)) {\r\n          // Material not created yet, just remove it from queue\r\n          delete this._requests[modelId].create[materialId];\r\n          continue;\r\n        }\r\n        this.addRequest(modelId, materialId, \"remove\", {\r\n          type: EditRequestType.DELETE_MATERIAL,\r\n          localId: materialId,\r\n        });\r\n      }\r\n    }\r\n\r\n    if (localTransformIds) {\r\n      for (const localTransformId of localTransformIds) {\r\n        if (filterInUse && usedLocalTransforms.has(localTransformId)) {\r\n          console.log(`Local transform ${localTransformId} is used, skipping`);\r\n          continue;\r\n        }\r\n        if (this.isBeingCreated(modelId, localTransformId)) {\r\n          // Local transform not created yet, just remove it from queue\r\n          delete this._requests[modelId].create[localTransformId];\r\n          continue;\r\n        }\r\n        this.addRequest(modelId, localTransformId, \"remove\", {\r\n          type: EditRequestType.DELETE_LOCAL_TRANSFORM,\r\n          localId: localTransformId,\r\n        });\r\n      }\r\n    }\r\n\r\n    if (representationIds) {\r\n      for (const representationId of representationIds) {\r\n        if (filterInUse && usedRepresentations.has(representationId)) {\r\n          console.log(`Representation ${representationId} is used, skipping`);\r\n          continue;\r\n        }\r\n        if (this.isBeingCreated(modelId, representationId)) {\r\n          // Representation not created yet, just remove it from queue\r\n          delete this._requests[modelId].create[representationId];\r\n          continue;\r\n        }\r\n        this.addRequest(modelId, representationId, \"remove\", {\r\n          type: EditRequestType.DELETE_REPRESENTATION,\r\n          localId: representationId,\r\n        });\r\n      }\r\n    }\r\n\r\n    if (sampleIds) {\r\n      for (const sampleId of sampleIds) {\r\n        if (this.isBeingCreated(modelId, sampleId)) {\r\n          // Sample not created yet, just remove it from queue\r\n          delete this._requests[modelId].create[sampleId];\r\n          continue;\r\n        }\r\n        this.addRequest(modelId, sampleId, \"remove\", {\r\n          type: EditRequestType.DELETE_SAMPLE,\r\n          localId: sampleId,\r\n        });\r\n      }\r\n    }\r\n\r\n    if (itemIds) {\r\n      for (const itemId of itemIds) {\r\n        if (this.isBeingCreated(modelId, itemId)) {\r\n          // Item not created yet, just remove it from queue\r\n          delete this._requests[modelId].create[itemId];\r\n          continue;\r\n        }\r\n        this.addRequest(modelId, itemId, \"remove\", {\r\n          type: EditRequestType.DELETE_ITEM,\r\n          localId: itemId,\r\n        });\r\n      }\r\n    }\r\n  }\r\n\r\n  private getNextTempId(modelId: string) {\r\n    if (!this._nextTempIds[modelId]) {\r\n      this._nextTempIds[modelId] = 0;\r\n    }\r\n    return (this._nextTempIds[modelId]++).toString();\r\n  }\r\n\r\n  private addRelationRequest(\r\n    modelId: string,\r\n    localId: number | string,\r\n    type: \"create\" | \"update\" | \"remove\",\r\n    request: EditRequest,\r\n  ) {\r\n    const modelRequests = this.getModelRequests(modelId);\r\n    const relRequests = modelRequests.relations;\r\n    const currentRequests = relRequests[type];\r\n    const id = localId as keyof typeof currentRequests;\r\n    currentRequests[id] = request;\r\n  }\r\n\r\n  private addRequest(\r\n    modelId: string,\r\n    localId: number | string,\r\n    type: \"create\" | \"update\" | \"remove\",\r\n    request: EditRequest,\r\n  ) {\r\n    const modelRequests = this.getModelRequests(modelId);\r\n    const currentRequests = modelRequests[type];\r\n    const id = localId as keyof typeof currentRequests;\r\n    currentRequests[id] = request;\r\n  }\r\n\r\n  private getModelRequests(modelId: string) {\r\n    if (!this._requests[modelId]) {\r\n      this._requests[modelId] = this.newRequests();\r\n    }\r\n    return this._requests[modelId];\r\n  }\r\n\r\n  private isBeingCreated(modelId: string, localId: number | string) {\r\n    if (!this._requests[modelId]) {\r\n      return false;\r\n    }\r\n    const requests = this._requests[modelId];\r\n    return requests.create[localId] !== undefined;\r\n  }\r\n\r\n  private newRequests() {\r\n    // Relations need to be updated separately because they have the same localId than the item\r\n    return {\r\n      update: {},\r\n      create: {},\r\n      remove: {},\r\n      relations: {\r\n        create: {},\r\n        update: {},\r\n        remove: {},\r\n      },\r\n    };\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { FragmentsModels, ItemData } from \"../..\";\r\nimport { FragmentsConnection } from \"../multithreading/fragments-connection\";\r\nimport {\r\n  EditRequest,\r\n  Event,\r\n  NewElementData,\r\n  RawCircleExtrusion,\r\n  RawItemData,\r\n} from \"../../../Utils\";\r\nimport { EditHelper } from \"./edit-helper\";\r\nimport { ElementsHelper } from \"./elements-helper\";\r\nimport { Element } from \"./element\";\r\n\r\n/**\r\n * The Editor class provides functionality for editing and managing Fragments models. It handles operations like editing model elements, saving changes and managing edit history.\r\n */\r\nexport class Editor {\r\n  /**\r\n   * Event triggered when an edit is made.\r\n   */\r\n  onEdit = new Event<{ modelId: string }>();\r\n\r\n  private _editHelper: EditHelper;\r\n  private _elementsHelper: ElementsHelper;\r\n\r\n  constructor(core: FragmentsModels, connection: FragmentsConnection) {\r\n    this._editHelper = new EditHelper(core, connection);\r\n    this._elementsHelper = new ElementsHelper(core);\r\n  }\r\n\r\n  /**\r\n   * Edits a Fragments model.\r\n   * @param modelId - The ID of the model to edit.\r\n   * @param actions - The actions to perform on the model.\r\n   * @param config - The configuration for the edit.\r\n   * @returns The IDs of the elements that were edited.\r\n   */\r\n  async edit(\r\n    modelId: string,\r\n    actions: EditRequest[],\r\n    config = {\r\n      removeRedo: true,\r\n    },\r\n  ) {\r\n    const ids = await this._editHelper.edit(modelId, actions, config);\r\n    this.onEdit.trigger();\r\n    return ids;\r\n  }\r\n\r\n  /**\r\n   * Saves all the edits of the specified Fragments model. Useful for exporting the model with the edits applied. Similar to \"Saving\" the changes in a BIM app.\r\n   * @param modelId - The ID of the model to save.\r\n   * @returns The requests that were saved.\r\n   */\r\n  async save(modelId: string) {\r\n    return this._editHelper.save(modelId);\r\n  }\r\n\r\n  /**\r\n   * Resets the edits of the specified Fragments model.\r\n   * @param modelId - The ID of the model to reset.\r\n   */\r\n  async reset(modelId: string) {\r\n    await this._editHelper.reset(modelId);\r\n  }\r\n\r\n  /**\r\n   * Gets the requests of the specified Fragments model. Useful for building a history menu.\r\n   * @param modelId - The ID of the model to get the requests from.\r\n   * @returns The requests of the model.\r\n   */\r\n  async getModelRequests(modelId: string) {\r\n    return this._editHelper.getRequests(modelId);\r\n  }\r\n\r\n  /**\r\n   * Selects an edit request of the specified Fragments model to set the model in the state it\r\n   * was after the request was applied.\r\n   * @param modelId - The ID of the model to select the request from.\r\n   * @param index - The index of the request to select.\r\n   * @returns The selected request.\r\n   */\r\n  async selectRequest(modelId: string, index: number) {\r\n    return this._editHelper.selectRequest(modelId, index);\r\n  }\r\n\r\n  /**\r\n   * Clears all the element edit requests of the specified Fragments model.\r\n   * @param modelId - The ID of the model to clear the requests from.\r\n   */\r\n\r\n  clearElementsRequests(modelId: string) {\r\n    return this._elementsHelper.getRequests(modelId);\r\n  }\r\n\r\n  /**\r\n   * Creates a material in the specified Fragments model.\r\n   * @param modelId - The ID of the model to create the material in.\r\n   * @param material - The material to create.\r\n   * @returns The created material.\r\n   */\r\n  createMaterial(modelId: string, material: THREE.MeshLambertMaterial) {\r\n    return this._elementsHelper.createMaterial(modelId, material);\r\n  }\r\n\r\n  /**\r\n   * Creates a local transform in the specified Fragments model.\r\n   * @param modelId - The ID of the model to create the local transform in.\r\n   * @param transform - The local transform to create.\r\n   * @returns The created local transform.\r\n   */\r\n  createLocalTransform(modelId: string, transform: THREE.Matrix4) {\r\n    return this._elementsHelper.createLocalTransform(modelId, transform);\r\n  }\r\n\r\n  /**\r\n   * Creates a shell in the specified Fragments model.\r\n   * @param modelId - The ID of the model to create the shell in.\r\n   * @param geometry - The geometry of the shell to create.\r\n   * @returns The created shell.\r\n   */\r\n  createShell(modelId: string, geometry: THREE.BufferGeometry) {\r\n    return this._elementsHelper.createShell(modelId, geometry);\r\n  }\r\n\r\n  /**\r\n   * Creates a circle extrusion in the specified Fragments model.\r\n   * @param modelId - The ID of the model to create the circle extrusion in.\r\n   * @param data - The data of the circle extrusion to create.\r\n   * @returns The created circle extrusion.\r\n   */\r\n  createCircleExtrusion(modelId: string, data: RawCircleExtrusion) {\r\n    return this._elementsHelper.createCircleExtrusion(modelId, data);\r\n  }\r\n\r\n  /**\r\n   * Creates a global transform in the specified Fragments model.\r\n   * @param modelId - The ID of the model to create the global transform in.\r\n   * @param transform - The global transform to create.\r\n   * @param itemId - The ID of the item to create the global transform for.\r\n   * @returns The created global transform.\r\n   */\r\n  createGlobalTransform(\r\n    modelId: string,\r\n    transform: THREE.Matrix4,\r\n    itemId: number | string,\r\n  ) {\r\n    return this._elementsHelper.createGlobalTransform(\r\n      modelId,\r\n      transform,\r\n      itemId,\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Creates a sample in the specified Fragments model.\r\n   * @param modelId - The ID of the model to create the sample in.\r\n   * @param data - The data of the sample to create.\r\n   * @returns The created sample.\r\n   */\r\n  createSample(\r\n    modelId: string,\r\n    data: {\r\n      localTransform: number | string;\r\n      representation: number | string;\r\n      material: number | string;\r\n      globalTransform: number | string;\r\n    },\r\n  ) {\r\n    return this._elementsHelper.createSample(modelId, data);\r\n  }\r\n\r\n  /**\r\n   * Creates an item in the specified Fragments model.\r\n   * @param modelId - The ID of the model to create the item in.\r\n   * @param item - The item to create.\r\n   * @returns The created item.\r\n   */\r\n  createItem(modelId: string, item: RawItemData) {\r\n    return this._elementsHelper.createItem(modelId, item);\r\n  }\r\n\r\n  /**\r\n   * Sets an item in the specified Fragments model.\r\n   * @param modelId - The ID of the model to set the item in.\r\n   * @param item - The item to set.\r\n   * @returns The set item.\r\n   */\r\n  setItem(modelId: string, item: ItemData) {\r\n    return this._elementsHelper.setItem(modelId, item);\r\n  }\r\n\r\n  /**\r\n   * Relates an item to other items in the specified Fragments model.\r\n   * @param modelId - The ID of the model to relate the item in.\r\n   * @param itemId - The ID of the item to relate.\r\n   * @param relationName - The name of the relation to relate.\r\n   * @param itemIds - The IDs of the items to relate.\r\n   * @returns The related items.\r\n   */\r\n  async relate(\r\n    modelId: string,\r\n    itemId: number,\r\n    relationName: string,\r\n    itemIds: number[],\r\n  ) {\r\n    return this._elementsHelper.relate(modelId, itemId, relationName, itemIds);\r\n  }\r\n\r\n  /**\r\n   * Removes a relation between an item and other items in the specified Fragments model.\r\n   * @param modelId - The ID of the model to unrelate the item in.\r\n   * @param itemId - The ID of the item to unrelate.\r\n   * @param relationName - The name of the relation to unrelate.\r\n   * @param itemIds - The IDs of the items to unrelate.\r\n   * @returns The unrelated items.\r\n   */\r\n  async unrelate(\r\n    modelId: string,\r\n    itemId: number,\r\n    relationName: string,\r\n    itemIds: number[],\r\n  ) {\r\n    return this._elementsHelper.unrelate(\r\n      modelId,\r\n      itemId,\r\n      relationName,\r\n      itemIds,\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Gets the elements of the specified Fragments model.\r\n   * @param modelId - The ID of the model to get the elements from.\r\n   * @param localIds - The local IDs of the elements to get.\r\n   * @returns The elements of the model.\r\n   */\r\n  async getElements(modelId: string, localIds: Iterable<number>) {\r\n    return this._elementsHelper.get(modelId, localIds);\r\n  }\r\n\r\n  /**\r\n   * Creates elements in the specified Fragments model.\r\n   * @param modelId - The ID of the model to create the elements in.\r\n   * @param elements - The elements to create.\r\n   * @returns The created elements.\r\n   */\r\n  async createElements(modelId: string, elements: NewElementData[]) {\r\n    return this._elementsHelper.create(modelId, elements);\r\n  }\r\n\r\n  /**\r\n   * Deletes elements in the specified Fragments model.\r\n   * @param modelId - The ID of the model to delete the elements in.\r\n   * @param elements - The elements to delete.\r\n   * @returns The deleted elements.\r\n   */\r\n  deleteElements(modelId: string, elements: Element[]) {\r\n    return this._elementsHelper.delete(modelId, elements);\r\n  }\r\n\r\n  /**\r\n   * Applies changes to the specified Fragments model.\r\n   * @param modelId - The ID of the model to apply the changes to.\r\n   * @param elements - The elements to apply the changes to.\r\n   * @returns The applied changes.\r\n   */\r\n  async applyChanges(modelId: string, elements: Element[] = []) {\r\n    return this._elementsHelper.applyChanges(modelId, elements);\r\n  }\r\n\r\n  /**\r\n   * Deletes any type of data from the specified Fragments model.\r\n   * @param modelId - The ID of the model to delete the data from.\r\n   * @param data - The data to delete.\r\n   * @returns The deleted data.\r\n   */\r\n  async deleteData(\r\n    modelId: string,\r\n    data: {\r\n      itemIds?: Iterable<number>;\r\n      materialIds?: Iterable<number>;\r\n      localTransformIds?: Iterable<number>;\r\n      representationIds?: Iterable<number>;\r\n      sampleIds?: Iterable<number>;\r\n      filterInUse?: boolean;\r\n    },\r\n  ) {\r\n    return this._elementsHelper.deleteData(modelId, data);\r\n  }\r\n\r\n  /**\r\n   * Internal method to update the specified Fragments model. Do not use this method directly.\r\n   * @param modelId - The ID of the model to update.\r\n   */\r\n  async _update(modelId: string) {\r\n    await this._editHelper._update(modelId);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport {\r\n  CreateSampleRequest,\r\n  EditRequest,\r\n  EditRequestType,\r\n  ElementData,\r\n  RawGlobalTransformData,\r\n  RawMaterial,\r\n  RawRepresentation,\r\n  RawSample,\r\n  RawTransformData,\r\n} from \"../../../Utils\";\r\nimport { GeomsFbUtils } from \"../../../Utils/shells\";\r\nimport { FragmentsModel, MeshData } from \"../model\";\r\nimport * as TFB from \"../../../Schema\";\r\n\r\nexport type ElementConfig = {\r\n  data: {\r\n    attributesDefault: true;\r\n    relations: {\r\n      [name: string]: { attributes: boolean; relations: boolean };\r\n    };\r\n  };\r\n};\r\n\r\nexport class Element {\r\n  readonly localId: number;\r\n  readonly model: FragmentsModel;\r\n  readonly core: ElementData;\r\n\r\n  config: ElementConfig = {\r\n    data: {\r\n      attributesDefault: true,\r\n      relations: {\r\n        IsDefinedBy: { attributes: true, relations: true },\r\n        DefinesOcurrence: { attributes: false, relations: false },\r\n      },\r\n    },\r\n  };\r\n\r\n  private updateRequests: {\r\n    [localId: number]: EditRequest;\r\n  } = {};\r\n\r\n  private createRequests: {\r\n    [localId: number]: EditRequest;\r\n  } = {};\r\n\r\n  private removeRequests: {\r\n    [localId: number]: EditRequest;\r\n  } = {};\r\n\r\n  private _elementChanged = false;\r\n\r\n  get elementChanged() {\r\n    return this._elementChanged;\r\n  }\r\n\r\n  constructor(id: number, data: ElementData, model: FragmentsModel) {\r\n    this.localId = id;\r\n    this.core = data;\r\n    this.model = model;\r\n  }\r\n\r\n  getRequests() {\r\n    const createRequests = Object.values(this.createRequests);\r\n    this.createRequests = {};\r\n\r\n    const updateRequests = Object.values(this.updateRequests);\r\n    this.updateRequests = {};\r\n\r\n    const removeRequests = Object.values(this.removeRequests);\r\n    this.removeRequests = {};\r\n\r\n    const requests = [...removeRequests, ...createRequests, ...updateRequests];\r\n\r\n    if (requests.length > 0) {\r\n      return requests;\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  // Deletes all samples, global transform, item and relationships in related items\r\n  delete() {\r\n    // When something is in create requests, it means that it wasn't created in fragments\r\n    // yet, so just remove it from here. Otherwise, it means that it was created in fragments\r\n    // and we need create a proper request to delete it.\r\n    if (this.createRequests[this.localId]) {\r\n      delete this.createRequests[this.localId];\r\n    } else {\r\n      this.removeRequests[this.localId] = {\r\n        type: EditRequestType.DELETE_ITEM,\r\n        localId: this.localId,\r\n      };\r\n    }\r\n\r\n    for (const sampleIdStr in this.core.samples) {\r\n      const sample = this.core.samples[sampleIdStr];\r\n      const sampleId = parseInt(sampleIdStr, 10);\r\n\r\n      if (this.createRequests[sample.localTransform]) {\r\n        delete this.createRequests[sample.localTransform];\r\n      } else {\r\n        this.removeRequests[sample.localTransform] = {\r\n          type: EditRequestType.DELETE_LOCAL_TRANSFORM,\r\n          localId: sample.localTransform,\r\n        };\r\n      }\r\n\r\n      if (this.createRequests[sample.representation]) {\r\n        delete this.createRequests[sample.representation];\r\n      } else {\r\n        this.removeRequests[sample.representation] = {\r\n          type: EditRequestType.DELETE_REPRESENTATION,\r\n          localId: sample.representation,\r\n        };\r\n      }\r\n\r\n      if (this.createRequests[sample.material]) {\r\n        delete this.createRequests[sample.material];\r\n      } else {\r\n        this.removeRequests[sample.material] = {\r\n          type: EditRequestType.DELETE_MATERIAL,\r\n          localId: sample.material,\r\n        };\r\n      }\r\n\r\n      if (this.createRequests[sample.item]) {\r\n        delete this.createRequests[sample.item];\r\n      } else {\r\n        this.removeRequests[sample.item] = {\r\n          type: EditRequestType.DELETE_GLOBAL_TRANSFORM,\r\n          localId: sample.item,\r\n        };\r\n      }\r\n\r\n      if (this.createRequests[sampleId]) {\r\n        delete this.createRequests[sampleId];\r\n      } else {\r\n        this.removeRequests[sampleId] = {\r\n          type: EditRequestType.DELETE_SAMPLE,\r\n          localId: sampleId,\r\n        };\r\n      }\r\n    }\r\n  }\r\n\r\n  async getData() {\r\n    const result = await this.model.getItemsData(\r\n      [this.localId],\r\n      this.config.data\r\n    );\r\n    return result[0];\r\n  }\r\n\r\n  getGlobalTransformId() {\r\n    return parseInt(Object.keys(this.core.globalTransforms)[0], 10);\r\n  }\r\n\r\n  disposeMeshes(\r\n    meshes: THREE.Group,\r\n    config?: {\r\n      disposeGeometry?: boolean;\r\n      disposeMaterial?: boolean;\r\n    }\r\n  ) {\r\n    const disposeGeometry = config?.disposeGeometry ?? true;\r\n    const disposeMaterial = config?.disposeMaterial ?? true;\r\n    meshes.removeFromParent();\r\n    meshes.traverse((child) => {\r\n      if (child instanceof THREE.Mesh) {\r\n        if (disposeGeometry) {\r\n          child.geometry.dispose();\r\n        }\r\n        if (disposeMaterial) {\r\n          child.material.dispose();\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  async getMeshes() {\r\n    // Global transform\r\n    const meshes = new THREE.Group();\r\n\r\n    const firstGt = Object.values(this.core.globalTransforms)[0];\r\n    const globalTransform = GeomsFbUtils.matrixFromTransform(firstGt);\r\n    meshes.applyMatrix4(globalTransform);\r\n\r\n    const materialList = new Map<number, THREE.MeshLambertMaterial>();\r\n    const geometryList = new Map<number, THREE.BufferGeometry>();\r\n\r\n    const repsIds = Object.keys(this.core.representations).map(Number);\r\n    const geometries = await this.model.getGeometries(repsIds);\r\n\r\n    const geometriesByReprId = new Map<number, MeshData>();\r\n    for (const geometry of geometries) {\r\n      const reprId = geometry.representationId!;\r\n      geometriesByReprId.set(reprId, geometry);\r\n    }\r\n\r\n    for (const sampleIdStr in this.core.samples) {\r\n      const sampleId = parseInt(sampleIdStr, 10);\r\n      const sample = this.core.samples[sampleId];\r\n      const meshData = geometriesByReprId.get(sample.representation);\r\n\r\n      if (!meshData) {\r\n        throw new Error(\r\n          `No geometry found for representation ${sample.representation}`\r\n        );\r\n      }\r\n\r\n      const { indices, positions, normals } = meshData;\r\n      if (!indices || !positions || !normals) {\r\n        continue;\r\n      }\r\n\r\n      // Material\r\n      if (!materialList.has(sample.material)) {\r\n        const { r, g, b, a } = this.core.materials[sample.material];\r\n        const color = new THREE.Color().setRGB(\r\n          r / 255,\r\n          g / 255,\r\n          b / 255,\r\n          THREE.SRGBColorSpace\r\n        );\r\n        const material = new THREE.MeshLambertMaterial({\r\n          color,\r\n          transparent: true,\r\n          opacity: a / 255,\r\n        });\r\n        material.userData.localId = sample.material;\r\n        materialList.set(sample.material, material);\r\n      }\r\n\r\n      const material = materialList.get(sample.material);\r\n\r\n      // Local transform\r\n      const lt = this.core.localTransforms[sample.localTransform];\r\n      const localTransform = GeomsFbUtils.matrixFromTransform(lt);\r\n\r\n      // Representation\r\n      if (!geometryList.has(sample.representation)) {\r\n        const geometry = new THREE.BufferGeometry();\r\n        geometry.setIndex(Array.from(indices));\r\n        geometry.setAttribute(\r\n          \"position\",\r\n          new THREE.BufferAttribute(positions, 3)\r\n        );\r\n        geometry.setAttribute(\"normal\", new THREE.BufferAttribute(normals, 3));\r\n        geometry.userData.localId = sample.representation;\r\n        geometryList.set(sample.representation, geometry);\r\n      }\r\n\r\n      const geometry = geometryList.get(sample.representation);\r\n\r\n      // Local transform\r\n      const group = new THREE.Group();\r\n      group.userData.localId = sample.localTransform;\r\n      meshes.add(group);\r\n      group.applyMatrix4(localTransform);\r\n\r\n      // Sample\r\n      const mesh = new THREE.Mesh(geometry, material);\r\n      mesh.userData.sampleId = sampleId;\r\n      group.add(mesh);\r\n    }\r\n\r\n    return meshes;\r\n  }\r\n\r\n  async setMeshes(meshes: THREE.Group) {\r\n    // Compare new meshes with original meshes and generate requests\r\n    const pastMeshes = await this.getMeshes();\r\n\r\n    // Global transform\r\n\r\n    let sameGlobalTransform = true;\r\n\r\n    meshes.updateMatrix();\r\n    const p = 1000;\r\n    for (let i = 0; i < meshes.matrix.elements.length; i++) {\r\n      const element = Math.trunc(meshes.matrix.elements[i] * p) / p;\r\n      const pastElement = Math.trunc(pastMeshes.matrix.elements[i] * p) / p;\r\n      if (element !== pastElement) {\r\n        sameGlobalTransform = false;\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (!sameGlobalTransform) {\r\n      const gtId = parseInt(Object.keys(this.core.globalTransforms)[0], 10);\r\n      const gt = this.core.globalTransforms[gtId];\r\n      GeomsFbUtils.transformFromMatrix(meshes.matrix, gt);\r\n      this._elementChanged = true;\r\n      this.updateRequests[gtId] = {\r\n        type: EditRequestType.UPDATE_GLOBAL_TRANSFORM,\r\n        localId: gtId,\r\n        data: gt,\r\n      };\r\n    }\r\n\r\n    // Materials\r\n\r\n    const oldMaterials = new Map<number, THREE.MeshLambertMaterial>();\r\n    const newMaterials = new Map<number, THREE.MeshLambertMaterial>();\r\n\r\n    pastMeshes.traverse((object) => {\r\n      if (object instanceof THREE.Mesh) {\r\n        oldMaterials.set(object.material.userData.localId, object.material);\r\n      }\r\n    });\r\n\r\n    meshes.traverse((object) => {\r\n      if (object instanceof THREE.Mesh) {\r\n        newMaterials.set(object.material.userData.localId, object.material);\r\n      }\r\n    });\r\n\r\n    for (const [localId, oldMat] of oldMaterials) {\r\n      const newMat = newMaterials.get(localId);\r\n      if (!newMat) {\r\n        continue;\r\n      }\r\n\r\n      const oldR = oldMat.color.r;\r\n      const oldG = oldMat.color.g;\r\n      const oldB = oldMat.color.b;\r\n      const oldA = oldMat.opacity;\r\n      const newR = newMat.color.r;\r\n      const newG = newMat.color.g;\r\n      const newB = newMat.color.b;\r\n      const newA = newMat.opacity;\r\n\r\n      const matData = this.core.materials[localId];\r\n      matData.r = newR * 255;\r\n      matData.g = newG * 255;\r\n      matData.b = newB * 255;\r\n      matData.a = newA * 255;\r\n\r\n      if (oldR !== newR || oldG !== newG || oldB !== newB || oldA !== newA) {\r\n        this._elementChanged = true;\r\n\r\n        this.updateRequests[localId] = {\r\n          type: EditRequestType.UPDATE_MATERIAL,\r\n          localId,\r\n          data: matData,\r\n        };\r\n      }\r\n    }\r\n\r\n    oldMaterials.clear();\r\n    newMaterials.clear();\r\n\r\n    // Local transforms\r\n\r\n    const oldLocalTransforms = new Map<number, THREE.Matrix4>();\r\n    const newLocalTransforms = new Map<number, THREE.Matrix4>();\r\n\r\n    for (const group of meshes.children) {\r\n      group.updateMatrix();\r\n      newLocalTransforms.set(group.userData.localId, group.matrix);\r\n    }\r\n\r\n    for (const group of pastMeshes.children) {\r\n      oldLocalTransforms.set(group.userData.localId, group.matrix);\r\n    }\r\n\r\n    for (const [localId, oldLocalTransform] of oldLocalTransforms) {\r\n      const newLocalTransform = newLocalTransforms.get(localId);\r\n      if (!newLocalTransform) {\r\n        continue;\r\n      }\r\n      if (!oldLocalTransform.equals(newLocalTransform)) {\r\n        const lt = this.core.localTransforms[localId];\r\n        GeomsFbUtils.transformFromMatrix(newLocalTransform, lt);\r\n        this._elementChanged = true;\r\n        this.updateRequests[localId] = {\r\n          type: EditRequestType.UPDATE_LOCAL_TRANSFORM,\r\n          localId,\r\n          data: lt,\r\n        };\r\n      }\r\n    }\r\n\r\n    oldLocalTransforms.clear();\r\n    newLocalTransforms.clear();\r\n\r\n    // Representations\r\n\r\n    const oldGeoms = new Map<number, THREE.BufferGeometry>();\r\n    const newGeoms = new Map<number, THREE.BufferGeometry>();\r\n\r\n    meshes.traverse((object) => {\r\n      if (object instanceof THREE.Mesh) {\r\n        const geometry = object.geometry;\r\n        newGeoms.set(geometry.userData.localId, geometry);\r\n      }\r\n    });\r\n\r\n    pastMeshes.traverse((object) => {\r\n      if (object instanceof THREE.Mesh) {\r\n        const geometry = object.geometry;\r\n        oldGeoms.set(geometry.userData.localId, geometry);\r\n      }\r\n    });\r\n\r\n    for (const [localId, oldGeom] of oldGeoms) {\r\n      const repr = this.core.representations[localId];\r\n\r\n      // The element API doesn't automatically update circle extrusions representations\r\n      // that has to be done manually\r\n      if (\r\n        repr.representationClass === TFB.RepresentationClass.CIRCLE_EXTRUSION\r\n      ) {\r\n        continue;\r\n      }\r\n\r\n      const newGeom = newGeoms.get(localId);\r\n      if (!newGeom) {\r\n        continue;\r\n      }\r\n      let sameVertices = true;\r\n      const oldPosAttribute = oldGeom.getAttribute(\"position\");\r\n      const newPosAttribute = newGeom.getAttribute(\"position\");\r\n      if (oldPosAttribute && newPosAttribute) {\r\n        if (oldPosAttribute.count === newPosAttribute.count) {\r\n          for (let i = 0; i < oldPosAttribute.array.length; i++) {\r\n            if (oldPosAttribute.array[i] !== newPosAttribute.array[i]) {\r\n              sameVertices = false;\r\n              break;\r\n            }\r\n          }\r\n        } else {\r\n          sameVertices = false;\r\n        }\r\n      }\r\n      if (!sameVertices) {\r\n        GeomsFbUtils.representationFromGeometry(newGeom, repr);\r\n\r\n        this._elementChanged = true;\r\n\r\n        this.updateRequests[localId] = {\r\n          type: EditRequestType.UPDATE_REPRESENTATION,\r\n          localId,\r\n          data: repr,\r\n        };\r\n      }\r\n    }\r\n  }\r\n\r\n  createSamples(samples: RawSample[]) {\r\n    for (const sample of samples) {\r\n      const tempId = Math.trunc(performance.now());\r\n      this.core.samples[tempId] = sample;\r\n      this.createRequests[tempId] = {\r\n        type: EditRequestType.CREATE_SAMPLE,\r\n        data: sample,\r\n      };\r\n    }\r\n  }\r\n\r\n  deleteSamples(ids: number[]) {\r\n    this._elementChanged = true;\r\n    for (const id of ids) {\r\n      const count = Object.keys(this.core.samples).length;\r\n      if (count === 1) {\r\n        // Can't delete all samples of an item\r\n        continue;\r\n      }\r\n      delete this.core.samples[id];\r\n      delete this.updateRequests[id];\r\n      if (this.createRequests[id]) {\r\n        // Sample not created yet in fragments, so just remove it from here\r\n        delete this.createRequests[id];\r\n      } else {\r\n        // Sample already created, so delete it\r\n        this.removeRequests[id] = {\r\n          type: EditRequestType.DELETE_SAMPLE,\r\n          localId: id,\r\n        };\r\n      }\r\n    }\r\n  }\r\n\r\n  async updateSamples() {\r\n    // Update the core data to have just the data referenced by the samples\r\n\r\n    const matsToDelete = new Set<number>(\r\n      Object.keys(this.core.materials).map(Number)\r\n    );\r\n\r\n    const ltsToDelete = new Set<number>(\r\n      Object.keys(this.core.localTransforms).map(Number)\r\n    );\r\n\r\n    const gtsToDelete = new Set<number>(\r\n      Object.keys(this.core.globalTransforms).map(Number)\r\n    );\r\n\r\n    const repsToDelete = new Set<number>(\r\n      Object.keys(this.core.representations).map(Number)\r\n    );\r\n\r\n    const materialsToGet = new Set<number>();\r\n    const gtsToGet = new Set<number>();\r\n    const ltsToGet = new Set<number>();\r\n    const representationsToGet = new Set<number>();\r\n\r\n    const samplesToUpdate = new Set<number>();\r\n\r\n    for (const sampleIdStr in this.core.samples) {\r\n      const sampleId = parseInt(sampleIdStr, 10);\r\n      const sample = this.core.samples[sampleId];\r\n\r\n      matsToDelete.delete(sample.material);\r\n      gtsToDelete.delete(sample.item);\r\n      ltsToDelete.delete(sample.localTransform);\r\n      repsToDelete.delete(sample.representation);\r\n\r\n      if (!this.core.materials[sample.material]) {\r\n        samplesToUpdate.add(sampleId);\r\n        materialsToGet.add(sample.material);\r\n      }\r\n      if (!this.core.globalTransforms[sample.item]) {\r\n        samplesToUpdate.add(sampleId);\r\n        gtsToGet.add(sample.item);\r\n      }\r\n      if (!this.core.localTransforms[sample.localTransform]) {\r\n        samplesToUpdate.add(sampleId);\r\n        ltsToGet.add(sample.localTransform);\r\n      }\r\n      if (!this.core.representations[sample.representation]) {\r\n        samplesToUpdate.add(sampleId);\r\n        representationsToGet.add(sample.representation);\r\n      }\r\n    }\r\n\r\n    // Clean up data that is not used by samples anymore\r\n\r\n    for (const matId of matsToDelete) {\r\n      delete this.core.materials[matId];\r\n    }\r\n    for (const gtId of gtsToDelete) {\r\n      delete this.core.globalTransforms[gtId];\r\n    }\r\n    for (const ltId of ltsToDelete) {\r\n      delete this.core.localTransforms[ltId];\r\n    }\r\n    for (const repId of repsToDelete) {\r\n      delete this.core.representations[repId];\r\n    }\r\n\r\n    // Get the new data\r\n\r\n    let newMats = new Map<number, RawMaterial>();\r\n    if (materialsToGet.size) {\r\n      newMats = await this.model.getMaterials(materialsToGet);\r\n    }\r\n\r\n    let newGts = new Map<number, RawGlobalTransformData>();\r\n    if (gtsToGet.size) {\r\n      newGts = await this.model.getGlobalTransforms(gtsToGet);\r\n    }\r\n\r\n    let newLts = new Map<number, RawTransformData>();\r\n    if (ltsToGet.size) {\r\n      newLts = await this.model.getLocalTransforms(ltsToGet);\r\n    }\r\n\r\n    let newReps = new Map<number, RawRepresentation>();\r\n    if (representationsToGet.size) {\r\n      newReps = await this.model.getRepresentations(representationsToGet);\r\n    }\r\n\r\n    for (const [id, material] of newMats) {\r\n      this.core.materials[id] = material;\r\n    }\r\n\r\n    for (const [id, gt] of newGts) {\r\n      this.core.globalTransforms[id] = gt;\r\n    }\r\n\r\n    for (const [id, lt] of newLts) {\r\n      this.core.localTransforms[id] = lt;\r\n    }\r\n\r\n    for (const [id, rep] of newReps) {\r\n      this.core.representations[id] = rep;\r\n    }\r\n\r\n    // Generate the requests to update the samples\r\n\r\n    for (const sampleId of samplesToUpdate) {\r\n      if (this.createRequests[sampleId]) {\r\n        // This sample wasn't created in fragments yet, just update the create request\r\n        const createRequest = this.createRequests[\r\n          sampleId\r\n        ] as CreateSampleRequest;\r\n        createRequest.data = this.core.samples[sampleId];\r\n        continue;\r\n      }\r\n\r\n      this._elementChanged = true;\r\n\r\n      this.updateRequests[sampleId] = {\r\n        type: EditRequestType.UPDATE_SAMPLE,\r\n        localId: sampleId,\r\n        data: this.core.samples[sampleId],\r\n      };\r\n    }\r\n  }\r\n}\r\n","import { FragmentsModel } from \"./fragments-model\";\r\nimport * as EDIT from \"../../../Utils/edit\";\r\nimport { EditRequest } from \"../../../Utils\";\r\nimport { Element } from \"../edit\";\r\nimport { CurrentLod, MeshData } from \"./model-types\";\r\n\r\nexport class EditManager {\r\n  async edit(model: FragmentsModel, requests: EditRequest[]) {\r\n    return model.threads.invoke(model.modelId, \"edit\", [requests]) as Promise<{\r\n      deltaModelBuffer: Uint8Array;\r\n      ids: number[];\r\n    }>;\r\n  }\r\n\r\n  async reset(model: FragmentsModel) {\r\n    return model.threads.invoke(model.modelId, \"reset\", []) as Promise<void>;\r\n  }\r\n\r\n  async save(model: FragmentsModel): Promise<Uint8Array> {\r\n    return model.threads.invoke(\r\n      model.modelId,\r\n      \"save\",\r\n      [],\r\n    ) as Promise<Uint8Array>;\r\n  }\r\n\r\n  async getItemsGeometry(\r\n    model: FragmentsModel,\r\n    localIds: number[],\r\n    lod: CurrentLod,\r\n  ) {\r\n    const originalGeometries = (await model.threads.invoke(\r\n      model.modelId,\r\n      \"getItemsGeometry\",\r\n      [localIds, lod],\r\n    )) as MeshData[][];\r\n\r\n    const deltaModelId = model.deltaModelId;\r\n    if (!deltaModelId) {\r\n      return originalGeometries;\r\n    }\r\n\r\n    // If there are edited geometries, return them instead of the original ones\r\n\r\n    const deltaGeometries = (await model.threads.invoke(\r\n      deltaModelId,\r\n      \"getItemsGeometry\",\r\n      [localIds],\r\n    )) as MeshData[][];\r\n\r\n    const geomsByLocalId = new Map<number, MeshData[]>();\r\n    for (const geometry of originalGeometries) {\r\n      const localId = geometry[0].localId!;\r\n      geomsByLocalId.set(localId, geometry);\r\n    }\r\n\r\n    for (const geometry of deltaGeometries) {\r\n      const localId = geometry[0].localId!;\r\n      geomsByLocalId.set(localId, geometry);\r\n    }\r\n\r\n    return Array.from(geomsByLocalId.values());\r\n  }\r\n\r\n  async getGeometries(model: FragmentsModel, ids: number[]) {\r\n    const originalGeometries = (await model.threads.invoke(\r\n      model.modelId,\r\n      \"getGeometries\",\r\n      [ids],\r\n    )) as MeshData[];\r\n\r\n    const deltaModelId = model.deltaModelId;\r\n    if (!deltaModelId) {\r\n      return originalGeometries;\r\n    }\r\n\r\n    // If there are edited geometries, return them instead of the original ones\r\n\r\n    const deltaGeometries = (await model.threads.invoke(\r\n      deltaModelId,\r\n      \"getGeometries\",\r\n      [ids],\r\n    )) as MeshData[];\r\n\r\n    const geomsByReprId = new Map<number, MeshData>();\r\n    for (const geometry of originalGeometries) {\r\n      const reprId = geometry.representationId!;\r\n      geomsByReprId.set(reprId, geometry);\r\n    }\r\n\r\n    for (const geometry of deltaGeometries) {\r\n      const reprId = geometry.representationId!;\r\n      geomsByReprId.set(reprId, geometry);\r\n    }\r\n\r\n    return Array.from(geomsByReprId.values());\r\n  }\r\n\r\n  async getMaterialsIds(model: FragmentsModel) {\r\n    return model.threads.invoke(\r\n      model.modelId,\r\n      \"getMaterialsIds\",\r\n      [],\r\n    ) as Promise<number[]>;\r\n  }\r\n\r\n  async getMaterials(model: FragmentsModel, localIds?: Iterable<number>) {\r\n    return model.threads.invoke(model.modelId, \"getMaterials\", [\r\n      localIds,\r\n    ]) as Promise<Map<number, EDIT.RawMaterial>>;\r\n  }\r\n\r\n  async getSamplesIds(model: FragmentsModel) {\r\n    return model.threads.invoke(model.modelId, \"getSamplesIds\", []) as Promise<\r\n      number[]\r\n    >;\r\n  }\r\n\r\n  async getSamples(model: FragmentsModel, localIds?: Iterable<number>) {\r\n    return model.threads.invoke(model.modelId, \"getSamples\", [\r\n      localIds,\r\n    ]) as Promise<Map<number, EDIT.RawSample>>;\r\n  }\r\n\r\n  async getRepresentationsIds(model: FragmentsModel) {\r\n    return model.threads.invoke(\r\n      model.modelId,\r\n      \"getRepresentationsIds\",\r\n      [],\r\n    ) as Promise<number[]>;\r\n  }\r\n\r\n  async getRepresentations(model: FragmentsModel, localIds?: Iterable<number>) {\r\n    return model.threads.invoke(model.modelId, \"getRepresentations\", [\r\n      localIds,\r\n    ]) as Promise<Map<number, EDIT.RawRepresentation>>;\r\n  }\r\n\r\n  async getLocalTransformsIds(model: FragmentsModel) {\r\n    return model.threads.invoke(\r\n      model.modelId,\r\n      \"getLocalTransformsIds\",\r\n      [],\r\n    ) as Promise<number[]>;\r\n  }\r\n\r\n  async getLocalTransforms(model: FragmentsModel, localIds?: Iterable<number>) {\r\n    return model.threads.invoke(model.modelId, \"getLocalTransforms\", [\r\n      localIds,\r\n    ]) as Promise<Map<number, EDIT.RawTransformData>>;\r\n  }\r\n\r\n  async getGlobalTransformsIds(model: FragmentsModel) {\r\n    return model.threads.invoke(\r\n      model.modelId,\r\n      \"getGlobalTransformsIds\",\r\n      [],\r\n    ) as Promise<number[]>;\r\n  }\r\n\r\n  async getGlobalTransforms(\r\n    model: FragmentsModel,\r\n    localIds?: Iterable<number>,\r\n  ) {\r\n    return model.threads.invoke(model.modelId, \"getGlobalTransforms\", [\r\n      localIds,\r\n    ]) as Promise<Map<number, EDIT.RawGlobalTransformData>>;\r\n  }\r\n\r\n  async getItemsIds(model: FragmentsModel) {\r\n    return model.threads.invoke(model.modelId, \"getItemsIds\", []) as Promise<\r\n      number[]\r\n    >;\r\n  }\r\n\r\n  async getItems(model: FragmentsModel, localIds?: Iterable<number>) {\r\n    return model.threads.invoke(model.modelId, \"getItems\", [\r\n      localIds,\r\n    ]) as Promise<Map<number, EDIT.RawItemData>>;\r\n  }\r\n\r\n  async getRelations(model: FragmentsModel, localIds?: number[]) {\r\n    return model.threads.invoke(model.modelId, \"getRelations\", [\r\n      localIds,\r\n    ]) as Promise<Map<number, EDIT.RawRelationData>>;\r\n  }\r\n\r\n  async getGlobalTranformsIdsOfItems(model: FragmentsModel, ids: number[]) {\r\n    const items = (await model.threads.invoke(\r\n      model.modelId,\r\n      \"getGlobalTranformsIdsOfItems\",\r\n      [ids],\r\n    )) as number[];\r\n    // this.applyActions(editor, model, items, \"ITEM\");\r\n    return items;\r\n  }\r\n\r\n  async getEditedElements(model: FragmentsModel) {\r\n    if (!model.deltaModelId) {\r\n      return [];\r\n    }\r\n    return model.threads.invoke(\r\n      model.deltaModelId,\r\n      \"getItemsWithGeometry\",\r\n      [],\r\n    ) as Promise<number[]>;\r\n  }\r\n\r\n  async getElements(model: FragmentsModel, localIds: Iterable<number>) {\r\n    const itemsData = (await model.threads.invoke(\r\n      model.modelId,\r\n      \"getElementsData\",\r\n      [localIds],\r\n    )) as { [id: number]: EDIT.ElementData };\r\n\r\n    // Update meshes data, just get them from delta model\r\n    if (model.deltaModelId) {\r\n      const updatedItems = (await model.threads.invoke(\r\n        model.deltaModelId,\r\n        \"getElementsData\",\r\n        [localIds],\r\n      )) as { [id: number]: EDIT.ElementData };\r\n\r\n      for (const id in updatedItems) {\r\n        itemsData[id] = updatedItems[id];\r\n      }\r\n    }\r\n\r\n    const result: Element[] = [];\r\n    for (const id in itemsData) {\r\n      const element = new Element(Number(id), itemsData[id], model);\r\n      result.push(element);\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  async getRequests(model: FragmentsModel) {\r\n    return model.threads.invoke(model.modelId, \"getRequests\", []) as Promise<{\r\n      requests: EditRequest[];\r\n      undoneRequests: EditRequest[];\r\n    }>;\r\n  }\r\n\r\n  async setRequests(\r\n    model: FragmentsModel,\r\n    data: {\r\n      requests?: EditRequest[];\r\n      undoneRequests?: EditRequest[];\r\n    },\r\n  ) {\r\n    return model.threads.invoke(model.modelId, \"setRequests\", [\r\n      data,\r\n    ]) as Promise<void>;\r\n  }\r\n\r\n  async selectRequest(model: FragmentsModel, index: number) {\r\n    return model.threads.invoke(model.modelId, \"selectRequest\", [\r\n      index,\r\n    ]) as Promise<void>;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { FragmentsModel } from \"./fragments-model\";\r\nimport { GridData } from \"./model-types\";\r\n\r\nexport class GridsManager {\r\n  private model: FragmentsModel;\r\n\r\n  private _grids = new THREE.Group();\r\n\r\n  private _gridMaterial = new THREE.LineDashedMaterial({\r\n    color: 0xffffff,\r\n    linewidth: 5,\r\n    depthTest: false,\r\n    dashSize: 1,\r\n    gapSize: 0.3,\r\n  });\r\n\r\n  constructor(model: FragmentsModel) {\r\n    this.model = model;\r\n  }\r\n\r\n  async getGrids() {\r\n    if (!this._grids.children.length) {\r\n      await this.constructGrids();\r\n    }\r\n    return this._grids;\r\n  }\r\n\r\n  private async constructGrids() {\r\n    const result = (await this.model.threads.invoke(\r\n      this.model.modelId,\r\n      \"getGrids\",\r\n    )) as GridData[];\r\n\r\n    const tempMatrix = new THREE.Matrix4();\r\n\r\n    for (const gridData of result) {\r\n      const grid = new THREE.Group();\r\n      this._grids.add(grid);\r\n      grid.userData.id = gridData.id;\r\n      tempMatrix.fromArray(gridData.transform);\r\n      grid.applyMatrix4(tempMatrix);\r\n      this.getGridAxis(gridData, grid, \"uAxes\");\r\n      this.getGridAxis(gridData, grid, \"vAxes\");\r\n      this.getGridAxis(gridData, grid, \"wAxes\");\r\n      this._grids.add(grid);\r\n    }\r\n  }\r\n\r\n  private getGridAxis(\r\n    gridData: GridData,\r\n    grid: THREE.Group<THREE.Object3DEventMap>,\r\n    axis: \"uAxes\" | \"vAxes\" | \"wAxes\",\r\n  ) {\r\n    for (const { curve, tag } of gridData[axis]) {\r\n      const [x1, y1, x2, y2] = curve;\r\n      const geometry = new THREE.BufferGeometry();\r\n      geometry.setAttribute(\r\n        \"position\",\r\n        new THREE.BufferAttribute(new Float32Array([x1, y1, 0, x2, y2, 0]), 3),\r\n      );\r\n      const axisLine = new THREE.Line(geometry, this._gridMaterial);\r\n      axisLine.userData.tag = tag;\r\n      axisLine.computeLineDistances();\r\n      axisLine.renderOrder = 1;\r\n      grid.add(axisLine);\r\n    }\r\n  }\r\n\r\n  dispose() {\r\n    this._grids.removeFromParent();\r\n    for (const grid of this._grids.children) {\r\n      const line = grid as THREE.Mesh;\r\n      line.geometry.dispose();\r\n      line.geometry = undefined as any;\r\n      line.material = undefined as any;\r\n    }\r\n    this._gridMaterial.dispose();\r\n    this._gridMaterial = undefined as any;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport {\r\n  BIMMesh,\r\n  MaterialDefinition,\r\n  ItemsDataConfig,\r\n  RectangleRaycastData,\r\n  RaycastData,\r\n  SnappingRaycastData,\r\n  VirtualModelConfig,\r\n  ItemSelectionType,\r\n  ItemInformationType,\r\n  SelectionInputType,\r\n  ResultInputType,\r\n  AttrsChange,\r\n  Identifier,\r\n  RelsChange,\r\n  ItemsQueryParams,\r\n  AttributesUniqueValuesParams,\r\n  CurrentLod,\r\n  ItemsQueryConfig,\r\n  LodMode,\r\n} from \"./model-types\";\r\n\r\nimport { MiscHelper } from \"../utils\";\r\nimport { FragmentsConnection } from \"../multithreading/fragments-connection\";\r\nimport { MeshManager } from \"./mesh-manager\";\r\n\r\nimport { AlignmentsManager } from \"./alignments-manager\";\r\nimport { DataMap, EditRequest, Event } from \"../../../Utils\";\r\nimport { SetupManager } from \"./setup-manager\";\r\nimport { BoxManager } from \"./box-manager\";\r\nimport { CoordinatesManager } from \"./coordinates-manager\";\r\nimport { ItemsManager } from \"./items-manager\";\r\nimport { ViewManager } from \"./view-manager\";\r\nimport { RaycastManager } from \"./raycast-manager\";\r\nimport { VisibilityManager } from \"./visibility-manager\";\r\nimport { HighlightManager } from \"./highlight-manager\";\r\nimport { SectionManager } from \"./section-manager\";\r\nimport { DataManager } from \"./data-manager\";\r\nimport { SequenceManager } from \"./sequence-manager\";\r\nimport { EditManager } from \"./edit-manager\";\r\nimport { Editor } from \"../edit\";\r\nimport { GridsManager } from \"./grids-manager\";\r\n\r\n/**\r\n * The main class for managing a 3D model loaded from a fragments file. Handles geometry, materials, visibility, highlighting, sections, and more. This class orchestrates multiple specialized managers to handle different aspects of the model like mesh management, item data, raycasting, etc. It maintains the overall state and provides the main interface for interacting with the model. The model data is loaded and processed asynchronously across multiple threads.\r\n */\r\nexport class FragmentsModel {\r\n  /**\r\n   * A map of attribute changes that have occurred in the model.\r\n   * The key is the local ID of the item, and the value is the change.\r\n   */\r\n  readonly attrsChanges = new Map<number, AttrsChange>();\r\n\r\n  /**\r\n   * A map of relation changes that have occurred in the model.\r\n   * The key is the local ID of the item, and the value is the change.\r\n   */\r\n  readonly relsChanges = new Map<number, RelsChange>();\r\n\r\n  /**\r\n   * The connection to the threads that handle the model data.\r\n   */\r\n  readonly threads: FragmentsConnection;\r\n\r\n  /**\r\n   * A map of tiles that have been loaded for the model.\r\n   * The key is the tile ID, and the value is the tile.\r\n   */\r\n  readonly tiles = new DataMap<string | number, BIMMesh>();\r\n\r\n  /**\r\n   * Event triggered after a view update cycle finishes processing.\r\n   * Listeners receive this FragmentsModel instance, allowing queries\r\n   * like {@link getItemsByVisibility} to retrieve seen/unseen elements.\r\n   */\r\n  readonly onViewUpdated = new Event<FragmentsModel>();\r\n\r\n  /**\r\n   * A set of item IDs that are currently visible (i.e. have at least\r\n   * one tile rendered on screen). Updated automatically as tiles are\r\n   * created and deleted by the mesh manager.\r\n   */\r\n  readonly visibleItems = new Set<number>();\r\n\r\n  /**\r\n   * The object that represents the model in the Three.js scene.\r\n   */\r\n  object = new THREE.Object3D();\r\n\r\n  /**\r\n   * The graphics quality of the model. It ranges from 0 (lowest) to 1 (highest).\r\n   */\r\n  graphicsQuality = 0;\r\n\r\n  deltaModelId: string | null = null;\r\n\r\n  private readonly _boxManager = new BoxManager();\r\n  private readonly _itemsManager = new ItemsManager();\r\n  private readonly _coordinatesManager = new CoordinatesManager();\r\n  private readonly _setupManager = new SetupManager();\r\n  private readonly _viewManager = new ViewManager();\r\n  private readonly _raycastManager = new RaycastManager();\r\n  private readonly _visibilityManager = new VisibilityManager();\r\n  private readonly _highlightManager = new HighlightManager();\r\n  private readonly _sectionManager = new SectionManager();\r\n  private readonly _dataManager = new DataManager();\r\n  private readonly _sequenceManager = new SequenceManager();\r\n  private readonly _bbox = new THREE.Box3();\r\n  private readonly _alignmentsManager: AlignmentsManager;\r\n  private readonly _gridsManager: GridsManager;\r\n  private readonly _meshManager: MeshManager;\r\n  private readonly _editManager = new EditManager();\r\n  private readonly _editor: Editor;\r\n\r\n  private _isProcessing = false;\r\n  private _isLoaded = false;\r\n  private _frozen = false;\r\n  private _isSetup = false;\r\n\r\n  private static _deltaModelId = \"isDeltaModel\";\r\n  private _parentModelId: string | null = null;\r\n\r\n  /**\r\n   * The ID of the model.\r\n   */\r\n  get modelId() {\r\n    return this.object.name;\r\n  }\r\n\r\n  /**\r\n   * The bounding box of the whole model.\r\n   */\r\n  get box() {\r\n    return this._bbox.clone().applyMatrix4(this.object.matrixWorld);\r\n  }\r\n\r\n  /**\r\n   * Whether the model is busy loading data.\r\n   */\r\n  get isBusy() {\r\n    const arePendingRequests = this._meshManager.requests.arePending;\r\n    return !this._isLoaded || this._isProcessing || arePendingRequests;\r\n  }\r\n\r\n  /**\r\n   * Whether the model should stop updating..\r\n   */\r\n  get frozen() {\r\n    return Boolean(this._frozen);\r\n  }\r\n\r\n  /**\r\n   * Whether the model should stop updating..\r\n   */\r\n  set frozen(value: boolean) {\r\n    if (value === this._frozen) return;\r\n    this._frozen = value;\r\n    if (value) return;\r\n    this._refreshView();\r\n  }\r\n\r\n  /**\r\n   * The event that is triggered when the clipping planes are needed in the thread.\r\n   * Set this method to pass your Three.js clipping planes to the model.\r\n   */\r\n  get getClippingPlanesEvent() {\r\n    return this._viewManager.getClippingPlanesEvent;\r\n  }\r\n\r\n  /**\r\n   * The event that is triggered when the clipping planes are needed in the thread.\r\n   * Set this method to pass your Three.js clipping planes to the model.\r\n   */\r\n  set getClippingPlanesEvent(value: () => THREE.Plane[]) {\r\n    this._viewManager.getClippingPlanesEvent = value;\r\n  }\r\n\r\n  get camera() {\r\n    return this._viewManager.currentCamera;\r\n  }\r\n\r\n  get isDeltaModel() {\r\n    return this.object.userData[FragmentsModel._deltaModelId];\r\n  }\r\n\r\n  get parentModelId() {\r\n    return this._parentModelId;\r\n  }\r\n\r\n  /**\r\n   * The constructor of the fragments model. Don't use this directly. Use the {@link FragmentsModels.load} instead.\r\n   */\r\n  constructor(\r\n    modelId: string,\r\n    meshManager: MeshManager,\r\n    threads: FragmentsConnection,\r\n    editor: Editor,\r\n  ) {\r\n    this.object.name = modelId;\r\n    this.object.up.set(0, 0, 1);\r\n    this._meshManager = meshManager;\r\n    this.threads = threads;\r\n    this._editor = editor;\r\n    this._alignmentsManager = new AlignmentsManager(this);\r\n    this._gridsManager = new GridsManager(this);\r\n    this.tiles.onItemSet.add(({ value: mesh }) => this.object.add(mesh));\r\n    this.tiles.onBeforeDelete.add(({ value: mesh }) => {\r\n      this.object.remove(mesh);\r\n      mesh.geometry.dispose();\r\n      MiscHelper.forEach(mesh.material, (mat) => mat.dispose());\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Dispose the model. Use this when you're done with the model.\r\n   * If you use the {@link FragmentsModels.dispose} method, this will be called automatically for all models.\r\n   */\r\n  async dispose() {\r\n    this._isLoaded = false;\r\n    this.visibleItems.clear();\r\n    this.onViewUpdated.reset();\r\n    await this._dataManager.dispose(\r\n      this,\r\n      this._meshManager,\r\n      this._alignmentsManager,\r\n      this._gridsManager,\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get the spatial structure of the model.\r\n   */\r\n  async getSpatialStructure() {\r\n    return this._dataManager.getSpatialStructure(this);\r\n  }\r\n\r\n  /**\r\n   * Get the local IDs corresponding to the specified GUIDs.\r\n   * @param guids - Array of GUIDs to look up.\r\n   */\r\n  async getLocalIdsByGuids(guids: string[]) {\r\n    return this._dataManager.getLocalIdsByGuids(this, guids);\r\n  }\r\n\r\n  /**\r\n   * Get all the categories of the model.\r\n   */\r\n  async getCategories() {\r\n    return this._dataManager.getCategories(this);\r\n  }\r\n\r\n  async getItemsWithGeometryCategories() {\r\n    return this._dataManager.getItemsWithGeometryCategories(this);\r\n  }\r\n\r\n  /**\r\n   * Get all the items of the model that have geometry.\r\n   */\r\n  async getItemsWithGeometry() {\r\n    return this._dataManager.getItemsWithGeometry(this);\r\n  }\r\n\r\n  /**\r\n   * Get all the items ids of the model that have geometry.\r\n   */\r\n  async getItemsIdsWithGeometry() {\r\n    return this._dataManager.getItemsIdsWithGeometry(this);\r\n  }\r\n\r\n  /**\r\n   * Get the metadata of the model.\r\n   */\r\n  async getMetadata<T extends Record<string, any> = Record<string, any>>() {\r\n    return this._dataManager.getMetadata<T>(this);\r\n  }\r\n\r\n  /**\r\n   * Get the Coordinate Reference System (CRS) data of the model, if available.\r\n   * Returns null if the source IFC file did not contain IFCPROJECTEDCRS\r\n   * or IFCCOORDINATEREFERENCESYSTEM entities.\r\n   */\r\n  async getCRS() {\r\n    return this._dataManager.getCRS(this);\r\n  }\r\n\r\n  /**\r\n   * Get the GUIDs corresponding to the specified local IDs.\r\n   * @param localIds - Array of local IDs to look up.\r\n   */\r\n  async getGuidsByLocalIds(localIds: number[]) {\r\n    return this._dataManager.getGuidsByLocalIds(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Get the buffer of the model.\r\n   * @param raw - Whether to get the raw buffer. If false, it will be compressed.\r\n   */\r\n  async getBuffer(raw = false) {\r\n    return this._dataManager.getBuffer(this, raw);\r\n  }\r\n\r\n  /**\r\n   * Get a buffer containing only the specified items and their associated geometry.\r\n   * @param localIds - The local IDs of the items to include.\r\n   * @param raw - Whether to get the raw buffer. If false, it will be compressed.\r\n   */\r\n  async getSubsetBuffer(localIds: number[], raw = false) {\r\n    return this.threads.invoke(this.modelId, \"getSubsetBuffer\", [\r\n      localIds,\r\n      raw,\r\n    ]);\r\n  }\r\n\r\n  /**\r\n   * Get all the items of the model that belong to the specified category.\r\n   * @param category - The category to look up.\r\n   */\r\n  async getItemsOfCategories(categories: RegExp[]) {\r\n    return this._dataManager.getItemsOfCategories(this, categories);\r\n  }\r\n\r\n  async getGuids() {\r\n    const guids = (await this.threads.invoke(\r\n      this.modelId,\r\n      \"getGuids\",\r\n      [],\r\n    )) as string[];\r\n    return guids;\r\n  }\r\n\r\n  /**\r\n   * Get all the local IDs of the model.\r\n   */\r\n  async getLocalIds() {\r\n    const localIds = (await this.threads.invoke(\r\n      this.modelId,\r\n      \"getLocalIds\",\r\n      [],\r\n    )) as number[];\r\n    return localIds;\r\n  }\r\n\r\n  /**\r\n   * Retrieves items based on the specified query parameters.\r\n   *\r\n   * @param params - The query parameters used to filter and retrieve items.\r\n   * @param config - Optional query configuration.\r\n   * @returns A promise that resolves to the items matching the query.\r\n   */\r\n  async getItemsByQuery(params: ItemsQueryParams, config?: ItemsQueryConfig) {\r\n    return this._dataManager.getItemsByQuery(this, params, config);\r\n  }\r\n\r\n  // TODO: Fix, this is wrong\r\n  async getItemsMaterialDefinition(localIds: number[]) {\r\n    const result = (await this.threads.invoke(\r\n      this.modelId,\r\n      \"getItemsMaterialDefinition\",\r\n      [localIds],\r\n    )) as { definition: MaterialDefinition; localIds: number[] }[];\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Retrieves the geometry data for the specified local IDs.\r\n   *\r\n   * The returned data is structured as an array of arrays of `MeshData`,\r\n   * which contains the necessary information to reconstruct a `THREE.BufferGeometry`.\r\n   *\r\n   * @param localIds - An array of local IDs for which the geometry data is requested.\r\n   * @param lod - The level of detail for the geometry (optional).\r\n   */\r\n  async getItemsGeometry(localIds: number[], lod = CurrentLod.GEOMETRY) {\r\n    return this._editManager.getItemsGeometry(this, localIds, lod);\r\n  }\r\n\r\n  async getGeometries(ids: number[]) {\r\n    return this._editManager.getGeometries(this, ids);\r\n  }\r\n\r\n  /**\r\n   * Retrieves the total volume of items based on their local IDs.\r\n   *\r\n   * @param localIds An array of local IDs representing the items.\r\n   * @returns A promise that resolves to the total volume of the specified items.\r\n   */\r\n  async getItemsVolume(localIds: number[]) {\r\n    const volume = (await this.threads.invoke(this.modelId, \"getItemsVolume\", [\r\n      localIds,\r\n    ])) as number;\r\n    return volume;\r\n  }\r\n\r\n  /**\r\n   * Retrieves the names of all attributes associated with the model.\r\n   *\r\n   * @returns A promise that resolves to an array of strings, where each string is the name of an attribute.\r\n   */\r\n  async getAttributeNames() {\r\n    const names = (await this.threads.invoke(\r\n      this.modelId,\r\n      \"getAttributeNames\",\r\n      [],\r\n    )) as string[];\r\n    return names;\r\n  }\r\n\r\n  /**\r\n   * Retrieves the attribute values associated with the model.\r\n   *\r\n   * @returns A promise that resolves to an array of attribute values.\r\n   */\r\n  async getAttributeValues() {\r\n    const values = (await this.threads.invoke(\r\n      this.modelId,\r\n      \"getAttributeValues\",\r\n      [],\r\n    )) as any[];\r\n    return values;\r\n  }\r\n\r\n  async getAttributesUniqueValues(params: AttributesUniqueValuesParams[]) {\r\n    const values = (await this.threads.invoke(\r\n      this.modelId,\r\n      \"getAttributesUniqueValues\",\r\n      [params],\r\n    )) as Record<string, { value: any, localIds: number[] }[]>;\r\n    return values;\r\n  }\r\n\r\n  /**\r\n   * Retrieves the attribute types associated with the model.\r\n   *\r\n   * @returns A promise that resolves to an array of attribute types.\r\n   */\r\n  async getAttributeTypes() {\r\n    const types = (await this.threads.invoke(\r\n      this.modelId,\r\n      \"getAttributeTypes\",\r\n      [],\r\n    )) as string[];\r\n    return types;\r\n  }\r\n\r\n  /**\r\n   * Retrieves the names of all relations associated with this model.\r\n   *\r\n   * @returns A promise that resolves to an array of strings, where each string is the name of a relation.\r\n   */\r\n  async getRelationNames() {\r\n    const names = (await this.threads.invoke(\r\n      this.modelId,\r\n      \"getRelationNames\",\r\n      [],\r\n    )) as string[];\r\n    return names;\r\n  }\r\n\r\n  /**\r\n   * Get the maximum local ID of the model.\r\n   */\r\n  async getMaxLocalId() {\r\n    return this._dataManager.getMaxLocalId(this);\r\n  }\r\n\r\n  /**\r\n   * Get an item by its ID.\r\n   * @param id - The ID of the item to look up.\r\n   */\r\n  getItem(id: Identifier) {\r\n    return this._itemsManager.getItem(this, id);\r\n  }\r\n\r\n  /**\r\n   * Get the spatial structure children of the specified items.\r\n   * @param ids - The IDs of the items to look up.\r\n   */\r\n  async getItemsChildren(ids: Identifier[]) {\r\n    return this._itemsManager.getItemsChildren(this, ids);\r\n  }\r\n\r\n  /**\r\n   * Get all the data of the specified items.\r\n   *\r\n   * By default, the API returns the item’s built-in attributes only.\r\n   * Relations are not traversed unless explicitly enabled via the `config`\r\n   * parameter.\r\n   *\r\n   * @param ids - The IDs of the items to look up.\r\n   * @param config - The configuration of the items data. By default, all\r\n   * built-in attributes are returned and no relations are loaded.\r\n   *\r\n   * @example\r\n   * // Retrieve all built-in attributes and all related entities (full graph)\r\n   * await getItemsData(ids, {\r\n   *   attributesDefault: true,\r\n   *   relationsDefault: { attributes: true, relations: true },\r\n   * });\r\n   *\r\n   * @example\r\n   * // Retrieve built-in attributes and Property Sets only (via IsDefinedBy)\r\n   * await getItemsData(ids, {\r\n   *   attributesDefault: true,\r\n   *   relations: {\r\n   *     IsDefinedBy: { attributes: true, relations: true },\r\n   *     DefinesOccurrence: { attributes: false, relations: false },\r\n   *   },\r\n   * });\r\n   */\r\n  async getItemsData(ids: Identifier[], config?: Partial<ItemsDataConfig>) {\r\n    return this._itemsManager.getItemsData(this, ids, config);\r\n  }\r\n\r\n  /**\r\n   * Get the absolute positions of the specified items.\r\n   * @param localIds - The local IDs of the items to look up.\r\n   */\r\n  async getPositions(localIds?: number[]) {\r\n    return this._coordinatesManager.getPositions(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets coordinates of the model.\r\n   */\r\n  async getCoordinates() {\r\n    return this._coordinatesManager.getCoordinates(this);\r\n  }\r\n\r\n  /**\r\n   * Retrieves the coordination matrix for the current model.\r\n   *\r\n   * This method utilizes the `_coordinatesManager` to compute and return a\r\n   * `THREE.Matrix4` object based on the original model coordinates.\r\n   */\r\n  async getCoordinationMatrix() {\r\n    return this._coordinatesManager.getCoordinationMatrix(this);\r\n  }\r\n\r\n  /**\r\n   * Get the merged bounding box of the specified items.\r\n   * @param localIds - The local IDs of the items to look up.\r\n   */\r\n  async getMergedBox(localIds: number[]) {\r\n    return this._boxManager.getMergedBox(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Get the individual bounding boxes of the specified items.\r\n   * @param localIds - The local IDs of the items to look up.\r\n   */\r\n  async getBoxes(localIds?: number[]) {\r\n    return this._boxManager.getBoxes(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Get the absolute alignments of the model (if any).\r\n   */\r\n  async getAlignments() {\r\n    return this._alignmentsManager.getAlignments();\r\n  }\r\n\r\n  /**\r\n   * Get the horizontal alignments of the model (if any).\r\n   */\r\n  async getHorizontalAlignments() {\r\n    return this._alignmentsManager.getHorizontalAlignments();\r\n  }\r\n\r\n  /**\r\n   * Get the vertical alignments of the model (if any).\r\n   */\r\n  async getVerticalAlignments() {\r\n    return this._alignmentsManager.getVerticalAlignments();\r\n  }\r\n\r\n  /**\r\n   * Get the civil alignment styles of the model (if any).\r\n   */\r\n  getAlignmentStyles() {\r\n    return this._alignmentsManager.getAlignmentStyles();\r\n  }\r\n\r\n  /**\r\n   * Get the grids of the model (if any).\r\n   */\r\n  async getGrids() {\r\n    return this._gridsManager.getGrids();\r\n  }\r\n\r\n  /**\r\n   * Sets a camera for the model. The model will use it to load tiles dinamically depending on the users view\r\n   * (e.g. hiding items that are not in the view, setting the LOD to far away items, etc).\r\n   * @param camera - The camera to use.\r\n   */\r\n  useCamera(camera: THREE.PerspectiveCamera | THREE.OrthographicCamera) {\r\n    this._viewManager.useCamera(camera);\r\n  }\r\n\r\n  /**\r\n   * Sets the LOD / culling mode of the model.\r\n   * @param lodMode - The LOD / culling mode to set.\r\n   */\r\n  async setLodMode(lodMode: LodMode) {\r\n    return this._viewManager.setLodMode(this, lodMode);\r\n  }\r\n\r\n  /**\r\n   * Performs a rectangle raycast on the model.\r\n   * @param data - The data of the rectangle raycast.\r\n   */\r\n  async rectangleRaycast(data: RectangleRaycastData) {\r\n    return this._raycastManager.rectangleRaycast(this, this._meshManager, data);\r\n  }\r\n\r\n  /**\r\n   * Performs a raycast on the model.\r\n   * @param data - The data of the raycast.\r\n   */\r\n  async raycast(data: RaycastData) {\r\n    return this._raycastManager.raycast(this, data);\r\n  }\r\n\r\n  /**\r\n   * Performs a raycast on the model and returns all the results.\r\n   * @param data - The data of the raycast.\r\n   */\r\n  async raycastAll(data: RaycastData) {\r\n    return this._raycastManager.raycastAll(this, data);\r\n  }\r\n\r\n  /**\r\n   * Performs a raycast on the model with snapping.\r\n   * @param data - The data of the raycast.\r\n   */\r\n  async raycastWithSnapping(data: SnappingRaycastData) {\r\n    return this._raycastManager.raycastWithSnapping(this, data);\r\n  }\r\n\r\n  /**\r\n   * Sets the visibility of the specified items.\r\n   * @param localIds - The local IDs of the items to set the visibility of.\r\n   * @param visible - Whether the items should be visible.\r\n   */\r\n  async setVisible(localIds: number[] | undefined, visible: boolean) {\r\n    const args = [localIds, visible];\r\n    await this.threads.invoke(this.modelId, \"setVisible\", args);\r\n  }\r\n\r\n  /**\r\n   * Toggles the visibility of the specified items.\r\n   * @param localIds - The local IDs of the items to toggle the visibility of.\r\n   */\r\n  async toggleVisible(localIds?: number[]) {\r\n    const args = [localIds];\r\n    await this.threads.invoke(this.modelId, \"toggleVisible\", args);\r\n  }\r\n\r\n  /**\r\n   * Gets the items by visibility.\r\n   * @param visible - Whether the items should be visible.\r\n   */\r\n  async getItemsByVisibility(visible: boolean) {\r\n    return this._visibilityManager.getItemsByVisibility(this, visible);\r\n  }\r\n\r\n  /**\r\n   * Gets the items by visibility.\r\n   * @param localIds - The local IDs of the items to get the visibility of.\r\n   */\r\n  async getVisible(localIds: number[]) {\r\n    return this._visibilityManager.getVisible(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Resets the visibility of all items.\r\n   */\r\n  async resetVisible() {\r\n    return this._visibilityManager.resetVisible(this);\r\n  }\r\n\r\n  /**\r\n   * Highlights the specified items.\r\n   * @param localIds - The local IDs of the items to highlight. If undefined, all items will be highlighted.\r\n   * @param highlightMaterial - The material to use for the highlight.\r\n   */\r\n  async highlight(\r\n    localIds: number[] | undefined,\r\n    highlightMaterial: MaterialDefinition,\r\n  ) {\r\n    return this._highlightManager.highlight(this, localIds, highlightMaterial);\r\n  }\r\n\r\n  /**\r\n   * Applies a color to the specified items while preserving original material properties.\r\n   * @param localIds - The local IDs of the items to color. If undefined, all items will be colored.\r\n   * @param color - The color to apply.\r\n   */\r\n  async setColor(\r\n    localIds: number[] | undefined,\r\n    color: MaterialDefinition[\"color\"],\r\n  ) {\r\n    return this._highlightManager.setColor(this, localIds, color);\r\n  }\r\n\r\n  /**\r\n   * Resets the color of the specified items to their original color while preserving other highlight properties (like opacity).\r\n   * @param localIds - The local IDs of the items to reset color for. If undefined, all items will be affected.\r\n   */\r\n  async resetColor(localIds: number[] | undefined) {\r\n    return this._highlightManager.resetColor(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Applies an opacity to the specified items while preserving original material properties (like color).\r\n   * @param localIds - The local IDs of the items to change opacity for. If undefined, all items will be affected.\r\n   * @param opacity - The opacity to apply (0 to 1).\r\n   */\r\n  async setOpacity(localIds: number[] | undefined, opacity: number) {\r\n    return this._highlightManager.setOpacity(this, localIds, opacity);\r\n  }\r\n\r\n  /**\r\n   * Resets the opacity of the specified items to their original opacity while preserving other highlight properties (like color).\r\n   * @param localIds - The local IDs of the items to reset opacity for. If undefined, all items will be affected.\r\n   */\r\n  async resetOpacity(localIds: number[] | undefined) {\r\n    return this._highlightManager.resetOpacity(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets the highlight of the specified items.\r\n   * @param localIds - The local IDs of the items to get the highlight of. If undefined, it will return the highlight of all items.\r\n   */\r\n  async getHighlight(localIds?: number[]) {\r\n    return this._highlightManager.getHighlight(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Resets the highlight of the specified items.\r\n   * @param localIds - The local IDs of the items to reset the highlight of. If undefined, it will reset the highlight of all items.\r\n   */\r\n  async resetHighlight(localIds?: number[]) {\r\n    return this._highlightManager.resetHighlight(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets the item IDs of the items that are highlighted.\r\n   */\r\n  async getHighlightItemIds() {\r\n    return this._highlightManager.getHighlightItemIds(this);\r\n  }\r\n\r\n  /**\r\n   * Gets the section (edges and fills) between the model and a given clipping plane.\r\n   * @param plane - The plane to get the section of.\r\n   * @param localIds - The local IDs of the items to get the section of. If undefined, it will return the section of all items.\r\n   */\r\n  async getSection(plane: THREE.Plane, localIds?: number[]) {\r\n    return this._sectionManager.getSection(this, plane, localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets all the materials IDs of the model.\r\n   */\r\n  async getMaterialsIds() {\r\n    return this._editManager.getMaterialsIds(this);\r\n  }\r\n\r\n  /**\r\n   * Gets the materials of the model.\r\n   * @param localIds - The local IDs of the materials to get. If undefined, it will return all materials.\r\n   */\r\n  async getMaterials(localIds?: Iterable<number>) {\r\n    return this._editManager.getMaterials(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets all the representations IDs of the model.\r\n   */\r\n  async getRepresentationsIds() {\r\n    return this._editManager.getRepresentationsIds(this);\r\n  }\r\n\r\n  /**\r\n   * Gets the representations of the model.\r\n   * @param localIds - The local IDs of the representations to get. If undefined, it will return all representations.\r\n   */\r\n  async getRepresentations(localIds?: Iterable<number>) {\r\n    return this._editManager.getRepresentations(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets all the local transforms IDs of the model.\r\n   */\r\n  async getLocalTransformsIds() {\r\n    return this._editManager.getLocalTransformsIds(this);\r\n  }\r\n\r\n  /**\r\n   * Gets the local transforms of the model.\r\n   * @param localIds - The local IDs of the local transforms to get. If undefined, it will return all local transforms.\r\n   */\r\n  async getLocalTransforms(localIds?: Iterable<number>) {\r\n    return this._editManager.getLocalTransforms(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets all the global transforms IDs of the model.\r\n   */\r\n  async getGlobalTransformsIds() {\r\n    return this._editManager.getGlobalTransformsIds(this);\r\n  }\r\n\r\n  /**\r\n   * Gets the global transforms of the model.\r\n   * @param localIds - The local IDs of the global transforms to get. If undefined, it will return all global transforms.\r\n   */\r\n  async getGlobalTransforms(localIds?: Iterable<number>) {\r\n    return this._editManager.getGlobalTransforms(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets all the samples IDs of the model.\r\n   */\r\n  async getSamplesIds() {\r\n    return this._editManager.getSamplesIds(this);\r\n  }\r\n\r\n  /**\r\n   * Gets the samples of the model.\r\n   * @param localIds - The local IDs of the samples to get. If undefined, it will return all samples.\r\n   */\r\n  async getSamples(localIds?: Iterable<number>) {\r\n    return this._editManager.getSamples(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets all the items IDs of the model.\r\n   */\r\n  async getItemsIds() {\r\n    return this._editManager.getItemsIds(this);\r\n  }\r\n\r\n  /**\r\n   * Gets the items of the model.\r\n   * @param localIds - The local IDs of the items to get. If undefined, it will return all items.\r\n   */\r\n  async getItems(localIds?: Iterable<number>) {\r\n    return this._editManager.getItems(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets the relations of the model.\r\n   * @param localIds - The local IDs of the relations to get. If undefined, it will return all relations.\r\n   */\r\n  async getRelations(localIds?: number[]) {\r\n    return this._editManager.getRelations(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets the global transforms IDs of the items of the model.\r\n   * @param ids - The local IDs of the items to get the global transforms IDs of.\r\n   */\r\n  async getGlobalTranformsIdsOfItems(ids: number[]) {\r\n    return this._editManager.getGlobalTranformsIdsOfItems(this, ids);\r\n  }\r\n\r\n  /**\r\n   * Gets the edited elements of the model.\r\n   */\r\n  async getEditedElements() {\r\n    return this._editManager.getEditedElements(this);\r\n  }\r\n\r\n  /**\r\n   * Processes a sequence of actions in the worker and computes the result based on the provided input.\r\n   *\r\n   * @param result - The type of item information to compute, used to select the appropriate result function.\r\n   * @param fromItems - An array of selection types, each corresponding to an items selector function.\r\n   * @param input - The initial input data to be processed by the sequence of actions.\r\n   * @returns The computed result after processing the sequence of actions, or `null` if the result function is not found.\r\n   * @experimental\r\n   */\r\n  async getSequenced<\r\n    T extends ItemInformationType,\r\n    U extends ItemSelectionType,\r\n  >(\r\n    result: T,\r\n    fromItems: U[],\r\n    inputs?: {\r\n      selector?: Partial<Record<U, SelectionInputType<U>>>;\r\n      result?: ResultInputType<T>;\r\n    },\r\n  ) {\r\n    return this._sequenceManager.getSequenced(this, result, fromItems, inputs);\r\n  }\r\n\r\n  async handleRequest(request: any) {\r\n    await this._meshManager.requests.handleRequest(this._meshManager, request);\r\n  }\r\n\r\n  async _getElements(localIds: Iterable<number>) {\r\n    return this._editManager.getElements(this, localIds);\r\n  }\r\n\r\n  /**\r\n   * Internal method to finish processing. Don't use this directly.\r\n   */\r\n  _finishProcessing() {\r\n    this._isProcessing = false;\r\n    this.onViewUpdated.trigger(this);\r\n  }\r\n\r\n  _setDeltaModel(modelId: string) {\r\n    this.object.userData[FragmentsModel._deltaModelId] = true;\r\n    this._parentModelId = modelId;\r\n  }\r\n\r\n  /**\r\n   * Internal method to refresh the view of the model. You shouldn't call this directly. Instead, use {@link FragmentsModels.update}.\r\n   */\r\n  async _refreshView() {\r\n    if (this.frozen) return;\r\n    this._isProcessing = true;\r\n    const mainPromise = this._viewManager.refreshView(this, this._meshManager);\r\n    const deltaPromise = this._editor._update(this.modelId);\r\n    await Promise.all([mainPromise, deltaPromise]);\r\n  }\r\n\r\n  /**\r\n   * Internal method to set up the model. Don't use this directly.\r\n   */\r\n  async _setup(\r\n    data: ArrayBuffer | Uint8Array,\r\n    raw?: boolean,\r\n    config?: VirtualModelConfig,\r\n  ) {\r\n    if (this._isSetup) return;\r\n    await this._setupManager.setup(this, this._bbox, data, raw, config);\r\n    this._isLoaded = true;\r\n    this._isProcessing = true;\r\n    this._isSetup = true;\r\n  }\r\n\r\n  /**\r\n   * Internal method to edit the model. Don't use this directly.\r\n   * @param requests - The requests to edit the model.\r\n   */\r\n  async _edit(requests: EditRequest[]) {\r\n    return this._editManager.edit(this, requests);\r\n  }\r\n\r\n  /**\r\n   * Internal method to reset the model. Don't use this directly.\r\n   */\r\n  async _reset() {\r\n    return this._editManager.reset(this);\r\n  }\r\n\r\n  /**\r\n   * Internal method to save the model. Don't use this directly.\r\n   */\r\n  async _save() {\r\n    return this._editManager.save(this);\r\n  }\r\n\r\n  /**\r\n   * Internal method to get the requests of the model. Don't use this directly.\r\n   */\r\n  async _getRequests() {\r\n    return this._editManager.getRequests(this);\r\n  }\r\n\r\n  /**\r\n   * Internal method to set the requests of the model. Don't use this directly.\r\n   * @param data - The data to set the requests of the model.\r\n   */\r\n  async _setRequests(data: {\r\n    requests?: EditRequest[];\r\n    undoneRequests?: EditRequest[];\r\n  }) {\r\n    return this._editManager.setRequests(this, data);\r\n  }\r\n\r\n  /**\r\n   * Internal method to select a request of the model. Don't use this directly.\r\n   * @param index - The index of the request to select.\r\n   */\r\n  async _selectRequest(index: number) {\r\n    return this._editManager.selectRequest(this, index);\r\n  }\r\n}\r\n","import { MultiThreadingRequestClass, TileRequestClass } from \"./model-types\";\r\nimport { MaterialManager } from \"./material-manager\";\r\nimport { MeshManager } from \"./mesh-manager\";\r\n\r\n/**\r\n * Manages a list of requests for the MeshManager.\r\n */\r\nexport class RequestsManager {\r\n  /**\r\n   * List of requests.\r\n   */\r\n  readonly list: any[] = [];\r\n\r\n  /**\r\n   * Checks if there are any pending requests.\r\n   *\r\n   * @returns `true` if there are pending requests, otherwise `false`.\r\n   */\r\n  get arePending() {\r\n    return this.list.length > 0;\r\n  }\r\n\r\n  /**\r\n   * Callback function to be invoked when a request with `TileRequestClass.FINISH` is added.\r\n   */\r\n  onFinish = () => {};\r\n\r\n  async handleRequest(meshes: MeshManager, request: any) {\r\n    if (request.class === MultiThreadingRequestClass.RECOMPUTE_MESHES) {\r\n      this.add(request.list);\r\n      request.list = undefined;\r\n    } else if (request.class === MultiThreadingRequestClass.CREATE_MATERIAL) {\r\n      const { materialDefinitions, modelId } = request;\r\n      MaterialManager.resetColors(materialDefinitions);\r\n      meshes.materials.addDefinitions(modelId, materialDefinitions);\r\n      request.materialDefinitions = undefined;\r\n    } else if (request.class === MultiThreadingRequestClass.THROW_ERROR) {\r\n      console.error(request);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Adds an array of requests to the list. If a request with `TileRequestClass.FINISH` is added,\r\n   * the `onFinishRequest` callback is invoked.\r\n   *\r\n   * @param requests - Array of requests to be added.\r\n   */\r\n  add(requests: any[]) {\r\n    for (const request of requests) {\r\n      if (!this.insert(request)) this.list.push(request);\r\n      if (request.tileRequestClass === TileRequestClass.FINISH) {\r\n        this.onFinish();\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Cleans the list by removing requests with the specified model ID and `TileRequestClass.FINISH`.\r\n   *\r\n   * @param modelID - The model ID to filter requests by.\r\n   */\r\n  clean(modelID: string) {\r\n    const list = this.list.filter(\r\n      (request) =>\r\n        request.modelId !== modelID ||\r\n        request.tileRequestClass !== TileRequestClass.FINISH,\r\n    );\r\n    (this.list as any) = list;\r\n  }\r\n\r\n  /**\r\n   * Inserts a request into the list based on its `tileRequestClass`.\r\n   *\r\n   * @param request - The request to be inserted.\r\n   * @returns `true` if the request was successfully inserted, otherwise `false`.\r\n   */\r\n  insert(request: any) {\r\n    const { modelId, tileId, tileRequestClass, tileData } = request;\r\n    if (tileId === undefined) return false;\r\n\r\n    if (tileRequestClass === TileRequestClass.DELETE) {\r\n      const list = this.list.filter(\r\n        (request) =>\r\n          !(\r\n            (request.tileRequestClass === TileRequestClass.CREATE ||\r\n              request.tileRequestClass === TileRequestClass.DELETE) &&\r\n            request.modelId === modelId &&\r\n            request.tileId === tileId\r\n          ),\r\n      );\r\n      (this.list as any) = list;\r\n    }\r\n\r\n    if (tileRequestClass === TileRequestClass.CREATE) {\r\n      const list = this.list.filter(\r\n        (request) =>\r\n          !(\r\n            request.tileRequestClass === TileRequestClass.CREATE &&\r\n            request.modelId === modelId &&\r\n            request.tileId === tileId\r\n          ),\r\n      );\r\n      (this.list as any) = list;\r\n    }\r\n\r\n    if (tileRequestClass === TileRequestClass.UPDATE) {\r\n      const overriddenRequest = this.list.find(\r\n        (request) => request.modelId === modelId && request.tileId === tileId,\r\n      );\r\n      if (overriddenRequest) {\r\n        if (\r\n          overriddenRequest.tileRequestClass === TileRequestClass.CREATE ||\r\n          overriddenRequest.tileRequestClass === TileRequestClass.UPDATE\r\n        )\r\n          overriddenRequest.tileData = tileData;\r\n        return true;\r\n      }\r\n    }\r\n\r\n    return false;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { LODGeometry, LODMesh } from \"../lod\";\r\nimport { LodHelper } from \"../lod/lod-helper\";\r\nimport { BIMMesh, CurrentLod } from \"./model-types\";\r\nimport { MaterialManager } from \"./material-manager\";\r\n\r\nexport class LODManager {\r\n  private _materials: MaterialManager;\r\n  // TODO: Deduplicate with other white values\r\n  private readonly white = 0xffffffff;\r\n\r\n  constructor(materials: MaterialManager) {\r\n    this._materials = materials;\r\n  }\r\n\r\n  createMesh(geometry: THREE.BufferGeometry, request: any) {\r\n    const material = this._materials.getFromRequest(request);\r\n    if (!(\"isLodMaterial\" in material && material.isLodMaterial)) {\r\n      throw new Error(\"Fragments: material is not an instance of LodMaterial.\");\r\n    }\r\n\r\n    const { positions } = request;\r\n    if (!positions) {\r\n      throw new Error(\r\n        \"Fragments: no positions provided to create the LOD mesh.\",\r\n      );\r\n    }\r\n\r\n    const lodGeometry = new LODGeometry();\r\n    const deleteEvent = this.deleteAttributeEvent(geometry);\r\n    LodHelper.setLodBuffer(lodGeometry, positions, deleteEvent);\r\n    const mesh = new LODMesh(lodGeometry, [material]);\r\n    return mesh;\r\n  }\r\n\r\n  updateVisibility(mesh: LODMesh, status: any) {\r\n    const { geometry } = mesh;\r\n    const { visibilityData, highlightData } = status;\r\n    LodHelper.setLodVisibility(geometry, visibilityData);\r\n    if (highlightData) {\r\n      LodHelper.setLodHighlight(geometry, highlightData);\r\n    }\r\n    geometry.addGroup(0, Infinity, 0);\r\n  }\r\n\r\n  applyHighlight(mesh: LODMesh, request: any) {\r\n    const {\r\n      tileData: { highlightIds },\r\n      modelId,\r\n      material: index,\r\n    } = request;\r\n\r\n    const material = mesh.material[0];\r\n    const definition = this._materials.getHighlightProps(\r\n      highlightIds[0],\r\n      index,\r\n      modelId,\r\n    );\r\n    if (!definition) return;\r\n\r\n    const color = new THREE.Color(definition.color);\r\n    material.highlightColor = color;\r\n    material.highlightOpacity = definition.opacity;\r\n    material.transparent = definition.opacity < 1 || material.transparent;\r\n  }\r\n\r\n  processMesh(mesh: BIMMesh, request: any) {\r\n    const { geometry } = mesh;\r\n    const {\r\n      tileData: { visibilityData },\r\n      currentLod,\r\n    } = request;\r\n    if (currentLod === CurrentLod.WIRES && mesh instanceof LODMesh) {\r\n      this.updateVisibility(mesh, request.tileData);\r\n    } else if (visibilityData && visibilityData.position.length > 0) {\r\n      for (let i = 0; i < visibilityData.position.length; ++i) {\r\n        const isWhite = visibilityData.size[i] === this.white;\r\n        const position = visibilityData.position[i];\r\n        const value = isWhite ? Infinity : visibilityData.size[i];\r\n        geometry.addGroup(position, value, 0);\r\n      }\r\n    }\r\n  }\r\n\r\n  private deleteAttributeEvent(_geometry: THREE.BufferGeometry) {\r\n    function callback(this: any) {\r\n      delete this.array;\r\n    }\r\n    return callback;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { MaterialManager } from \"./material-manager\";\r\nimport {\r\n  TileRequestClass,\r\n  ObjectClass,\r\n  CurrentLod,\r\n  BIMMesh,\r\n} from \"./model-types\";\r\nimport { FragmentsModel } from \"./fragments-model\";\r\nimport { DataMap } from \"../../../Utils\";\r\nimport { RequestsManager } from \"./requests-manager\";\r\nimport { LODManager } from \"./lod-manager\";\r\nimport { LODMesh } from \"../lod\";\r\n\r\n/**\r\n * A class that manages the creation and updating of meshes in a Fragments model.\r\n */\r\nexport class MeshManager {\r\n  /**\r\n   * A map of FragmentsModel instances by their model ID.\r\n   */\r\n  readonly list = new DataMap<string, FragmentsModel>();\r\n  readonly materials = new MaterialManager();\r\n  readonly lod = new LODManager(this.materials);\r\n  readonly requests = new RequestsManager();\r\n\r\n  private readonly updateThreshold = 4;\r\n\r\n  private _updateFinished = true;\r\n  private _onUpdate: () => void;\r\n\r\n  constructor(onUpdate: () => void) {\r\n    this._onUpdate = onUpdate;\r\n    this.requests.onFinish = () => (this._updateFinished = true);\r\n  }\r\n\r\n  async forceUpdateFinish(rate = 200, buffer = 500) {\r\n    let finished = false;\r\n    while (!finished) {\r\n      await new Promise<void>((resolve) => {\r\n        this._updateFinished = false;\r\n        const interval = setInterval(() => {\r\n          this.update();\r\n          if (!this._updateFinished) return;\r\n          clearInterval(interval);\r\n          resolve();\r\n        }, rate);\r\n      });\r\n      // Extra buffer to ensure the update finished\r\n      await new Promise((resolve) => {\r\n        setTimeout(resolve, buffer);\r\n      });\r\n      finished = this._updateFinished;\r\n    }\r\n  }\r\n\r\n  update() {\r\n    const start = performance.now();\r\n    while (this.requests.arePending) {\r\n      const request = this.requests.list.shift();\r\n      if (!request) continue;\r\n      this.processTileRequest(request);\r\n      this._onUpdate();\r\n      if (performance.now() - start > this.updateThreshold) return;\r\n    }\r\n  }\r\n\r\n  private setTileData(mesh: BIMMesh, request: any) {\r\n    const { tileId, itemId, matrix, aabb } = request;\r\n    this.setMeshData(mesh, tileId, itemId, matrix);\r\n    this.setupBoundings(mesh, aabb);\r\n    this.updateStatus(mesh, request);\r\n  }\r\n\r\n  private processTileRequest(request: any) {\r\n    const { tileRequestClass, tileId, modelId } = request;\r\n    const model = this.list.get(modelId);\r\n    if (!model) return;\r\n    if (tileRequestClass === TileRequestClass.CREATE) {\r\n      if (request.objectClass === undefined) return;\r\n      const tile = this.create(request);\r\n      this.setTileData(tile, request);\r\n      const uniqueIds = this.extractUniqueItemIds(request.itemIds);\r\n      tile.userData.itemIds = uniqueIds;\r\n      this.trackVisibleItems(model, uniqueIds, true);\r\n      model.tiles.set(tile.userData.tileId, tile);\r\n    } else if (tileRequestClass === TileRequestClass.DELETE) {\r\n      const tile = model.tiles.get(tileId);\r\n      if (tile?.userData.itemIds) {\r\n        this.trackVisibleItems(model, tile.userData.itemIds, false);\r\n      }\r\n      model.tiles.delete(tileId);\r\n    } else if (tileRequestClass === TileRequestClass.UPDATE) {\r\n      const tileObject = model.tiles.get(tileId);\r\n      if (tileObject) this.updateStatus(tileObject, request);\r\n    } else if (tileRequestClass === TileRequestClass.FINISH) {\r\n      model._finishProcessing();\r\n    }\r\n  }\r\n\r\n  private extractUniqueItemIds(itemIds: any): Set<number> {\r\n    const unique = new Set<number>();\r\n    if (!itemIds) return unique;\r\n    for (let i = 0; i < itemIds.length; i++) {\r\n      unique.add(itemIds[i]);\r\n    }\r\n    return unique;\r\n  }\r\n\r\n  private trackVisibleItems(\r\n    model: FragmentsModel,\r\n    itemIds: Set<number>,\r\n    added: boolean,\r\n  ) {\r\n    for (const itemId of itemIds) {\r\n      if (added) {\r\n        model.visibleItems.add(itemId);\r\n      } else {\r\n        model.visibleItems.delete(itemId);\r\n      }\r\n    }\r\n  }\r\n\r\n  private createMesh(request: any) {\r\n    const { indices, positions, normals, itemIds, faceIds } = request;\r\n    const geometry = new THREE.BufferGeometry();\r\n    this.setIndex(geometry, indices);\r\n    this.setPositions(positions, geometry);\r\n    this.setNormals(normals, geometry);\r\n    this.setItemIds(itemIds, geometry);\r\n    this.setFaceIds(faceIds, geometry);\r\n    const material = this.materials.getFromRequest(request);\r\n    return new THREE.Mesh(geometry, [material]);\r\n  }\r\n\r\n  private setupBoundings(mesh: BIMMesh, aabb: any) {\r\n    const { geometry } = mesh;\r\n    const box = new THREE.Box3().copy(aabb);\r\n    const sphere = new THREE.Sphere();\r\n    box.getBoundingSphere(sphere);\r\n    geometry.boundingBox = box;\r\n    geometry.boundingSphere = sphere;\r\n  }\r\n\r\n  private create(request: any): BIMMesh {\r\n    if (request.objectClass === ObjectClass.SHELL)\r\n      return this.createMesh(request);\r\n    if (request.objectClass === ObjectClass.LINE) {\r\n      const geometry = new THREE.BufferGeometry();\r\n      return this.lod.createMesh(geometry, request);\r\n    }\r\n    throw new Error(\r\n      `Fragments: object class ${request.objectClass} is not supported.`,\r\n    );\r\n  }\r\n\r\n  private updateStatus(mesh: BIMMesh, request: any) {\r\n    const {\r\n      tileData: { highlightData },\r\n      currentLod,\r\n    } = request;\r\n\r\n    const { geometry } = mesh;\r\n    geometry.clearGroups();\r\n    this.lod.processMesh(mesh, request);\r\n\r\n    if (!highlightData) return;\r\n\r\n    if (currentLod === CurrentLod.WIRES) {\r\n      this.lod.applyHighlight(mesh as LODMesh, request);\r\n      return;\r\n    }\r\n\r\n    const materials = this.materials.createHighlights(mesh, request);\r\n    mesh.material = materials;\r\n  }\r\n\r\n  private cleanAttributeMemory(geometry: THREE.BufferGeometry, name: string) {\r\n    const attr = geometry.attributes[name] as THREE.BufferAttribute;\r\n    attr.onUpload(this.deleteAttribute(geometry));\r\n  }\r\n\r\n  private setPositions(positions: any, geometry: THREE.BufferGeometry) {\r\n    if (!positions) {\r\n      throw new Error(\"Fragments: no positions provided to create the mesh.\");\r\n    }\r\n    geometry.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\r\n    this.cleanAttributeMemory(geometry, \"position\");\r\n  }\r\n\r\n  private setFaceIds(faceIds: any, geometry: THREE.BufferGeometry) {\r\n    if (faceIds) {\r\n      geometry.setAttribute(\"color\", new THREE.BufferAttribute(faceIds, 3));\r\n      this.cleanAttributeMemory(geometry, \"color\");\r\n    }\r\n  }\r\n\r\n  private setIndex(geometry: THREE.BufferGeometry, indices: any) {\r\n    if (!indices) {\r\n      throw new Error(\"Fragments: no indices provided to create the mesh.\");\r\n    }\r\n    geometry.setIndex(new THREE.BufferAttribute(indices, 1));\r\n    geometry.index!.onUpload(this.deleteAttribute(geometry));\r\n  }\r\n\r\n  private setNormals(normals: any, geometry: THREE.BufferGeometry) {\r\n    if (normals) {\r\n      geometry.setAttribute(\r\n        \"normal\",\r\n        new THREE.BufferAttribute(normals, 3, true),\r\n      );\r\n    }\r\n    this.cleanAttributeMemory(geometry, \"normal\");\r\n  }\r\n\r\n  private setItemIds(itemIds: any, geometry: THREE.BufferGeometry) {\r\n    if (itemIds) {\r\n      geometry.setAttribute(\"id\", new THREE.BufferAttribute(itemIds, 1, false));\r\n      this.cleanAttributeMemory(geometry, \"id\");\r\n    }\r\n  }\r\n\r\n  private deleteAttribute(_geometry: THREE.BufferGeometry) {\r\n    function callback(this: any) {\r\n      delete this.array;\r\n    }\r\n    return callback;\r\n  }\r\n\r\n  private setMeshData(mesh: BIMMesh, tileId: any, itemId: any, matrix: any) {\r\n    mesh.userData = { tileId, itemId };\r\n    mesh.matrixAutoUpdate = false;\r\n    mesh.applyMatrix4(matrix);\r\n    mesh.matrix.copy(matrix);\r\n  }\r\n}\r\n","// Split strategy constants\nexport const CENTER = 0;\nexport const AVERAGE = 1;\nexport const SAH = 2;\n\n// Traversal constants\nexport const NOT_INTERSECTED = 0;\nexport const INTERSECTED = 1;\nexport const CONTAINED = 2;\n\n// SAH cost constants\n// TODO: hone these costs more. The relative difference between them should be the\n// difference in measured time to perform a primitive intersection vs traversing\n// bounds.\n// TODO: could be tuned per primitive type (triangles vs lines vs points)\nexport const PRIMITIVE_INTERSECT_COST = 1.25;\nexport const TRAVERSAL_COST = 1;\n\n\n// Build constants\nexport const BYTES_PER_NODE = 6 * 4 + 4 + 4;\nexport const UINT32_PER_NODE = BYTES_PER_NODE / 4;\nexport const IS_LEAFNODE_FLAG = 0xFFFF;\n\n// Bit masks for 32 bit node data\nexport const LEAFNODE_MASK_32 = IS_LEAFNODE_FLAG << 16;\n\n// EPSILON for computing floating point error during build\n// https://en.wikipedia.org/wiki/Machine_epsilon#Values_for_standard_hardware_floating_point_arithmetics\nexport const FLOAT32_EPSILON = Math.pow( 2, - 24 );\n\nexport const SKIP_GENERATION = Symbol( 'SKIP_GENERATION' );\n\nexport const DEFAULT_OPTIONS = {\n\tstrategy: CENTER,\n\tmaxDepth: 40,\n\tmaxLeafSize: 10,\n\tuseSharedArrayBuffer: false,\n\tsetBoundingBox: true,\n\tonProgress: null,\n\tindirect: false,\n\tverbose: true,\n\trange: null,\n\t[ SKIP_GENERATION ]: false,\n};\n\n","export function arrayToBox( nodeIndex32, array, target ) {\n\n\ttarget.min.x = array[ nodeIndex32 ];\n\ttarget.min.y = array[ nodeIndex32 + 1 ];\n\ttarget.min.z = array[ nodeIndex32 + 2 ];\n\n\ttarget.max.x = array[ nodeIndex32 + 3 ];\n\ttarget.max.y = array[ nodeIndex32 + 4 ];\n\ttarget.max.z = array[ nodeIndex32 + 5 ];\n\n\treturn target;\n\n}\n\nexport function makeEmptyBounds( target ) {\n\n\ttarget[ 0 ] = target[ 1 ] = target[ 2 ] = Infinity;\n\ttarget[ 3 ] = target[ 4 ] = target[ 5 ] = - Infinity;\n\n}\n\nexport function getLongestEdgeIndex( bounds ) {\n\n\tlet splitDimIdx = - 1;\n\tlet splitDist = - Infinity;\n\n\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\tconst dist = bounds[ i + 3 ] - bounds[ i ];\n\t\tif ( dist > splitDist ) {\n\n\t\t\tsplitDist = dist;\n\t\t\tsplitDimIdx = i;\n\n\t\t}\n\n\t}\n\n\treturn splitDimIdx;\n\n}\n\n// copies bounds a into bounds b\nexport function copyBounds( source, target ) {\n\n\ttarget.set( source );\n\n}\n\n// sets bounds target to the union of bounds a and b\nexport function unionBounds( a, b, target ) {\n\n\tlet aVal, bVal;\n\tfor ( let d = 0; d < 3; d ++ ) {\n\n\t\tconst d3 = d + 3;\n\n\t\t// set the minimum values\n\t\taVal = a[ d ];\n\t\tbVal = b[ d ];\n\t\ttarget[ d ] = aVal < bVal ? aVal : bVal;\n\n\t\t// set the max values\n\t\taVal = a[ d3 ];\n\t\tbVal = b[ d3 ];\n\t\ttarget[ d3 ] = aVal > bVal ? aVal : bVal;\n\n\t}\n\n}\n\n// expands the given bounds by the provided primitive bounds\nexport function expandByPrimitiveBounds( startIndex, primitiveBounds, bounds ) {\n\n\tfor ( let d = 0; d < 3; d ++ ) {\n\n\t\tconst tCenter = primitiveBounds[ startIndex + 2 * d ];\n\t\tconst tHalf = primitiveBounds[ startIndex + 2 * d + 1 ];\n\n\t\tconst tMin = tCenter - tHalf;\n\t\tconst tMax = tCenter + tHalf;\n\n\t\tif ( tMin < bounds[ d ] ) {\n\n\t\t\tbounds[ d ] = tMin;\n\n\t\t}\n\n\t\tif ( tMax > bounds[ d + 3 ] ) {\n\n\t\t\tbounds[ d + 3 ] = tMax;\n\n\t\t}\n\n\t}\n\n}\n\n// compute bounds surface area\nexport function computeSurfaceArea( bounds ) {\n\n\tconst d0 = bounds[ 3 ] - bounds[ 0 ];\n\tconst d1 = bounds[ 4 ] - bounds[ 1 ];\n\tconst d2 = bounds[ 5 ] - bounds[ 2 ];\n\n\treturn 2 * ( d0 * d1 + d1 * d2 + d2 * d0 );\n\n}\n","import { IS_LEAFNODE_FLAG, UINT32_PER_NODE } from '../Constants.js';\n\nexport function IS_LEAF( n16, uint16Array ) {\n\n\treturn uint16Array[ n16 + 15 ] === IS_LEAFNODE_FLAG;\n\n}\n\nexport function OFFSET( n32, uint32Array ) {\n\n\treturn uint32Array[ n32 + 6 ];\n\n}\n\nexport function COUNT( n16, uint16Array ) {\n\n\treturn uint16Array[ n16 + 14 ];\n\n}\n\n// Returns the uint32-aligned offset of the left child node for performance\nexport function LEFT_NODE( n32 ) {\n\n\treturn n32 + UINT32_PER_NODE;\n\n}\n\n// Returns the uint32-aligned offset of the right child node for performance\nexport function RIGHT_NODE( n32, uint32Array ) {\n\n\t// stored value is relative offset from parent, convert to absolute uint32 index\n\tconst relativeOffset = uint32Array[ n32 + 6 ];\n\treturn n32 + relativeOffset * UINT32_PER_NODE;\n\n}\n\nexport function SPLIT_AXIS( n32, uint32Array ) {\n\n\treturn uint32Array[ n32 + 7 ];\n\n}\n\nexport function BOUNDING_DATA_INDEX( n32 ) {\n\n\treturn n32;\n\n}\n","// computes the union of the bounds of all of the given primitives and puts the resulting box in \"target\".\n// A bounding box is computed for the centroids of the primitives, as well, and placed in \"centroidTarget\".\n// These are computed together to avoid redundant accesses to bounds array.\nexport function getBounds( primitiveBounds, offset, count, target, centroidTarget ) {\n\n\tlet minx = Infinity;\n\tlet miny = Infinity;\n\tlet minz = Infinity;\n\tlet maxx = - Infinity;\n\tlet maxy = - Infinity;\n\tlet maxz = - Infinity;\n\n\tlet cminx = Infinity;\n\tlet cminy = Infinity;\n\tlet cminz = Infinity;\n\tlet cmaxx = - Infinity;\n\tlet cmaxy = - Infinity;\n\tlet cmaxz = - Infinity;\n\n\tconst boundsOffset = primitiveBounds.offset || 0;\n\tfor ( let i = ( offset - boundsOffset ) * 6, end = ( offset + count - boundsOffset ) * 6; i < end; i += 6 ) {\n\n\t\tconst cx = primitiveBounds[ i + 0 ];\n\t\tconst hx = primitiveBounds[ i + 1 ];\n\t\tconst lx = cx - hx;\n\t\tconst rx = cx + hx;\n\t\tif ( lx < minx ) minx = lx;\n\t\tif ( rx > maxx ) maxx = rx;\n\t\tif ( cx < cminx ) cminx = cx;\n\t\tif ( cx > cmaxx ) cmaxx = cx;\n\n\t\tconst cy = primitiveBounds[ i + 2 ];\n\t\tconst hy = primitiveBounds[ i + 3 ];\n\t\tconst ly = cy - hy;\n\t\tconst ry = cy + hy;\n\t\tif ( ly < miny ) miny = ly;\n\t\tif ( ry > maxy ) maxy = ry;\n\t\tif ( cy < cminy ) cminy = cy;\n\t\tif ( cy > cmaxy ) cmaxy = cy;\n\n\t\tconst cz = primitiveBounds[ i + 4 ];\n\t\tconst hz = primitiveBounds[ i + 5 ];\n\t\tconst lz = cz - hz;\n\t\tconst rz = cz + hz;\n\t\tif ( lz < minz ) minz = lz;\n\t\tif ( rz > maxz ) maxz = rz;\n\t\tif ( cz < cminz ) cminz = cz;\n\t\tif ( cz > cmaxz ) cmaxz = cz;\n\n\t}\n\n\ttarget[ 0 ] = minx;\n\ttarget[ 1 ] = miny;\n\ttarget[ 2 ] = minz;\n\n\ttarget[ 3 ] = maxx;\n\ttarget[ 4 ] = maxy;\n\ttarget[ 5 ] = maxz;\n\n\tcentroidTarget[ 0 ] = cminx;\n\tcentroidTarget[ 1 ] = cminy;\n\tcentroidTarget[ 2 ] = cminz;\n\n\tcentroidTarget[ 3 ] = cmaxx;\n\tcentroidTarget[ 4 ] = cmaxy;\n\tcentroidTarget[ 5 ] = cmaxz;\n\n}\n","import { getLongestEdgeIndex, computeSurfaceArea, copyBounds, unionBounds, expandByPrimitiveBounds } from '../../utils/ArrayBoxUtilities.js';\nimport { CENTER, AVERAGE, SAH, PRIMITIVE_INTERSECT_COST, TRAVERSAL_COST } from '../Constants.js';\n\nconst BIN_COUNT = 32;\nconst binsSort = ( a, b ) => a.candidate - b.candidate;\nconst sahBins = /* @__PURE__ */ new Array( BIN_COUNT ).fill().map( () => {\n\n\treturn {\n\n\t\tcount: 0,\n\t\tbounds: new Float32Array( 6 ),\n\t\trightCacheBounds: new Float32Array( 6 ),\n\t\tleftCacheBounds: new Float32Array( 6 ),\n\t\tcandidate: 0,\n\n\t};\n\n} );\nconst leftBounds = /* @__PURE__ */ new Float32Array( 6 );\n\nexport function getOptimalSplit( nodeBoundingData, centroidBoundingData, primitiveBounds, offset, count, strategy ) {\n\n\tlet axis = - 1;\n\tlet pos = 0;\n\n\t// Center\n\tif ( strategy === CENTER ) {\n\n\t\taxis = getLongestEdgeIndex( centroidBoundingData );\n\t\tif ( axis !== - 1 ) {\n\n\t\t\tpos = ( centroidBoundingData[ axis ] + centroidBoundingData[ axis + 3 ] ) / 2;\n\n\t\t}\n\n\t} else if ( strategy === AVERAGE ) {\n\n\t\taxis = getLongestEdgeIndex( nodeBoundingData );\n\t\tif ( axis !== - 1 ) {\n\n\t\t\tpos = getAverage( primitiveBounds, offset, count, axis );\n\n\t\t}\n\n\t} else if ( strategy === SAH ) {\n\n\t\tconst rootSurfaceArea = computeSurfaceArea( nodeBoundingData );\n\t\tlet bestCost = PRIMITIVE_INTERSECT_COST * count;\n\n\t\t// iterate over all axes\n\t\tconst boundsOffset = primitiveBounds.offset || 0;\n\t\tconst cStart = ( offset - boundsOffset ) * 6;\n\t\tconst cEnd = ( offset + count - boundsOffset ) * 6;\n\t\tfor ( let a = 0; a < 3; a ++ ) {\n\n\t\t\tconst axisLeft = centroidBoundingData[ a ];\n\t\t\tconst axisRight = centroidBoundingData[ a + 3 ];\n\t\t\tconst axisLength = axisRight - axisLeft;\n\t\t\tconst binWidth = axisLength / BIN_COUNT;\n\n\t\t\t// If we have fewer primitives than we're planning to split then just check all\n\t\t\t// the primitive positions because it will be faster.\n\t\t\tif ( count < BIN_COUNT / 4 ) {\n\n\t\t\t\t// initialize the bin candidates\n\t\t\t\tconst truncatedBins = [ ...sahBins ];\n\t\t\t\ttruncatedBins.length = count;\n\n\t\t\t\t// set the candidates\n\t\t\t\tlet b = 0;\n\t\t\t\tfor ( let c = cStart; c < cEnd; c += 6, b ++ ) {\n\n\t\t\t\t\tconst bin = truncatedBins[ b ];\n\t\t\t\t\tbin.candidate = primitiveBounds[ c + 2 * a ];\n\t\t\t\t\tbin.count = 0;\n\n\t\t\t\t\tconst {\n\t\t\t\t\t\tbounds,\n\t\t\t\t\t\tleftCacheBounds,\n\t\t\t\t\t\trightCacheBounds,\n\t\t\t\t\t} = bin;\n\t\t\t\t\tfor ( let d = 0; d < 3; d ++ ) {\n\n\t\t\t\t\t\trightCacheBounds[ d ] = Infinity;\n\t\t\t\t\t\trightCacheBounds[ d + 3 ] = - Infinity;\n\n\t\t\t\t\t\tleftCacheBounds[ d ] = Infinity;\n\t\t\t\t\t\tleftCacheBounds[ d + 3 ] = - Infinity;\n\n\t\t\t\t\t\tbounds[ d ] = Infinity;\n\t\t\t\t\t\tbounds[ d + 3 ] = - Infinity;\n\n\t\t\t\t\t}\n\n\t\t\t\t\texpandByPrimitiveBounds( c, primitiveBounds, bounds );\n\n\t\t\t\t}\n\n\t\t\t\ttruncatedBins.sort( binsSort );\n\n\t\t\t\t// remove redundant splits\n\t\t\t\tlet splitCount = count;\n\t\t\t\tfor ( let bi = 0; bi < splitCount; bi ++ ) {\n\n\t\t\t\t\tconst bin = truncatedBins[ bi ];\n\t\t\t\t\twhile ( bi + 1 < splitCount && truncatedBins[ bi + 1 ].candidate === bin.candidate ) {\n\n\t\t\t\t\t\ttruncatedBins.splice( bi + 1, 1 );\n\t\t\t\t\t\tsplitCount --;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// find the appropriate bin for each primitive and expand the bounds.\n\t\t\t\tfor ( let c = cStart; c < cEnd; c += 6 ) {\n\n\t\t\t\t\tconst center = primitiveBounds[ c + 2 * a ];\n\t\t\t\t\tfor ( let bi = 0; bi < splitCount; bi ++ ) {\n\n\t\t\t\t\t\tconst bin = truncatedBins[ bi ];\n\t\t\t\t\t\tif ( center >= bin.candidate ) {\n\n\t\t\t\t\t\t\texpandByPrimitiveBounds( c, primitiveBounds, bin.rightCacheBounds );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\texpandByPrimitiveBounds( c, primitiveBounds, bin.leftCacheBounds );\n\t\t\t\t\t\t\tbin.count ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// expand all the bounds\n\t\t\t\tfor ( let bi = 0; bi < splitCount; bi ++ ) {\n\n\t\t\t\t\tconst bin = truncatedBins[ bi ];\n\t\t\t\t\tconst leftCount = bin.count;\n\t\t\t\t\tconst rightCount = count - bin.count;\n\n\t\t\t\t\t// check the cost of this split\n\t\t\t\t\tconst leftBounds = bin.leftCacheBounds;\n\t\t\t\t\tconst rightBounds = bin.rightCacheBounds;\n\n\t\t\t\t\tlet leftProb = 0;\n\t\t\t\t\tif ( leftCount !== 0 ) {\n\n\t\t\t\t\t\tleftProb = computeSurfaceArea( leftBounds ) / rootSurfaceArea;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet rightProb = 0;\n\t\t\t\t\tif ( rightCount !== 0 ) {\n\n\t\t\t\t\t\trightProb = computeSurfaceArea( rightBounds ) / rootSurfaceArea;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cost = TRAVERSAL_COST + PRIMITIVE_INTERSECT_COST * (\n\t\t\t\t\t\tleftProb * leftCount + rightProb * rightCount\n\t\t\t\t\t);\n\n\t\t\t\t\tif ( cost < bestCost ) {\n\n\t\t\t\t\t\taxis = a;\n\t\t\t\t\t\tbestCost = cost;\n\t\t\t\t\t\tpos = bin.candidate;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// reset the bins\n\t\t\t\tfor ( let i = 0; i < BIN_COUNT; i ++ ) {\n\n\t\t\t\t\tconst bin = sahBins[ i ];\n\t\t\t\t\tbin.count = 0;\n\t\t\t\t\tbin.candidate = axisLeft + binWidth + i * binWidth;\n\n\t\t\t\t\tconst bounds = bin.bounds;\n\t\t\t\t\tfor ( let d = 0; d < 3; d ++ ) {\n\n\t\t\t\t\t\tbounds[ d ] = Infinity;\n\t\t\t\t\t\tbounds[ d + 3 ] = - Infinity;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over all center positions\n\t\t\t\tfor ( let c = cStart; c < cEnd; c += 6 ) {\n\n\t\t\t\t\tconst triCenter = primitiveBounds[ c + 2 * a ];\n\t\t\t\t\tconst relativeCenter = triCenter - axisLeft;\n\n\t\t\t\t\t// in the partition function if the centroid lies on the split plane then it is\n\t\t\t\t\t// considered to be on the right side of the split\n\t\t\t\t\tlet binIndex = ~ ~ ( relativeCenter / binWidth );\n\t\t\t\t\tif ( binIndex >= BIN_COUNT ) binIndex = BIN_COUNT - 1;\n\n\t\t\t\t\tconst bin = sahBins[ binIndex ];\n\t\t\t\t\tbin.count ++;\n\n\t\t\t\t\texpandByPrimitiveBounds( c, primitiveBounds, bin.bounds );\n\n\t\t\t\t}\n\n\t\t\t\t// cache the unioned bounds from right to left so we don't have to regenerate them each time\n\t\t\t\tconst lastBin = sahBins[ BIN_COUNT - 1 ];\n\t\t\t\tcopyBounds( lastBin.bounds, lastBin.rightCacheBounds );\n\t\t\t\tfor ( let i = BIN_COUNT - 2; i >= 0; i -- ) {\n\n\t\t\t\t\tconst bin = sahBins[ i ];\n\t\t\t\t\tconst nextBin = sahBins[ i + 1 ];\n\t\t\t\t\tunionBounds( bin.bounds, nextBin.rightCacheBounds, bin.rightCacheBounds );\n\n\t\t\t\t}\n\n\t\t\t\tlet leftCount = 0;\n\t\t\t\tfor ( let i = 0; i < BIN_COUNT - 1; i ++ ) {\n\n\t\t\t\t\tconst bin = sahBins[ i ];\n\t\t\t\t\tconst binCount = bin.count;\n\t\t\t\t\tconst bounds = bin.bounds;\n\n\t\t\t\t\tconst nextBin = sahBins[ i + 1 ];\n\t\t\t\t\tconst rightBounds = nextBin.rightCacheBounds;\n\n\t\t\t\t\t// don't do anything with the bounds if the new bounds have no primitives\n\t\t\t\t\tif ( binCount !== 0 ) {\n\n\t\t\t\t\t\tif ( leftCount === 0 ) {\n\n\t\t\t\t\t\t\tcopyBounds( bounds, leftBounds );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tunionBounds( bounds, leftBounds, leftBounds );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tleftCount += binCount;\n\n\t\t\t\t\t// check the cost of this split\n\t\t\t\t\tlet leftProb = 0;\n\t\t\t\t\tlet rightProb = 0;\n\n\t\t\t\t\tif ( leftCount !== 0 ) {\n\n\t\t\t\t\t\tleftProb = computeSurfaceArea( leftBounds ) / rootSurfaceArea;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst rightCount = count - leftCount;\n\t\t\t\t\tif ( rightCount !== 0 ) {\n\n\t\t\t\t\t\trightProb = computeSurfaceArea( rightBounds ) / rootSurfaceArea;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cost = TRAVERSAL_COST + PRIMITIVE_INTERSECT_COST * (\n\t\t\t\t\t\tleftProb * leftCount + rightProb * rightCount\n\t\t\t\t\t);\n\n\t\t\t\t\tif ( cost < bestCost ) {\n\n\t\t\t\t\t\taxis = a;\n\t\t\t\t\t\tbestCost = cost;\n\t\t\t\t\t\tpos = bin.candidate;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\tconsole.warn( `BVH: Invalid build strategy value ${ strategy } used.` );\n\n\t}\n\n\treturn { axis, pos };\n\n}\n\n// returns the average coordinate on the specified axis of all the provided primitives\nfunction getAverage( primitiveBounds, offset, count, axis ) {\n\n\tlet avg = 0;\n\tconst boundsOffset = primitiveBounds.offset;\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\t\tavg += primitiveBounds[ ( i - boundsOffset ) * 6 + axis * 2 ];\n\n\t}\n\n\treturn avg / count;\n\n}\n","export class BVHNode {\n\n\tconstructor() {\n\n\t\t// internal nodes have boundingData, left, right, and splitAxis\n\t\t// leaf nodes have offset and count (referring to primitives in the mesh geometry)\n\n\t\tthis.boundingData = new Float32Array( 6 );\n\n\t}\n\n}\n","// reorders the partition buffer such that for `count` elements after `offset`, elements on the left side of the split\n// will be on the left and elements on the right side of the split will be on the right. returns the index\n// of the first element on the right side, or offset + count if there are no elements on the right side.\nexport function partition( buffer, stride, primitiveBounds, offset, count, split ) {\n\n\tlet left = offset;\n\tlet right = offset + count - 1;\n\tconst pos = split.pos;\n\tconst axisOffset = split.axis * 2;\n\tconst boundsOffset = primitiveBounds.offset || 0;\n\n\t// hoare partitioning, see e.g. https://en.wikipedia.org/wiki/Quicksort#Hoare_partition_scheme\n\twhile ( true ) {\n\n\t\twhile ( left <= right && primitiveBounds[ ( left - boundsOffset ) * 6 + axisOffset ] < pos ) {\n\n\t\t\tleft ++;\n\n\t\t}\n\n\t\t// if a primitive center lies on the partition plane it is considered to be on the right side\n\t\twhile ( left <= right && primitiveBounds[ ( right - boundsOffset ) * 6 + axisOffset ] >= pos ) {\n\n\t\t\tright --;\n\n\t\t}\n\n\t\tif ( left < right ) {\n\n\t\t\t// we need to swap all of the information associated with the primitives at index\n\t\t\t// left and right; that's the elements in the partition buffer and the bounds\n\t\t\tfor ( let i = 0; i < stride; i ++ ) {\n\n\t\t\t\tlet t0 = buffer[ left * stride + i ];\n\t\t\t\tbuffer[ left * stride + i ] = buffer[ right * stride + i ];\n\t\t\t\tbuffer[ right * stride + i ] = t0;\n\n\t\t\t}\n\n\t\t\t// swap bounds\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tconst l = left - boundsOffset;\n\t\t\t\tconst r = right - boundsOffset;\n\t\t\t\tconst tb = primitiveBounds[ l * 6 + i ];\n\t\t\t\tprimitiveBounds[ l * 6 + i ] = primitiveBounds[ r * 6 + i ];\n\t\t\t\tprimitiveBounds[ r * 6 + i ] = tb;\n\n\t\t\t}\n\n\t\t\tleft ++;\n\t\t\tright --;\n\n\t\t} else {\n\n\t\t\treturn left;\n\n\t\t}\n\n\t}\n\n}\n","import { BYTES_PER_NODE, IS_LEAFNODE_FLAG } from '../Constants.js';\n\nlet float32Array, uint32Array, uint16Array, uint8Array;\nconst MAX_POINTER = Math.pow( 2, 32 );\n\nexport function countNodes( node ) {\n\n\tif ( 'count' in node ) {\n\n\t\treturn 1;\n\n\t} else {\n\n\t\treturn 1 + countNodes( node.left ) + countNodes( node.right );\n\n\t}\n\n}\n\nexport function populateBuffer( byteOffset, node, buffer ) {\n\n\tfloat32Array = new Float32Array( buffer );\n\tuint32Array = new Uint32Array( buffer );\n\tuint16Array = new Uint16Array( buffer );\n\tuint8Array = new Uint8Array( buffer );\n\n\treturn _populateBuffer( byteOffset, node );\n\n}\n\n// pack structure\n// boundingData  \t\t\t\t: 6 float32\n// right / offset \t\t\t\t: 1 uint32\n// splitAxis / isLeaf + count \t: 1 uint32 / 2 uint16\nfunction _populateBuffer( byteOffset, node ) {\n\n\tconst node32Index = byteOffset / 4;\n\tconst node16Index = byteOffset / 2;\n\tconst isLeaf = 'count' in node;\n\tconst boundingData = node.boundingData;\n\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\tfloat32Array[ node32Index + i ] = boundingData[ i ];\n\n\t}\n\n\tif ( isLeaf ) {\n\n\t\tif ( node.buffer ) {\n\n\t\t\tuint8Array.set( new Uint8Array( node.buffer ), byteOffset );\n\t\t\treturn byteOffset + node.buffer.byteLength;\n\n\t\t} else {\n\n\t\t\tuint32Array[ node32Index + 6 ] = node.offset;\n\t\t\tuint16Array[ node16Index + 14 ] = node.count;\n\t\t\tuint16Array[ node16Index + 15 ] = IS_LEAFNODE_FLAG;\n\t\t\treturn byteOffset + BYTES_PER_NODE;\n\n\t\t}\n\n\t} else {\n\n\t\tconst { left, right, splitAxis } = node;\n\n\t\t// fill in the left node contents\n\t\tconst leftByteOffset = byteOffset + BYTES_PER_NODE;\n\t\tlet rightByteOffset = _populateBuffer( leftByteOffset, left );\n\n\t\t// calculate relative offset from parent to right child\n\t\tconst currentNodeIndex = byteOffset / BYTES_PER_NODE;\n\t\tconst rightNodeIndex = rightByteOffset / BYTES_PER_NODE;\n\t\tconst relativeRightIndex = rightNodeIndex - currentNodeIndex;\n\n\t\t// check if the relative offset is too high\n\t\tif ( relativeRightIndex > MAX_POINTER ) {\n\n\t\t\tthrow new Error( 'MeshBVH: Cannot store relative child node offset greater than 32 bits.' );\n\n\t\t}\n\n\t\t// fill in the right node contents (store as relative offset)\n\t\tuint32Array[ node32Index + 6 ] = relativeRightIndex;\n\t\tuint32Array[ node32Index + 7 ] = splitAxis;\n\n\t\t// return the next available buffer pointer\n\t\treturn _populateBuffer( rightByteOffset, right );\n\n\t}\n\n}\n","import { getBounds } from './computeBoundsUtils.js';\nimport { getOptimalSplit } from './splitUtils.js';\nimport { BVHNode } from '../BVHNode.js';\nimport { BYTES_PER_NODE } from '../Constants.js';\n\nimport { partition } from './sortUtils.js';\nimport { countNodes, populateBuffer } from './buildUtils.js';\n\nexport function buildTree( bvh, primitiveBounds, offset, count, options, loadRange ) {\n\n\t// expand variables\n\tconst {\n\t\tmaxDepth,\n\t\tverbose,\n\t\tmaxLeafSize,\n\t\tstrategy,\n\t\tonProgress,\n\t} = options;\n\n\tconst partitionBuffer = bvh.primitiveBuffer;\n\tconst partitionStride = bvh.primitiveBufferStride;\n\n\t// generate intermediate variables\n\tconst cacheCentroidBoundingData = new Float32Array( 6 );\n\tlet reachedMaxDepth = false;\n\n\tconst root = new BVHNode();\n\tgetBounds( primitiveBounds, offset, count, root.boundingData, cacheCentroidBoundingData );\n\tsplitNode( root, offset, count, cacheCentroidBoundingData );\n\treturn root;\n\n\tfunction triggerProgress( primitivesProcessed ) {\n\n\t\tif ( onProgress ) {\n\n\t\t\tonProgress( ( primitivesProcessed - loadRange.offset ) / loadRange.count );\n\n\t\t}\n\n\t}\n\n\t// either recursively splits the given node, creating left and right subtrees for it, or makes it a leaf node,\n\t// recording the offset and count of its primitives and writing them into the reordered geometry index.\n\tfunction splitNode( node, offset, count, centroidBoundingData = null, depth = 0 ) {\n\n\t\tif ( ! reachedMaxDepth && depth >= maxDepth ) {\n\n\t\t\treachedMaxDepth = true;\n\t\t\tif ( verbose ) {\n\n\t\t\t\tconsole.warn( `BVH: Max depth of ${ maxDepth } reached when generating BVH. Consider increasing maxDepth.` );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// early out if we've met our capacity\n\t\tif ( count <= maxLeafSize || depth >= maxDepth ) {\n\n\t\t\ttriggerProgress( offset + count );\n\t\t\tnode.offset = offset;\n\t\t\tnode.count = count;\n\t\t\treturn node;\n\n\t\t}\n\n\t\t// Find where to split the volume\n\t\tconst split = getOptimalSplit( node.boundingData, centroidBoundingData, primitiveBounds, offset, count, strategy );\n\t\tif ( split.axis === - 1 ) {\n\n\t\t\ttriggerProgress( offset + count );\n\t\t\tnode.offset = offset;\n\t\t\tnode.count = count;\n\t\t\treturn node;\n\n\t\t}\n\n\t\tconst splitOffset = partition( partitionBuffer, partitionStride, primitiveBounds, offset, count, split );\n\n\t\t// create the two new child nodes\n\t\tif ( splitOffset === offset || splitOffset === offset + count ) {\n\n\t\t\ttriggerProgress( offset + count );\n\t\t\tnode.offset = offset;\n\t\t\tnode.count = count;\n\n\t\t} else {\n\n\t\t\tnode.splitAxis = split.axis;\n\n\t\t\t// create the left child and compute its bounding box\n\t\t\tconst left = new BVHNode();\n\t\t\tconst lstart = offset;\n\t\t\tconst lcount = splitOffset - offset;\n\t\t\tnode.left = left;\n\n\t\t\tgetBounds( primitiveBounds, lstart, lcount, left.boundingData, cacheCentroidBoundingData );\n\t\t\tsplitNode( left, lstart, lcount, cacheCentroidBoundingData, depth + 1 );\n\n\t\t\t// repeat for right\n\t\t\tconst right = new BVHNode();\n\t\t\tconst rstart = splitOffset;\n\t\t\tconst rcount = count - lcount;\n\t\t\tnode.right = right;\n\n\t\t\tgetBounds( primitiveBounds, rstart, rcount, right.boundingData, cacheCentroidBoundingData );\n\t\t\tsplitNode( right, rstart, rcount, cacheCentroidBoundingData, depth + 1 );\n\n\t\t}\n\n\t\treturn node;\n\n\t}\n\n}\n\nexport function buildPackedTree( bvh, options ) {\n\n\tconst BufferConstructor = options.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer;\n\n\t// get the range of buffer data to construct / arrange\n\tconst rootRanges = bvh.getRootRanges( options.range );\n\tconst firstRange = rootRanges[ 0 ];\n\tconst lastRange = rootRanges[ rootRanges.length - 1 ];\n\tconst fullRange = {\n\t\toffset: firstRange.offset,\n\t\tcount: lastRange.offset + lastRange.count - firstRange.offset,\n\t};\n\n\t// construct the primitive bounds for sorting\n\tconst primitiveBounds = new Float32Array( 6 * fullRange.count );\n\tprimitiveBounds.offset = fullRange.offset;\n\tbvh.computePrimitiveBounds( fullRange.offset, fullRange.count, primitiveBounds );\n\n\t// Build BVH roots\n\tbvh._roots = rootRanges.map( range => {\n\n\t\tconst root = buildTree( bvh, primitiveBounds, range.offset, range.count, options, fullRange );\n\t\tconst nodeCount = countNodes( root );\n\t\tconst buffer = new BufferConstructor( BYTES_PER_NODE * nodeCount );\n\t\tpopulateBuffer( 0, root, buffer );\n\t\treturn buffer;\n\n\t} );\n\n}\n","export class PrimitivePool {\n\n\tconstructor( getNewPrimitive ) {\n\n\t\tthis._getNewPrimitive = getNewPrimitive;\n\t\tthis._primitives = [];\n\n\t}\n\n\tgetPrimitive() {\n\n\t\tconst primitives = this._primitives;\n\t\tif ( primitives.length === 0 ) {\n\n\t\t\treturn this._getNewPrimitive();\n\n\t\t} else {\n\n\t\t\treturn primitives.pop();\n\n\t\t}\n\n\t}\n\n\treleasePrimitive( primitive ) {\n\n\t\tthis._primitives.push( primitive );\n\n\t}\n\n}\n","class _BufferStack {\n\n\tconstructor() {\n\n\t\tthis.float32Array = null;\n\t\tthis.uint16Array = null;\n\t\tthis.uint32Array = null;\n\n\t\tconst stack = [];\n\t\tlet prevBuffer = null;\n\t\tthis.setBuffer = buffer => {\n\n\t\t\tif ( prevBuffer ) {\n\n\t\t\t\tstack.push( prevBuffer );\n\n\t\t\t}\n\n\t\t\tprevBuffer = buffer;\n\t\t\tthis.float32Array = new Float32Array( buffer );\n\t\t\tthis.uint16Array = new Uint16Array( buffer );\n\t\t\tthis.uint32Array = new Uint32Array( buffer );\n\n\t\t};\n\n\t\tthis.clearBuffer = () => {\n\n\t\t\tprevBuffer = null;\n\t\t\tthis.float32Array = null;\n\t\t\tthis.uint16Array = null;\n\t\t\tthis.uint32Array = null;\n\n\t\t\tif ( stack.length !== 0 ) {\n\n\t\t\t\tthis.setBuffer( stack.pop() );\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n}\n\nexport const BufferStack = /* @__PURE__ */ new _BufferStack();\n","import { Box3 } from 'three';\nimport { CONTAINED, UINT32_PER_NODE } from '../Constants.js';\nimport { arrayToBox } from '../../utils/ArrayBoxUtilities.js';\nimport { PrimitivePool } from '../../utils/PrimitivePool.js';\nimport { COUNT, OFFSET, LEFT_NODE, RIGHT_NODE, IS_LEAF, BOUNDING_DATA_INDEX } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\n\nlet _box1, _box2;\nconst boxStack = [];\nconst boxPool = /* @__PURE__ */ new PrimitivePool( () => new Box3() );\n\nexport function shapecast( bvh, root, intersectsBounds, intersectsRange, boundsTraverseOrder, nodeOffset ) {\n\n\t// setup\n\t_box1 = boxPool.getPrimitive();\n\t_box2 = boxPool.getPrimitive();\n\tboxStack.push( _box1, _box2 );\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\n\tconst result = shapecastTraverse( 0, bvh.geometry, intersectsBounds, intersectsRange, boundsTraverseOrder, nodeOffset );\n\n\t// cleanup\n\tBufferStack.clearBuffer();\n\tboxPool.releasePrimitive( _box1 );\n\tboxPool.releasePrimitive( _box2 );\n\tboxStack.pop();\n\tboxStack.pop();\n\n\tconst length = boxStack.length;\n\tif ( length > 0 ) {\n\n\t\t_box2 = boxStack[ length - 1 ];\n\t\t_box1 = boxStack[ length - 2 ];\n\n\t}\n\n\treturn result;\n\n}\n\nfunction shapecastTraverse(\n\tnodeIndex32,\n\tgeometry,\n\tintersectsBoundsFunc,\n\tintersectsRangeFunc,\n\tnodeScoreFunc = null,\n\tnodeIndexOffset = 0, // offset for unique node identifier\n\tdepth = 0\n) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\t\tarrayToBox( BOUNDING_DATA_INDEX( nodeIndex32 ), float32Array, _box1 );\n\t\treturn intersectsRangeFunc( offset, count, false, depth, nodeIndexOffset + nodeIndex32 / UINT32_PER_NODE, _box1 );\n\n\t} else {\n\n\t\tconst left = LEFT_NODE( nodeIndex32 );\n\t\tconst right = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\tlet c1 = left;\n\t\tlet c2 = right;\n\n\t\tlet score1, score2;\n\t\tlet box1, box2;\n\t\tif ( nodeScoreFunc ) {\n\n\t\t\tbox1 = _box1;\n\t\t\tbox2 = _box2;\n\n\t\t\t// bounding data is not offset\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c1 ), float32Array, box1 );\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c2 ), float32Array, box2 );\n\n\t\t\tscore1 = nodeScoreFunc( box1 );\n\t\t\tscore2 = nodeScoreFunc( box2 );\n\n\t\t\tif ( score2 < score1 ) {\n\n\t\t\t\tc1 = right;\n\t\t\t\tc2 = left;\n\n\t\t\t\tconst temp = score1;\n\t\t\t\tscore1 = score2;\n\t\t\t\tscore2 = temp;\n\n\t\t\t\tbox1 = box2;\n\t\t\t\t// box2 is always set before use below\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Check box 1 intersection\n\t\tif ( ! box1 ) {\n\n\t\t\tbox1 = _box1;\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c1 ), float32Array, box1 );\n\n\t\t}\n\n\t\tconst isC1Leaf = IS_LEAF( c1 * 2, uint16Array );\n\t\tconst c1Intersection = intersectsBoundsFunc( box1, isC1Leaf, score1, depth + 1, nodeIndexOffset + c1 / UINT32_PER_NODE );\n\n\t\tlet c1StopTraversal;\n\t\tif ( c1Intersection === CONTAINED ) {\n\n\t\t\tconst offset = getLeftOffset( c1 );\n\t\t\tconst end = getRightEndOffset( c1 );\n\t\t\tconst count = end - offset;\n\n\t\t\tc1StopTraversal = intersectsRangeFunc( offset, count, true, depth + 1, nodeIndexOffset + c1 / UINT32_PER_NODE, box1 );\n\n\t\t} else {\n\n\t\t\tc1StopTraversal =\n\t\t\t\tc1Intersection &&\n\t\t\t\tshapecastTraverse(\n\t\t\t\t\tc1,\n\t\t\t\t\tgeometry,\n\t\t\t\t\tintersectsBoundsFunc,\n\t\t\t\t\tintersectsRangeFunc,\n\t\t\t\t\tnodeScoreFunc,\n\t\t\t\t\tnodeIndexOffset,\n\t\t\t\t\tdepth + 1\n\t\t\t\t);\n\n\t\t}\n\n\t\tif ( c1StopTraversal ) return true;\n\n\t\t// Check box 2 intersection\n\t\t// cached box2 will have been overwritten by previous traversal\n\t\tbox2 = _box2;\n\t\tarrayToBox( BOUNDING_DATA_INDEX( c2 ), float32Array, box2 );\n\n\t\tconst isC2Leaf = IS_LEAF( c2 * 2, uint16Array );\n\t\tconst c2Intersection = intersectsBoundsFunc( box2, isC2Leaf, score2, depth + 1, nodeIndexOffset + c2 / UINT32_PER_NODE );\n\n\t\tlet c2StopTraversal;\n\t\tif ( c2Intersection === CONTAINED ) {\n\n\t\t\tconst offset = getLeftOffset( c2 );\n\t\t\tconst end = getRightEndOffset( c2 );\n\t\t\tconst count = end - offset;\n\n\t\t\tc2StopTraversal = intersectsRangeFunc( offset, count, true, depth + 1, nodeIndexOffset + c2 / UINT32_PER_NODE, box2 );\n\n\t\t} else {\n\n\t\t\tc2StopTraversal =\n\t\t\t\tc2Intersection &&\n\t\t\t\tshapecastTraverse(\n\t\t\t\t\tc2,\n\t\t\t\t\tgeometry,\n\t\t\t\t\tintersectsBoundsFunc,\n\t\t\t\t\tintersectsRangeFunc,\n\t\t\t\t\tnodeScoreFunc,\n\t\t\t\t\tnodeIndexOffset,\n\t\t\t\t\tdepth + 1\n\t\t\t\t);\n\n\t\t}\n\n\t\tif ( c2StopTraversal ) return true;\n\n\t\treturn false;\n\n\t\t// Define these inside the function so it has access to the local variables needed\n\t\t// when converting to the buffer equivalents\n\t\tfunction getLeftOffset( nodeIndex32 ) {\n\n\t\t\tconst { uint16Array, uint32Array } = BufferStack;\n\t\t\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\t\t\t// traverse until we find a leaf\n\t\t\twhile ( ! IS_LEAF( nodeIndex16, uint16Array ) ) {\n\n\t\t\t\tnodeIndex32 = LEFT_NODE( nodeIndex32 );\n\t\t\t\tnodeIndex16 = nodeIndex32 * 2;\n\n\t\t\t}\n\n\t\t\treturn OFFSET( nodeIndex32, uint32Array );\n\n\t\t}\n\n\t\tfunction getRightEndOffset( nodeIndex32 ) {\n\n\t\t\tconst { uint16Array, uint32Array } = BufferStack;\n\t\t\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\t\t\t// traverse until we find a leaf\n\t\t\twhile ( ! IS_LEAF( nodeIndex16, uint16Array ) ) {\n\n\t\t\t\t// adjust offset to point to the right node\n\t\t\t\tnodeIndex32 = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\t\t\tnodeIndex16 = nodeIndex32 * 2;\n\n\t\t\t}\n\n\t\t\t// return the end offset of the triangle range\n\t\t\treturn OFFSET( nodeIndex32, uint32Array ) + COUNT( nodeIndex16, uint16Array );\n\n\t\t}\n\n\t}\n\n}\n","import { Box3, Matrix4 } from 'three';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport { BOUNDING_DATA_INDEX, COUNT, IS_LEAF, LEFT_NODE, OFFSET, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { arrayToBox } from '../../utils/ArrayBoxUtilities.js';\nimport { PrimitivePool } from '../../utils/PrimitivePool.js';\nimport { BYTES_PER_NODE, UINT32_PER_NODE } from '../Constants.js';\n\nconst _bufferStack1 = /* @__PURE__ */ new BufferStack.constructor();\nconst _bufferStack2 = /* @__PURE__ */ new BufferStack.constructor();\nconst _boxPool = /* @__PURE__ */ new PrimitivePool( () => new Box3() );\nconst _leftBox1 = /* @__PURE__ */ new Box3();\nconst _rightBox1 = /* @__PURE__ */ new Box3();\n\nconst _leftBox2 = /* @__PURE__ */ new Box3();\nconst _rightBox2 = /* @__PURE__ */ new Box3();\n\nlet _active = false;\n\nexport function bvhcast( bvh, otherBvh, matrixToLocal, intersectsRanges ) {\n\n\tif ( _active ) {\n\n\t\tthrow new Error( 'MeshBVH: Recursive calls to bvhcast not supported.' );\n\n\t}\n\n\t_active = true;\n\n\tconst roots = bvh._roots;\n\tconst otherRoots = otherBvh._roots;\n\tlet result;\n\tlet nodeOffset1 = 0;\n\tlet nodeOffset2 = 0;\n\tconst invMat = new Matrix4().copy( matrixToLocal ).invert();\n\n\t// iterate over the first set of roots\n\tfor ( let i = 0, il = roots.length; i < il; i ++ ) {\n\n\t\t_bufferStack1.setBuffer( roots[ i ] );\n\t\tnodeOffset2 = 0;\n\n\t\t// prep the initial root box\n\t\tconst localBox = _boxPool.getPrimitive();\n\t\tarrayToBox( BOUNDING_DATA_INDEX( 0 ), _bufferStack1.float32Array, localBox );\n\t\tlocalBox.applyMatrix4( invMat );\n\n\t\t// iterate over the second set of roots\n\t\tfor ( let j = 0, jl = otherRoots.length; j < jl; j ++ ) {\n\n\t\t\t_bufferStack2.setBuffer( otherRoots[ j ] );\n\n\t\t\tresult = _traverse(\n\t\t\t\t0, 0, matrixToLocal, invMat, intersectsRanges,\n\t\t\t\tnodeOffset1, nodeOffset2, 0, 0,\n\t\t\t\tlocalBox,\n\t\t\t);\n\n\t\t\t_bufferStack2.clearBuffer();\n\t\t\tnodeOffset2 += otherRoots[ j ].byteLength / BYTES_PER_NODE;\n\n\t\t\tif ( result ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// release stack info\n\t\t_boxPool.releasePrimitive( localBox );\n\t\t_bufferStack1.clearBuffer();\n\t\tnodeOffset1 += roots[ i ].byteLength / BYTES_PER_NODE;\n\n\t\tif ( result ) {\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\t_active = false;\n\treturn result;\n\n}\n\nfunction _traverse(\n\tnode1Index32,\n\tnode2Index32,\n\tmatrix2to1,\n\tmatrix1to2,\n\tintersectsRangesFunc,\n\n\t// offsets for ids\n\tnode1IndexOffset = 0,\n\tnode2IndexOffset = 0,\n\n\t// tree depth\n\tdepth1 = 0,\n\tdepth2 = 0,\n\n\tcurrBox = null,\n\treversed = false,\n\n) {\n\n\t// get the buffer stacks associated with the current indices\n\tlet bufferStack1, bufferStack2;\n\tif ( reversed ) {\n\n\t\tbufferStack1 = _bufferStack2;\n\t\tbufferStack2 = _bufferStack1;\n\n\t} else {\n\n\t\tbufferStack1 = _bufferStack1;\n\t\tbufferStack2 = _bufferStack2;\n\n\t}\n\n\t// get the local instances of the typed buffers\n\tconst\n\t\tfloat32Array1 = bufferStack1.float32Array,\n\t\tuint32Array1 = bufferStack1.uint32Array,\n\t\tuint16Array1 = bufferStack1.uint16Array,\n\t\tfloat32Array2 = bufferStack2.float32Array,\n\t\tuint32Array2 = bufferStack2.uint32Array,\n\t\tuint16Array2 = bufferStack2.uint16Array;\n\n\tconst node1Index16 = node1Index32 * 2;\n\tconst node2Index16 = node2Index32 * 2;\n\tconst isLeaf1 = IS_LEAF( node1Index16, uint16Array1 );\n\tconst isLeaf2 = IS_LEAF( node2Index16, uint16Array2 );\n\tlet result = false;\n\tif ( isLeaf2 && isLeaf1 ) {\n\n\t\t// if both bounds are leaf nodes then fire the callback if the boxes intersect\n\t\t// Note the \"nodeIndex\" values are just intended to be used as unique identifiers in the tree and\n\t\t// not used for accessing data\n\t\tif ( reversed ) {\n\n\t\t\tresult = intersectsRangesFunc(\n\t\t\t\tOFFSET( node2Index32, uint32Array2 ), COUNT( node2Index32 * 2, uint16Array2 ),\n\t\t\t\tOFFSET( node1Index32, uint32Array1 ), COUNT( node1Index32 * 2, uint16Array1 ),\n\t\t\t\tdepth2, node2IndexOffset + node2Index32 / UINT32_PER_NODE,\n\t\t\t\tdepth1, node1IndexOffset + node1Index32 / UINT32_PER_NODE,\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tresult = intersectsRangesFunc(\n\t\t\t\tOFFSET( node1Index32, uint32Array1 ), COUNT( node1Index32 * 2, uint16Array1 ),\n\t\t\t\tOFFSET( node2Index32, uint32Array2 ), COUNT( node2Index32 * 2, uint16Array2 ),\n\t\t\t\tdepth1, node1IndexOffset + node1Index32 / UINT32_PER_NODE,\n\t\t\t\tdepth2, node2IndexOffset + node2Index32 / UINT32_PER_NODE,\n\t\t\t);\n\n\t\t}\n\n\t} else if ( isLeaf2 ) {\n\n\t\t// SWAP\n\t\t// If we've traversed to the leaf node on the other bvh then we need to swap over\n\t\t// to traverse down the first one\n\n\t\t// get the new box to use\n\t\tconst newBox = _boxPool.getPrimitive();\n\t\tarrayToBox( BOUNDING_DATA_INDEX( node2Index32 ), float32Array2, newBox );\n\t\tnewBox.applyMatrix4( matrix2to1 );\n\n\t\t// get the child bounds to check before traversal\n\t\tconst cl1 = LEFT_NODE( node1Index32 );\n\t\tconst cr1 = RIGHT_NODE( node1Index32, uint32Array1 );\n\t\tarrayToBox( BOUNDING_DATA_INDEX( cl1 ), float32Array1, _leftBox1 );\n\t\tarrayToBox( BOUNDING_DATA_INDEX( cr1 ), float32Array1, _rightBox1 );\n\n\t\t// precompute the intersections otherwise the global boxes will be modified during traversal\n\t\tconst intersectCl1 = newBox.intersectsBox( _leftBox1 );\n\t\tconst intersectCr1 = newBox.intersectsBox( _rightBox1 );\n\t\tresult = (\n\t\t\tintersectCl1 && _traverse(\n\t\t\t\tnode2Index32, cl1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\tnode2IndexOffset, node1IndexOffset, depth2, depth1 + 1,\n\t\t\t\tnewBox, ! reversed,\n\t\t\t)\n\t\t) || (\n\t\t\tintersectCr1 && _traverse(\n\t\t\t\tnode2Index32, cr1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\tnode2IndexOffset, node1IndexOffset, depth2, depth1 + 1,\n\t\t\t\tnewBox, ! reversed,\n\t\t\t)\n\t\t);\n\n\t\t_boxPool.releasePrimitive( newBox );\n\n\t} else {\n\n\t\t// if neither are leaves then we should swap if one of the children does not\n\t\t// intersect with the current bounds\n\n\t\t// get the child bounds to check\n\t\tconst cl2 = LEFT_NODE( node2Index32 );\n\t\tconst cr2 = RIGHT_NODE( node2Index32, uint32Array2 );\n\t\tarrayToBox( BOUNDING_DATA_INDEX( cl2 ), float32Array2, _leftBox2 );\n\t\tarrayToBox( BOUNDING_DATA_INDEX( cr2 ), float32Array2, _rightBox2 );\n\n\t\tconst leftIntersects = currBox.intersectsBox( _leftBox2 );\n\t\tconst rightIntersects = currBox.intersectsBox( _rightBox2 );\n\t\tif ( leftIntersects && rightIntersects ) {\n\n\t\t\t// continue to traverse both children if they both intersect\n\t\t\tresult = _traverse(\n\t\t\t\tnode1Index32, cl2, matrix2to1, matrix1to2, intersectsRangesFunc,\n\t\t\t\tnode1IndexOffset, node2IndexOffset, depth1, depth2 + 1,\n\t\t\t\tcurrBox, reversed,\n\t\t\t) || _traverse(\n\t\t\t\tnode1Index32, cr2, matrix2to1, matrix1to2, intersectsRangesFunc,\n\t\t\t\tnode1IndexOffset, node2IndexOffset, depth1, depth2 + 1,\n\t\t\t\tcurrBox, reversed,\n\t\t\t);\n\n\t\t} else if ( leftIntersects ) {\n\n\t\t\tif ( isLeaf1 ) {\n\n\t\t\t\t// if the current box is a leaf then just continue\n\t\t\t\tresult = _traverse(\n\t\t\t\t\tnode1Index32, cl2, matrix2to1, matrix1to2, intersectsRangesFunc,\n\t\t\t\t\tnode1IndexOffset, node2IndexOffset, depth1, depth2 + 1,\n\t\t\t\t\tcurrBox, reversed,\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\t// SWAP\n\t\t\t\t// if only one box intersects then we have to swap to the other bvh to continue\n\t\t\t\tconst newBox = _boxPool.getPrimitive();\n\t\t\t\tnewBox.copy( _leftBox2 ).applyMatrix4( matrix2to1 );\n\n\t\t\t\tconst cl1 = LEFT_NODE( node1Index32 );\n\t\t\t\tconst cr1 = RIGHT_NODE( node1Index32, uint32Array1 );\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( cl1 ), float32Array1, _leftBox1 );\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( cr1 ), float32Array1, _rightBox1 );\n\n\t\t\t\t// precompute the intersections otherwise the global boxes will be modified during traversal\n\t\t\t\tconst intersectCl1 = newBox.intersectsBox( _leftBox1 );\n\t\t\t\tconst intersectCr1 = newBox.intersectsBox( _rightBox1 );\n\t\t\t\tresult = (\n\t\t\t\t\tintersectCl1 && _traverse(\n\t\t\t\t\t\tcl2, cl1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\t\t\tnode2IndexOffset, node1IndexOffset, depth2, depth1 + 1,\n\t\t\t\t\t\tnewBox, ! reversed,\n\t\t\t\t\t)\n\t\t\t\t) || (\n\t\t\t\t\tintersectCr1 && _traverse(\n\t\t\t\t\t\tcl2, cr1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\t\t\tnode2IndexOffset, node1IndexOffset, depth2, depth1 + 1,\n\t\t\t\t\t\tnewBox, ! reversed,\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t_boxPool.releasePrimitive( newBox );\n\n\t\t\t}\n\n\t\t} else if ( rightIntersects ) {\n\n\t\t\tif ( isLeaf1 ) {\n\n\t\t\t\t// if the current box is a leaf then just continue\n\t\t\t\tresult = _traverse(\n\t\t\t\t\tnode1Index32, cr2, matrix2to1, matrix1to2, intersectsRangesFunc,\n\t\t\t\t\tnode1IndexOffset, node2IndexOffset, depth1, depth2 + 1,\n\t\t\t\t\tcurrBox, reversed,\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\t// SWAP\n\t\t\t\t// if only one box intersects then we have to swap to the other bvh to continue\n\t\t\t\tconst newBox = _boxPool.getPrimitive();\n\t\t\t\tnewBox.copy( _rightBox2 ).applyMatrix4( matrix2to1 );\n\n\t\t\t\tconst cl1 = LEFT_NODE( node1Index32 );\n\t\t\t\tconst cr1 = RIGHT_NODE( node1Index32, uint32Array1 );\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( cl1 ), float32Array1, _leftBox1 );\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( cr1 ), float32Array1, _rightBox1 );\n\n\t\t\t\t// precompute the intersections otherwise the global boxes will be modified during traversal\n\t\t\t\tconst intersectCl1 = newBox.intersectsBox( _leftBox1 );\n\t\t\t\tconst intersectCr1 = newBox.intersectsBox( _rightBox1 );\n\t\t\t\tresult = (\n\t\t\t\t\tintersectCl1 && _traverse(\n\t\t\t\t\t\tcr2, cl1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\t\t\tnode2IndexOffset, node1IndexOffset, depth2, depth1 + 1,\n\t\t\t\t\t\tnewBox, ! reversed,\n\t\t\t\t\t)\n\t\t\t\t) || (\n\t\t\t\t\tintersectCr1 && _traverse(\n\t\t\t\t\t\tcr2, cr1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\t\t\tnode2IndexOffset, node1IndexOffset, depth2, depth1 + 1,\n\t\t\t\t\t\tnewBox, ! reversed,\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t_boxPool.releasePrimitive( newBox );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n","import { Box3 } from 'three';\nimport { BYTES_PER_NODE, UINT32_PER_NODE, DEFAULT_OPTIONS, FLOAT32_EPSILON } from './Constants.js';\nimport { arrayToBox } from '../utils/ArrayBoxUtilities.js';\nimport { IS_LEAF, LEFT_NODE, RIGHT_NODE, SPLIT_AXIS, COUNT, OFFSET } from './utils/nodeBufferUtils.js';\nimport { buildPackedTree } from './build/buildTree.js';\nimport { shapecast as shapecastFunc } from './cast/shapecast.js';\nimport { bvhcast } from './cast/bvhcast.js';\n\nconst _tempBox = /* @__PURE__ */ new Box3();\nconst _tempBuffer = /* @__PURE__ */ new Float32Array( 6 );\n\nexport class BVH {\n\n\tconstructor() {\n\n\t\tthis._roots = null;\n\t\tthis.primitiveBuffer = null;\n\t\tthis.primitiveBufferStride = null;\n\n\t}\n\n\tinit( options ) {\n\n\t\toptions = {\n\t\t\t...DEFAULT_OPTIONS,\n\t\t\t...options,\n\t\t};\n\n\t\tbuildPackedTree( this, options );\n\n\t}\n\n\tgetRootRanges( /* range */ ) {\n\n\t\t// TODO: can we avoid passing range in here?\n\t\tthrow new Error( 'BVH: getRootRanges() not implemented' );\n\n\t}\n\n\t// write the i-th primitive bounds in a 6-value min / max format to the buffer\n\t// starting at the given \"writeOffset\"\n\twritePrimitiveBounds( /* i, buffer, writeOffset */ ) {\n\n\t\tthrow new Error( 'BVH: writePrimitiveBounds() not implemented' );\n\n\t}\n\n\t// writes the union bounds of all primitives in the given range in a min / max format\n\t// to the buffer\n\twritePrimitiveRangeBounds( offset, count, targetBuffer, baseIndex ) {\n\n\t\t// Initialize bounds\n\t\tlet minX = Infinity;\n\t\tlet minY = Infinity;\n\t\tlet minZ = Infinity;\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\t// compute union of all bounds\n\t\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\t\t\tthis.writePrimitiveBounds( i, _tempBuffer, 0 );\n\n\t\t\t// compute union\n\t\t\tconst [ lx, ly, lz, rx, ry, rz ] = _tempBuffer;\n\t\t\tif ( lx < minX ) minX = lx;\n\t\t\tif ( rx > maxX ) maxX = rx;\n\t\t\tif ( ly < minY ) minY = ly;\n\t\t\tif ( ry > maxY ) maxY = ry;\n\t\t\tif ( lz < minZ ) minZ = lz;\n\t\t\tif ( rz > maxZ ) maxZ = rz;\n\n\t\t}\n\n\t\t// write bounds\n\t\ttargetBuffer[ baseIndex + 0 ] = minX;\n\t\ttargetBuffer[ baseIndex + 1 ] = minY;\n\t\ttargetBuffer[ baseIndex + 2 ] = minZ;\n\t\ttargetBuffer[ baseIndex + 3 ] = maxX;\n\t\ttargetBuffer[ baseIndex + 4 ] = maxY;\n\t\ttargetBuffer[ baseIndex + 5 ] = maxZ;\n\n\t\treturn targetBuffer;\n\n\t}\n\n\tcomputePrimitiveBounds( offset, count, targetBuffer ) {\n\n\t\tconst boundsOffset = targetBuffer.offset || 0;\n\t\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\t\t\tthis.writePrimitiveBounds( i, _tempBuffer, 0 );\n\n\t\t\t// construction primitive bounds requires a center + half extents format\n\t\t\tconst [ lx, ly, lz, rx, ry, rz ] = _tempBuffer;\n\n\t\t\tconst cx = ( lx + rx ) / 2;\n\t\t\tconst cy = ( ly + ry ) / 2;\n\t\t\tconst cz = ( lz + rz ) / 2;\n\n\t\t\tconst hx = ( rx - lx ) / 2;\n\t\t\tconst hy = ( ry - ly ) / 2;\n\t\t\tconst hz = ( rz - lz ) / 2;\n\n\t\t\tconst baseIndex = ( i - boundsOffset ) * 6;\n\t\t\ttargetBuffer[ baseIndex + 0 ] = cx;\n\t\t\ttargetBuffer[ baseIndex + 1 ] = hx + ( Math.abs( cx ) + hx ) * FLOAT32_EPSILON;\n\t\t\ttargetBuffer[ baseIndex + 2 ] = cy;\n\t\t\ttargetBuffer[ baseIndex + 3 ] = hy + ( Math.abs( cy ) + hy ) * FLOAT32_EPSILON;\n\t\t\ttargetBuffer[ baseIndex + 4 ] = cz;\n\t\t\ttargetBuffer[ baseIndex + 5 ] = hz + ( Math.abs( cz ) + hz ) * FLOAT32_EPSILON;\n\n\t\t}\n\n\t\treturn targetBuffer;\n\n\t}\n\n\tshiftPrimitiveOffsets( offset ) {\n\n\t\tconst indirectBuffer = this._indirectBuffer;\n\t\tif ( indirectBuffer ) {\n\n\t\t\t// the offsets are embedded in the indirect buffer\n\t\t\tfor ( let i = 0, l = indirectBuffer.length; i < l; i ++ ) {\n\n\t\t\t\tindirectBuffer[ i ] += offset;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// offsets are embedded in the leaf nodes\n\t\t\tconst roots = this._roots;\n\t\t\tfor ( let rootIndex = 0; rootIndex < roots.length; rootIndex ++ ) {\n\n\t\t\t\tconst root = roots[ rootIndex ];\n\t\t\t\tconst uint32Array = new Uint32Array( root );\n\t\t\t\tconst uint16Array = new Uint16Array( root );\n\t\t\t\tconst totalNodes = root.byteLength / BYTES_PER_NODE;\n\t\t\t\tfor ( let node = 0; node < totalNodes; node ++ ) {\n\n\t\t\t\t\tconst node32Index = UINT32_PER_NODE * node;\n\t\t\t\t\tconst node16Index = 2 * node32Index;\n\t\t\t\t\tif ( IS_LEAF( node16Index, uint16Array ) ) {\n\n\t\t\t\t\t\t// offset value\n\t\t\t\t\t\tuint32Array[ node32Index + 6 ] += offset;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttraverse( callback, rootIndex = 0 ) {\n\n\t\tconst buffer = this._roots[ rootIndex ];\n\t\tconst uint32Array = new Uint32Array( buffer );\n\t\tconst uint16Array = new Uint16Array( buffer );\n\t\t_traverse( 0 );\n\n\t\tfunction _traverse( node32Index, depth = 0 ) {\n\n\t\t\tconst node16Index = node32Index * 2;\n\t\t\tconst isLeaf = IS_LEAF( node16Index, uint16Array );\n\t\t\tif ( isLeaf ) {\n\n\t\t\t\tconst offset = uint32Array[ node32Index + 6 ];\n\t\t\t\tconst count = uint16Array[ node16Index + 14 ];\n\t\t\t\tcallback( depth, isLeaf, new Float32Array( buffer, node32Index * 4, 6 ), offset, count );\n\n\t\t\t} else {\n\n\t\t\t\tconst left = LEFT_NODE( node32Index );\n\t\t\t\tconst right = RIGHT_NODE( node32Index, uint32Array );\n\t\t\t\tconst splitAxis = SPLIT_AXIS( node32Index, uint32Array );\n\t\t\t\tconst stopTraversal = callback( depth, isLeaf, new Float32Array( buffer, node32Index * 4, 6 ), splitAxis );\n\n\t\t\t\tif ( ! stopTraversal ) {\n\n\t\t\t\t\t_traverse( left, depth + 1 );\n\t\t\t\t\t_traverse( right, depth + 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\trefit( /* nodeIndices = null */ ) {\n\n\t\t// TODO: add support for \"nodeIndices\"\n\t\t// if ( nodeIndices && Array.isArray( nodeIndices ) ) {\n\n\t\t// \tnodeIndices = new Set( nodeIndices );\n\n\t\t// }\n\n\t\tconst roots = this._roots;\n\t\tfor ( let rootIndex = 0, rootCount = roots.length; rootIndex < rootCount; rootIndex ++ ) {\n\n\t\t\tconst buffer = roots[ rootIndex ];\n\t\t\tconst uint32Array = new Uint32Array( buffer );\n\t\t\tconst uint16Array = new Uint16Array( buffer );\n\t\t\tconst float32Array = new Float32Array( buffer );\n\t\t\tconst totalNodes = buffer.byteLength / BYTES_PER_NODE;\n\n\t\t\t// Traverse nodes from right to left so children are updated before parents\n\t\t\tfor ( let nodeIndex = totalNodes - 1; nodeIndex >= 0; nodeIndex -- ) {\n\n\t\t\t\tconst nodeIndex32 = nodeIndex * UINT32_PER_NODE;\n\t\t\t\tconst nodeIndex16 = nodeIndex32 * 2;\n\t\t\t\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\n\t\t\t\tif ( isLeaf ) {\n\n\t\t\t\t\t// get the bounds\n\t\t\t\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\t\t\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\t\t\t\t\tthis.writePrimitiveRangeBounds( offset, count, _tempBuffer, 0 );\n\n\t\t\t\t\t// write directly to node bounds (already in min/max format)\n\t\t\t\t\tfloat32Array.set( _tempBuffer, nodeIndex32 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst left = LEFT_NODE( nodeIndex32 );\n\t\t\t\t\tconst right = RIGHT_NODE( nodeIndex32, uint32Array );\n\n\t\t\t\t\t// Union the bounds of left and right children\n\t\t\t\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\tconst leftMin = float32Array[ left + i ];\n\t\t\t\t\t\tconst leftMax = float32Array[ left + i + 3 ];\n\t\t\t\t\t\tconst rightMin = float32Array[ right + i ];\n\t\t\t\t\t\tconst rightMax = float32Array[ right + i + 3 ];\n\n\t\t\t\t\t\tfloat32Array[ nodeIndex32 + i ] = leftMin < rightMin ? leftMin : rightMin;\n\t\t\t\t\t\tfloat32Array[ nodeIndex32 + i + 3 ] = leftMax > rightMax ? leftMax : rightMax;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tgetBoundingBox( target ) {\n\n\t\ttarget.makeEmpty();\n\n\t\tconst roots = this._roots;\n\t\troots.forEach( buffer => {\n\n\t\t\tarrayToBox( 0, new Float32Array( buffer ), _tempBox );\n\t\t\ttarget.union( _tempBox );\n\n\t\t} );\n\n\t\treturn target;\n\n\t}\n\n\t// Base shapecast implementation that can be used by subclasses\n\t// TODO: see if we can get rid of \"iterateFunc\" here as well as the primitive so the function\n\t// API aligns with the \"shapecast\" implementation\n\tshapecast( callbacks ) {\n\n\t\t// TODO: can we get rid of \"scratchPrimitive\" and / or \"iterate\"? Or merge them somehow\n\t\tlet {\n\t\t\tboundsTraverseOrder,\n\t\t\tintersectsBounds,\n\t\t\tintersectsRange,\n\t\t\tintersectsPrimitive,\n\t\t\tscratchPrimitive,\n\t\t\titerate,\n\t\t} = callbacks;\n\n\t\t// wrap the intersectsRange function\n\t\tif ( intersectsRange && intersectsPrimitive ) {\n\n\t\t\tconst originalIntersectsRange = intersectsRange;\n\t\t\tintersectsRange = ( offset, count, contained, depth, nodeIndex ) => {\n\n\t\t\t\tif ( ! originalIntersectsRange( offset, count, contained, depth, nodeIndex ) ) {\n\n\t\t\t\t\treturn iterate( offset, count, this, intersectsPrimitive, contained, depth, scratchPrimitive );\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t} else if ( ! intersectsRange ) {\n\n\t\t\tif ( intersectsPrimitive ) {\n\n\t\t\t\tintersectsRange = ( offset, count, contained, depth ) => {\n\n\t\t\t\t\treturn iterate( offset, count, this, intersectsPrimitive, contained, depth, scratchPrimitive );\n\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tintersectsRange = ( offset, count, contained ) => {\n\n\t\t\t\t\treturn contained;\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t// run shapecast\n\t\tlet result = false;\n\t\tlet nodeOffset = 0;\n\t\tconst roots = this._roots;\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\t\tconst root = roots[ i ];\n\t\t\tresult = shapecastFunc( this, i, intersectsBounds, intersectsRange, boundsTraverseOrder, nodeOffset );\n\n\t\t\tif ( result ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tnodeOffset += root.byteLength / BYTES_PER_NODE;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tbvhcast( otherBvh, matrixToLocal, callbacks ) {\n\n\t\tlet { intersectsRanges } = callbacks;\n\t\treturn bvhcast( this, otherBvh, matrixToLocal, intersectsRanges );\n\n\n\t}\n\n}\n","export function isSharedArrayBufferSupported() {\n\n\treturn typeof SharedArrayBuffer !== 'undefined';\n\n}\n\nexport function convertToBufferType( array, BufferConstructor ) {\n\n\tif ( array === null ) {\n\n\t\treturn array;\n\n\t} else if ( array.buffer ) {\n\n\t\tconst buffer = array.buffer;\n\t\tif ( buffer.constructor === BufferConstructor ) {\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tconst ArrayConstructor = array.constructor;\n\t\tconst result = new ArrayConstructor( new BufferConstructor( buffer.byteLength ) );\n\t\tresult.set( array );\n\t\treturn result;\n\n\t} else {\n\n\t\tif ( array.constructor === BufferConstructor ) {\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tconst result = new BufferConstructor( array.byteLength );\n\t\tnew Uint8Array( result ).set( new Uint8Array( array ) );\n\t\treturn result;\n\n\t}\n\n}\n","import { BufferAttribute } from 'three';\n\nexport function getVertexCount( geo ) {\n\n\treturn geo.index ? geo.index.count : geo.attributes.position.count;\n\n}\n\nexport function getTriCount( geo ) {\n\n\treturn getVertexCount( geo ) / 3;\n\n}\n\nexport function getIndexArray( vertexCount, BufferConstructor = ArrayBuffer ) {\n\n\tif ( vertexCount > 65535 ) {\n\n\t\treturn new Uint32Array( new BufferConstructor( 4 * vertexCount ) );\n\n\t} else {\n\n\t\treturn new Uint16Array( new BufferConstructor( 2 * vertexCount ) );\n\n\t}\n\n}\n\n// ensures that an index is present on the geometry\nexport function ensureIndex( geo, options ) {\n\n\tif ( ! geo.index ) {\n\n\t\tconst vertexCount = geo.attributes.position.count;\n\t\tconst BufferConstructor = options.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer;\n\t\tconst index = getIndexArray( vertexCount, BufferConstructor );\n\t\tgeo.setIndex( new BufferAttribute( index, 1 ) );\n\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\tindex[ i ] = i;\n\n\t\t}\n\n\t}\n\n}\n\n// Computes the set of { offset, count } ranges which need independent BVH roots. Each\n// region in the geometry index that belongs to a different set of material groups requires\n// a separate BVH root, so that triangles indices belonging to one group never get swapped\n// with triangle indices belongs to another group. For example, if the groups were like this:\n//\n// [-------------------------------------------------------------]\n// |__________________|\n//   g0 = [0, 20]  |______________________||_____________________|\n//                      g1 = [16, 40]           g2 = [41, 60]\n//\n// we would need four BVH roots: [0, 15], [16, 20], [21, 40], [41, 60].\nfunction getFullPrimitiveRange( geo, range, stride ) {\n\n\tconst primitiveCount = getVertexCount( geo ) / stride;\n\tconst drawRange = range ? range : geo.drawRange;\n\tconst start = drawRange.start / stride;\n\tconst end = ( drawRange.start + drawRange.count ) / stride;\n\n\tconst offset = Math.max( 0, start );\n\tconst count = Math.min( primitiveCount, end ) - offset;\n\treturn {\n\t\toffset: Math.floor( offset ),\n\t\tcount: Math.floor( count ),\n\t};\n\n}\n\nfunction getPrimitiveGroupRanges( geo, stride ) {\n\n\treturn geo.groups.map( group => ( {\n\t\toffset: group.start / stride,\n\t\tcount: group.count / stride,\n\t} ));\n\n}\n\n// Function that extracts a set of mutually exclusive ranges representing the primitives being\n// drawn as determined by the geometry groups, draw range, and user specified range\nexport function getRootPrimitiveRanges( geo, range, stride ) {\n\n\tconst drawRange = getFullPrimitiveRange( geo, range, stride );\n\tconst primitiveRanges = getPrimitiveGroupRanges( geo, stride );\n\tif ( ! primitiveRanges.length ) {\n\n\t\treturn [ drawRange ];\n\n\t}\n\n\tconst ranges = [];\n\tconst drawRangeStart = drawRange.offset;\n\tconst drawRangeEnd = drawRange.offset + drawRange.count;\n\n\t// Create events for group boundaries\n\tconst primitiveCount = getVertexCount( geo ) / stride;\n\tconst events = [];\n\tfor ( const group of primitiveRanges ) {\n\n\t\t// Account for cases where group size is set to Infinity\n\t\tconst { offset, count } = group;\n\t\tconst groupStart = offset;\n\t\tconst groupCount = isFinite( count ) ? count : ( primitiveCount - offset );\n\t\tconst groupEnd = ( offset + groupCount );\n\n\t\t// Only add events if the group intersects with the draw range\n\t\tif ( groupStart < drawRangeEnd && groupEnd > drawRangeStart ) {\n\n\t\t\tevents.push( { pos: Math.max( drawRangeStart, groupStart ), isStart: true } );\n\t\t\tevents.push( { pos: Math.min( drawRangeEnd, groupEnd ), isStart: false } );\n\n\t\t}\n\n\t}\n\n\t// Sort events by position, with 'end' events before 'start' events at the same position\n\tevents.sort( ( a, b ) => {\n\n\t\tif ( a.pos !== b.pos ) {\n\n\t\t\treturn a.pos - b.pos;\n\n\t\t} else {\n\n\t\t\treturn a.type === 'end' ? - 1 : 1;\n\n\t\t}\n\n\t} );\n\n\t// sweep through events and create ranges where activeGroups > 0\n\tlet activeGroups = 0;\n\tlet lastPos = null;\n\tfor ( const event of events ) {\n\n\t\tconst newPos = event.pos;\n\t\tif ( activeGroups !== 0 && newPos !== lastPos ) {\n\n\t\t\tranges.push( {\n\t\t\t\toffset: lastPos,\n\t\t\t\tcount: newPos - lastPos,\n\t\t\t} );\n\n\t\t}\n\n\t\tactiveGroups += event.isStart ? 1 : - 1;\n\t\tlastPos = newPos;\n\n\t}\n\n\treturn ranges;\n\n}\n","import { Box3 } from 'three';\nimport { SKIP_GENERATION, DEFAULT_OPTIONS } from './Constants.js';\nimport { isSharedArrayBufferSupported } from '../utils/BufferUtils.js';\nimport { ensureIndex, getRootPrimitiveRanges } from './build/geometryUtils.js';\nimport { BVH } from './BVH.js';\n\n// construct a new buffer that points to the set of triangles represented by the given ranges\nexport function generateIndirectBuffer( ranges, useSharedArrayBuffer ) {\n\n\tconst lastRange = ranges[ ranges.length - 1 ];\n\tconst useUint32 = lastRange.offset + lastRange.count > 2 ** 16;\n\n\t// use getRootIndexRanges which excludes gaps\n\tconst length = ranges.reduce( ( acc, val ) => acc + val.count, 0 );\n\tconst byteCount = useUint32 ? 4 : 2;\n\tconst buffer = useSharedArrayBuffer ? new SharedArrayBuffer( length * byteCount ) : new ArrayBuffer( length * byteCount );\n\tconst indirectBuffer = useUint32 ? new Uint32Array( buffer ) : new Uint16Array( buffer );\n\n\t// construct a compact form of the triangles in these ranges\n\tlet index = 0;\n\tfor ( let r = 0; r < ranges.length; r ++ ) {\n\n\t\tconst { offset, count } = ranges[ r ];\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tindirectBuffer[ index + i ] = offset + i;\n\n\t\t}\n\n\t\tindex += count;\n\n\t}\n\n\treturn indirectBuffer;\n\n}\n\nexport class GeometryBVH extends BVH {\n\n\tget indirect() {\n\n\t\treturn ! ! this._indirectBuffer;\n\n\t}\n\n\tget primitiveStride() {\n\n\t\treturn null;\n\n\t}\n\n\tget primitiveBufferStride() {\n\n\t\treturn this.indirect ? 1 : this.primitiveStride;\n\n\t}\n\tset primitiveBufferStride( v ) {}\n\n\tget primitiveBuffer() {\n\n\t\treturn this.indirect ? this._indirectBuffer : this.geometry.index.array;\n\n\t}\n\tset primitiveBuffer( v ) {}\n\n\tconstructor( geometry, options = {} ) {\n\n\t\tif ( ! geometry.isBufferGeometry ) {\n\n\t\t\tthrow new Error( 'BVH: Only BufferGeometries are supported.' );\n\n\t\t} else if ( geometry.index && geometry.index.isInterleavedBufferAttribute ) {\n\n\t\t\tthrow new Error( 'BVH: InterleavedBufferAttribute is not supported for the index attribute.' );\n\n\t\t}\n\n\t\tif ( options.useSharedArrayBuffer && ! isSharedArrayBufferSupported() ) {\n\n\t\t\tthrow new Error( 'BVH: SharedArrayBuffer is not available.' );\n\n\t\t}\n\n\t\tsuper();\n\n\t\t// retain references to the geometry so we can use them it without having to\n\t\t// take a geometry reference in every function.\n\t\tthis.geometry = geometry;\n\t\tthis.resolvePrimitiveIndex = options.indirect ? i => this._indirectBuffer[ i ] : i => i;\n\t\tthis.primitiveBuffer = null;\n\t\tthis.primitiveBufferStride = null;\n\t\tthis._indirectBuffer = null;\n\n\t\toptions = {\n\t\t\t...DEFAULT_OPTIONS,\n\t\t\t...options,\n\t\t};\n\n\t\t// build the BVH unless we're deserializing\n\t\tif ( ! options[ SKIP_GENERATION ] ) {\n\n\t\t\tthis.init( options );\n\n\t\t}\n\n\t}\n\n\tinit( options ) {\n\n\t\tconst { geometry, primitiveStride } = this;\n\n\t\tif ( options.indirect ) {\n\n\t\t\t// construct an buffer that is indirectly sorts the triangles used for the BVH\n\t\t\tconst ranges = getRootPrimitiveRanges( geometry, options.range, primitiveStride );\n\t\t\tconst indirectBuffer = generateIndirectBuffer( ranges, options.useSharedArrayBuffer );\n\t\t\tthis._indirectBuffer = indirectBuffer;\n\n\t\t} else {\n\n\t\t\tensureIndex( geometry, options );\n\n\t\t}\n\n\t\tsuper.init( options );\n\n\t\tif ( ! geometry.boundingBox && options.setBoundingBox ) {\n\n\t\t\tgeometry.boundingBox = this.getBoundingBox( new Box3() );\n\n\t\t}\n\n\t}\n\n\t// Abstract methods to be implemented by subclasses\n\tgetRootRanges( range ) {\n\n\t\t// TODO: can we avoid passing options in here\n\t\tif ( this.indirect ) {\n\n\t\t\treturn [ { offset: 0, count: this._indirectBuffer.length } ];\n\n\n\t\t} else {\n\n\t\t\treturn getRootPrimitiveRanges( this.geometry, range, this.primitiveStride );\n\n\t\t}\n\n\t}\n\n\traycastObject3D( /* object, raycaster, intersects = [] */ ) {\n\n\t\tthrow new Error( 'BVH: raycastObject3D() not implemented' );\n\n\t}\n\n}\n","import { Vector3 } from 'three';\n\nexport class SeparatingAxisBounds {\n\n\tconstructor() {\n\n\t\tthis.min = Infinity;\n\t\tthis.max = - Infinity;\n\n\t}\n\n\tsetFromPointsField( points, field ) {\n\n\t\tlet min = Infinity;\n\t\tlet max = - Infinity;\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst p = points[ i ];\n\t\t\tconst val = p[ field ];\n\t\t\tmin = val < min ? val : min;\n\t\t\tmax = val > max ? val : max;\n\n\t\t}\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tsetFromPoints( axis, points ) {\n\n\t\tlet min = Infinity;\n\t\tlet max = - Infinity;\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst p = points[ i ];\n\t\t\tconst val = axis.dot( p );\n\t\t\tmin = val < min ? val : min;\n\t\t\tmax = val > max ? val : max;\n\n\t\t}\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tisSeparated( other ) {\n\n\t\treturn this.min > other.max || other.min > this.max;\n\n\t}\n\n}\n\nSeparatingAxisBounds.prototype.setFromBox = ( function () {\n\n\tconst p = /* @__PURE__ */ new Vector3();\n\treturn function setFromBox( axis, box ) {\n\n\t\tconst boxMin = box.min;\n\t\tconst boxMax = box.max;\n\t\tlet min = Infinity;\n\t\tlet max = - Infinity;\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\n\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\n\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\n\n\t\t\t\t\tp.x = boxMin.x * x + boxMax.x * ( 1 - x );\n\t\t\t\t\tp.y = boxMin.y * y + boxMax.y * ( 1 - y );\n\t\t\t\t\tp.z = boxMin.z * z + boxMax.z * ( 1 - z );\n\n\t\t\t\t\tconst val = axis.dot( p );\n\t\t\t\t\tmin = Math.min( val, min );\n\t\t\t\t\tmax = Math.max( val, max );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t};\n\n} )();\n\nexport const areIntersecting = ( function () {\n\n\tconst cacheSatBounds = /* @__PURE__ */ new SeparatingAxisBounds();\n\treturn function areIntersecting( shape1, shape2 ) {\n\n\t\tconst points1 = shape1.points;\n\t\tconst satAxes1 = shape1.satAxes;\n\t\tconst satBounds1 = shape1.satBounds;\n\n\t\tconst points2 = shape2.points;\n\t\tconst satAxes2 = shape2.satAxes;\n\t\tconst satBounds2 = shape2.satBounds;\n\n\t\t// check axes of the first shape\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst sb = satBounds1[ i ];\n\t\t\tconst sa = satAxes1[ i ];\n\t\t\tcacheSatBounds.setFromPoints( sa, points2 );\n\t\t\tif ( sb.isSeparated( cacheSatBounds ) ) return false;\n\n\t\t}\n\n\t\t// check axes of the second shape\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst sb = satBounds2[ i ];\n\t\t\tconst sa = satAxes2[ i ];\n\t\t\tcacheSatBounds.setFromPoints( sa, points1 );\n\t\t\tif ( sb.isSeparated( cacheSatBounds ) ) return false;\n\n\t\t}\n\n\t};\n\n} )();\n","import { Vector3, Vector2, Plane, Line3 } from 'three';\n\nexport const closestPointLineToLine = ( function () {\n\n\t// https://github.com/juj/MathGeoLib/blob/master/src/Geometry/Line.cpp#L56\n\tconst dir1 = /* @__PURE__ */ new Vector3();\n\tconst dir2 = /* @__PURE__ */ new Vector3();\n\tconst v02 = /* @__PURE__ */ new Vector3();\n\treturn function closestPointLineToLine( l1, l2, result ) {\n\n\t\tconst v0 = l1.start;\n\t\tconst v10 = dir1;\n\t\tconst v2 = l2.start;\n\t\tconst v32 = dir2;\n\n\t\tv02.subVectors( v0, v2 );\n\t\tdir1.subVectors( l1.end, l1.start );\n\t\tdir2.subVectors( l2.end, l2.start );\n\n\t\t// float d0232 = v02.Dot(v32);\n\t\tconst d0232 = v02.dot( v32 );\n\n\t\t// float d3210 = v32.Dot(v10);\n\t\tconst d3210 = v32.dot( v10 );\n\n\t\t// float d3232 = v32.Dot(v32);\n\t\tconst d3232 = v32.dot( v32 );\n\n\t\t// float d0210 = v02.Dot(v10);\n\t\tconst d0210 = v02.dot( v10 );\n\n\t\t// float d1010 = v10.Dot(v10);\n\t\tconst d1010 = v10.dot( v10 );\n\n\t\t// float denom = d1010*d3232 - d3210*d3210;\n\t\tconst denom = d1010 * d3232 - d3210 * d3210;\n\n\t\tlet d, d2;\n\t\tif ( denom !== 0 ) {\n\n\t\t\td = ( d0232 * d3210 - d0210 * d3232 ) / denom;\n\n\t\t} else {\n\n\t\t\td = 0;\n\n\t\t}\n\n\t\td2 = ( d0232 + d * d3210 ) / d3232;\n\n\t\tresult.x = d;\n\t\tresult.y = d2;\n\n\t};\n\n} )();\n\nexport const closestPointsSegmentToSegment = ( function () {\n\n\t// https://github.com/juj/MathGeoLib/blob/master/src/Geometry/LineSegment.cpp#L187\n\tconst paramResult = /* @__PURE__ */ new Vector2();\n\tconst temp1 = /* @__PURE__ */ new Vector3();\n\tconst temp2 = /* @__PURE__ */ new Vector3();\n\treturn function closestPointsSegmentToSegment( l1, l2, target1, target2 ) {\n\n\t\tclosestPointLineToLine( l1, l2, paramResult );\n\n\t\tlet d = paramResult.x;\n\t\tlet d2 = paramResult.y;\n\t\tif ( d >= 0 && d <= 1 && d2 >= 0 && d2 <= 1 ) {\n\n\t\t\tl1.at( d, target1 );\n\t\t\tl2.at( d2, target2 );\n\n\t\t\treturn;\n\n\t\t} else if ( d >= 0 && d <= 1 ) {\n\n\t\t\t// Only d2 is out of bounds.\n\t\t\tif ( d2 < 0 ) {\n\n\t\t\t\tl2.at( 0, target2 );\n\n\t\t\t} else {\n\n\t\t\t\tl2.at( 1, target2 );\n\n\t\t\t}\n\n\t\t\tl1.closestPointToPoint( target2, true, target1 );\n\t\t\treturn;\n\n\t\t} else if ( d2 >= 0 && d2 <= 1 ) {\n\n\t\t\t// Only d is out of bounds.\n\t\t\tif ( d < 0 ) {\n\n\t\t\t\tl1.at( 0, target1 );\n\n\t\t\t} else {\n\n\t\t\t\tl1.at( 1, target1 );\n\n\t\t\t}\n\n\t\t\tl2.closestPointToPoint( target1, true, target2 );\n\t\t\treturn;\n\n\t\t} else {\n\n\t\t\t// Both u and u2 are out of bounds.\n\t\t\tlet p;\n\t\t\tif ( d < 0 ) {\n\n\t\t\t\tp = l1.start;\n\n\t\t\t} else {\n\n\t\t\t\tp = l1.end;\n\n\t\t\t}\n\n\t\t\tlet p2;\n\t\t\tif ( d2 < 0 ) {\n\n\t\t\t\tp2 = l2.start;\n\n\t\t\t} else {\n\n\t\t\t\tp2 = l2.end;\n\n\t\t\t}\n\n\t\t\tconst closestPoint = temp1;\n\t\t\tconst closestPoint2 = temp2;\n\t\t\tl1.closestPointToPoint( p2, true, temp1 );\n\t\t\tl2.closestPointToPoint( p, true, temp2 );\n\n\t\t\tif ( closestPoint.distanceToSquared( p2 ) <= closestPoint2.distanceToSquared( p ) ) {\n\n\t\t\t\ttarget1.copy( closestPoint );\n\t\t\t\ttarget2.copy( p2 );\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\ttarget1.copy( p );\n\t\t\t\ttarget2.copy( closestPoint2 );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n} )();\n\n\nexport const sphereIntersectTriangle = ( function () {\n\n\t// https://stackoverflow.com/questions/34043955/detect-collision-between-sphere-and-triangle-in-three-js\n\tconst closestPointTemp = /* @__PURE__ */ new Vector3();\n\tconst projectedPointTemp = /* @__PURE__ */ new Vector3();\n\tconst planeTemp = /* @__PURE__ */ new Plane();\n\tconst lineTemp = /* @__PURE__ */ new Line3();\n\treturn function sphereIntersectTriangle( sphere, triangle ) {\n\n\t\tconst { radius, center } = sphere;\n\t\tconst { a, b, c } = triangle;\n\n\t\t// phase 1\n\t\tlineTemp.start = a;\n\t\tlineTemp.end = b;\n\t\tconst closestPoint1 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\n\t\tif ( closestPoint1.distanceTo( center ) <= radius ) return true;\n\n\t\tlineTemp.start = a;\n\t\tlineTemp.end = c;\n\t\tconst closestPoint2 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\n\t\tif ( closestPoint2.distanceTo( center ) <= radius ) return true;\n\n\t\tlineTemp.start = b;\n\t\tlineTemp.end = c;\n\t\tconst closestPoint3 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\n\t\tif ( closestPoint3.distanceTo( center ) <= radius ) return true;\n\n\t\t// phase 2\n\t\tconst plane = triangle.getPlane( planeTemp );\n\t\tconst dp = Math.abs( plane.distanceToPoint( center ) );\n\t\tif ( dp <= radius ) {\n\n\t\t\tconst pp = plane.projectPoint( center, projectedPointTemp );\n\t\t\tconst cp = triangle.containsPoint( pp );\n\t\t\tif ( cp ) return true;\n\n\t\t}\n\n\t\treturn false;\n\n\t};\n\n} )();\n","import { Triangle, Vector3, Vector2, Line3, Plane } from 'three';\nimport { SeparatingAxisBounds } from './SeparatingAxisBounds.js';\nimport { closestPointsSegmentToSegment, sphereIntersectTriangle } from './MathUtilities.js';\n\nconst componentKeys = [ 'x', 'y', 'z' ];\nconst ZERO_EPSILON = 1e-15;\nconst ZERO_EPSILON_SQR = ZERO_EPSILON * ZERO_EPSILON;\nfunction isNearZero( value ) {\n\n\treturn Math.abs( value ) < ZERO_EPSILON;\n\n}\n\nexport class ExtendedTriangle extends Triangle {\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\n\t\tthis.isExtendedTriangle = true;\n\t\tthis.satAxes = new Array( 4 ).fill().map( () => new Vector3() );\n\t\tthis.satBounds = new Array( 4 ).fill().map( () => new SeparatingAxisBounds() );\n\t\tthis.points = [ this.a, this.b, this.c ];\n\t\tthis.plane = new Plane();\n\t\tthis.isDegenerateIntoSegment = false;\n\t\tthis.isDegenerateIntoPoint = false;\n\t\tthis.degenerateSegment = new Line3();\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphereIntersectTriangle( sphere, this );\n\n\t}\n\n\tupdate() {\n\n\t\tconst a = this.a;\n\t\tconst b = this.b;\n\t\tconst c = this.c;\n\t\tconst points = this.points;\n\n\t\tconst satAxes = this.satAxes;\n\t\tconst satBounds = this.satBounds;\n\n\t\tconst axis0 = satAxes[ 0 ];\n\t\tconst sab0 = satBounds[ 0 ];\n\t\tthis.getNormal( axis0 );\n\t\tsab0.setFromPoints( axis0, points );\n\n\t\tconst axis1 = satAxes[ 1 ];\n\t\tconst sab1 = satBounds[ 1 ];\n\t\taxis1.subVectors( a, b );\n\t\tsab1.setFromPoints( axis1, points );\n\n\t\tconst axis2 = satAxes[ 2 ];\n\t\tconst sab2 = satBounds[ 2 ];\n\t\taxis2.subVectors( b, c );\n\t\tsab2.setFromPoints( axis2, points );\n\n\t\tconst axis3 = satAxes[ 3 ];\n\t\tconst sab3 = satBounds[ 3 ];\n\t\taxis3.subVectors( c, a );\n\t\tsab3.setFromPoints( axis3, points );\n\n\t\tconst lengthAB = axis1.length();\n\t\tconst lengthBC = axis2.length();\n\t\tconst lengthCA = axis3.length();\n\n\t\tthis.isDegenerateIntoPoint = false;\n\t\tthis.isDegenerateIntoSegment = false;\n\n\t\tif ( lengthAB < ZERO_EPSILON ) {\n\n\t\t\tif ( lengthBC < ZERO_EPSILON || lengthCA < ZERO_EPSILON ) {\n\n\t\t\t\tthis.isDegenerateIntoPoint = true;\n\n\t\t\t} else {\n\n\t\t\t\tthis.isDegenerateIntoSegment = true;\n\t\t\t\tthis.degenerateSegment.start.copy( a );\n\t\t\t\tthis.degenerateSegment.end.copy( c );\n\n\t\t\t}\n\n\t\t} else if ( lengthBC < ZERO_EPSILON ) {\n\n\t\t\tif ( lengthCA < ZERO_EPSILON ) {\n\n\t\t\t\tthis.isDegenerateIntoPoint = true;\n\n\t\t\t} else {\n\n\t\t\t\tthis.isDegenerateIntoSegment = true;\n\t\t\t\tthis.degenerateSegment.start.copy( b );\n\t\t\t\tthis.degenerateSegment.end.copy( a );\n\n\t\t\t}\n\n\t\t} else if ( lengthCA < ZERO_EPSILON ) {\n\n\t\t\tthis.isDegenerateIntoSegment = true;\n\t\t\tthis.degenerateSegment.start.copy( c );\n\t\t\tthis.degenerateSegment.end.copy( b );\n\n\t\t}\n\n\t\tthis.plane.setFromNormalAndCoplanarPoint( axis0, a );\n\n\t\tthis.needsUpdate = false;\n\n\t}\n\n}\n\nExtendedTriangle.prototype.closestPointToSegment = ( function () {\n\n\tconst point1 = /* @__PURE__ */ new Vector3();\n\tconst point2 = /* @__PURE__ */ new Vector3();\n\tconst edge = /* @__PURE__ */ new Line3();\n\n\treturn function distanceToSegment( segment, target1 = null, target2 = null ) {\n\n\t\tconst { start, end } = segment;\n\t\tconst points = this.points;\n\t\tlet distSq;\n\t\tlet closestDistanceSq = Infinity;\n\n\t\t// check the triangle edges\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst nexti = ( i + 1 ) % 3;\n\t\t\tedge.start.copy( points[ i ] );\n\t\t\tedge.end.copy( points[ nexti ] );\n\n\t\t\tclosestPointsSegmentToSegment( edge, segment, point1, point2 );\n\n\t\t\tdistSq = point1.distanceToSquared( point2 );\n\t\t\tif ( distSq < closestDistanceSq ) {\n\n\t\t\t\tclosestDistanceSq = distSq;\n\t\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// check end points\n\t\tthis.closestPointToPoint( start, point1 );\n\t\tdistSq = start.distanceToSquared( point1 );\n\t\tif ( distSq < closestDistanceSq ) {\n\n\t\t\tclosestDistanceSq = distSq;\n\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\tif ( target2 ) target2.copy( start );\n\n\t\t}\n\n\t\tthis.closestPointToPoint( end, point1 );\n\t\tdistSq = end.distanceToSquared( point1 );\n\t\tif ( distSq < closestDistanceSq ) {\n\n\t\t\tclosestDistanceSq = distSq;\n\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\tif ( target2 ) target2.copy( end );\n\n\t\t}\n\n\t\treturn Math.sqrt( closestDistanceSq );\n\n\t};\n\n} )();\n\nExtendedTriangle.prototype.intersectsTriangle = ( function () {\n\n\tconst saTri2 = /* @__PURE__ */ new ExtendedTriangle();\n\tconst cachedSatBounds = /* @__PURE__ */ new SeparatingAxisBounds();\n\tconst cachedSatBounds2 = /* @__PURE__ */ new SeparatingAxisBounds();\n\tconst tmpVec = /* @__PURE__ */ new Vector3();\n\tconst dir1 = /* @__PURE__ */ new Vector3();\n\tconst dir2 = /* @__PURE__ */ new Vector3();\n\tconst tempDir = /* @__PURE__ */ new Vector3();\n\tconst edge1 = /* @__PURE__ */ new Line3();\n\tconst edge2 = /* @__PURE__ */ new Line3();\n\tconst tempPoint = /* @__PURE__ */ new Vector3();\n\tconst bounds1 = /* @__PURE__ */ new Vector2();\n\tconst bounds2 = /* @__PURE__ */ new Vector2();\n\n\tfunction coplanarIntersectsTriangle( self, other, target, suppressLog ) {\n\n\t\t// Perform separating axis intersection test only for coplanar triangles\n\t\t// There should be at least one non-degenerate triangle when calling this\n\t\t// Otherwise we won't know the plane normal\n\t\tconst planeNormal = tmpVec;\n\t\tif ( ! self.isDegenerateIntoPoint && ! self.isDegenerateIntoSegment ) {\n\n\t\t\tplaneNormal.copy( self.plane.normal );\n\n\t\t} else {\n\n\t\t\tplaneNormal.copy( other.plane.normal );\n\n\t\t}\n\n\t\tconst satBounds1 = self.satBounds;\n\t\tconst satAxes1 = self.satAxes;\n\t\tfor ( let i = 1; i < 4; i ++ ) {\n\n\t\t\tconst sb = satBounds1[ i ];\n\t\t\tconst sa = satAxes1[ i ];\n\t\t\tcachedSatBounds.setFromPoints( sa, other.points );\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\n\n\t\t\ttempDir.copy( planeNormal ).cross( sa );\n\t\t\tcachedSatBounds.setFromPoints( tempDir, self.points );\n\t\t\tcachedSatBounds2.setFromPoints( tempDir, other.points );\n\t\t\tif ( cachedSatBounds.isSeparated( cachedSatBounds2 ) ) return false;\n\n\t\t}\n\n\t\tconst satBounds2 = other.satBounds;\n\t\tconst satAxes2 = other.satAxes;\n\t\tfor ( let i = 1; i < 4; i ++ ) {\n\n\t\t\tconst sb = satBounds2[ i ];\n\t\t\tconst sa = satAxes2[ i ];\n\t\t\tcachedSatBounds.setFromPoints( sa, self.points );\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\n\n\t\t\ttempDir.crossVectors( planeNormal, sa );\n\t\t\tcachedSatBounds.setFromPoints( tempDir, self.points );\n\t\t\tcachedSatBounds2.setFromPoints( tempDir, other.points );\n\t\t\tif ( cachedSatBounds.isSeparated( cachedSatBounds2 ) ) return false;\n\n\t\t}\n\n\t\tif ( target ) {\n\n\t\t\t// TODO find two points that intersect on the edges and make that the result\n\t\t\tif ( ! suppressLog ) {\n\n\t\t\t\tconsole.warn( 'ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0.' );\n\n\t\t\t}\n\n\t\t\ttarget.start.set( 0, 0, 0 );\n\t\t\ttarget.end.set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction findSingleBounds( a, b, c, aProj, bProj, cProj, aDist, bDist, cDist, bounds, edge ) {\n\n\t\tlet t = aDist / ( aDist - bDist );\n\t\tbounds.x = aProj + ( bProj - aProj ) * t;\n\t\tedge.start.subVectors( b, a ).multiplyScalar( t ).add( a );\n\n\t\tt = aDist / ( aDist - cDist );\n\t\tbounds.y = aProj + ( cProj - aProj ) * t;\n\t\tedge.end.subVectors( c, a ).multiplyScalar( t ).add( a );\n\n\t}\n\n\t/**\n\t * Calculates intersection segment of a triangle with intersection line.\n\t * Intersection line is snapped to its biggest component.\n\t * And triangle points are passed as a projection on that component.\n\t * @returns whether this is a coplanar case or not\n\t */\n\tfunction findIntersectionLineBounds( self, aProj, bProj, cProj, abDist, acDist, aDist, bDist, cDist, bounds, edge ) {\n\n\t\tif ( abDist > 0 ) {\n\n\t\t\t// then bcDist < 0\n\t\t\tfindSingleBounds( self.c, self.a, self.b, cProj, aProj, bProj, cDist, aDist, bDist, bounds, edge );\n\n\t\t} else if ( acDist > 0 ) {\n\n\t\t\tfindSingleBounds( self.b, self.a, self.c, bProj, aProj, cProj, bDist, aDist, cDist, bounds, edge );\n\n\t\t} else if ( bDist * cDist > 0 || aDist != 0 ) {\n\n\t\t\tfindSingleBounds( self.a, self.b, self.c, aProj, bProj, cProj, aDist, bDist, cDist, bounds, edge );\n\n\t\t} else if ( bDist != 0 ) {\n\n\t\t\tfindSingleBounds( self.b, self.a, self.c, bProj, aProj, cProj, bDist, aDist, cDist, bounds, edge );\n\n\t\t} else if ( cDist != 0 ) {\n\n\t\t\tfindSingleBounds( self.c, self.a, self.b, cProj, aProj, bProj, cDist, aDist, bDist, bounds, edge );\n\n\t\t} else {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction intersectTriangleSegment( triangle, degenerateTriangle, target, suppressLog ) {\n\n\t\tconst segment = degenerateTriangle.degenerateSegment;\n\t\tconst startDist = triangle.plane.distanceToPoint( segment.start );\n\t\tconst endDist = triangle.plane.distanceToPoint( segment.end );\n\t\tif ( isNearZero( startDist ) ) {\n\n\t\t\tif ( isNearZero( endDist ) ) {\n\n\t\t\t\treturn coplanarIntersectsTriangle( triangle, degenerateTriangle, target, suppressLog );\n\n\t\t\t} else {\n\n\t\t\t\t// Is this fine to modify target even if there might be no intersection?\n\t\t\t\tif ( target ) {\n\n\t\t\t\t\ttarget.start.copy( segment.start );\n\t\t\t\t\ttarget.end.copy( segment.start );\n\n\t\t\t\t}\n\n\t\t\t\treturn triangle.containsPoint( segment.start );\n\n\t\t\t}\n\n\t\t} else if ( isNearZero( endDist ) ) {\n\n\t\t\tif ( target ) {\n\n\t\t\t\ttarget.start.copy( segment.end );\n\t\t\t\ttarget.end.copy( segment.end );\n\n\t\t\t}\n\n\t\t\treturn triangle.containsPoint( segment.end );\n\n\t\t} else {\n\n\t\t\tif ( triangle.plane.intersectLine( segment, tmpVec ) != null ) {\n\n\t\t\t\tif ( target ) {\n\n\t\t\t\t\ttarget.start.copy( tmpVec );\n\t\t\t\t\ttarget.end.copy( tmpVec );\n\n\t\t\t\t}\n\n\t\t\t\treturn triangle.containsPoint( tmpVec );\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction intersectTrianglePoint( triangle, degenerateTriangle, target ) {\n\n\t\tconst point = degenerateTriangle.a;\n\n\t\tif ( isNearZero( triangle.plane.distanceToPoint( point ) ) && triangle.containsPoint( point ) ) {\n\n\t\t\tif ( target ) {\n\n\t\t\t\ttarget.start.copy( point );\n\t\t\t\ttarget.end.copy( point );\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\tfunction intersectSegmentPoint( segmentTri, pointTri, target ) {\n\n\t\tconst segment = segmentTri.degenerateSegment;\n\t\tconst point = pointTri.a;\n\n\t\tsegment.closestPointToPoint( point, true, tmpVec );\n\n\t\tif ( point.distanceToSquared( tmpVec ) < ZERO_EPSILON_SQR ) {\n\n\t\t\tif ( target ) {\n\n\t\t\t\ttarget.start.copy( point );\n\t\t\t\ttarget.end.copy( point );\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\tfunction handleDegenerateCases( self, other, target, suppressLog ) {\n\n\t\tif ( self.isDegenerateIntoSegment ) {\n\n\t\t\tif ( other.isDegenerateIntoSegment ) {\n\n\t\t\t\t// TODO: replace with Line.distanceSqToLine3 after r179\n\t\t\t\tconst segment1 = self.degenerateSegment;\n\t\t\t\tconst segment2 = other.degenerateSegment;\n\t\t\t\tconst delta1 = dir1;\n\t\t\t\tconst delta2 = dir2;\n\t\t\t\tsegment1.delta( delta1 );\n\t\t\t\tsegment2.delta( delta2 );\n\t\t\t\tconst startDelta = tmpVec.subVectors( segment2.start, segment1.start );\n\n\t\t\t\tconst denom = delta1.x * delta2.y - delta1.y * delta2.x;\n\t\t\t\tif ( isNearZero( denom ) ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\tconst t = ( startDelta.x * delta2.y - startDelta.y * delta2.x ) / denom;\n\t\t\t\tconst u = - ( delta1.x * startDelta.y - delta1.y * startDelta.x ) / denom;\n\n\t\t\t\tif ( t < 0 || t > 1 || u < 0 || u > 1 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\tconst z1 = segment1.start.z + delta1.z * t;\n\t\t\t\tconst z2 = segment2.start.z + delta2.z * u;\n\n\t\t\t\tif ( isNearZero( z1 - z2 ) ) {\n\n\t\t\t\t\tif ( target ) {\n\n\t\t\t\t\t\ttarget.start.copy( segment1.start ).addScaledVector( delta1, t );\n\t\t\t\t\t\ttarget.end.copy( segment1.start ).addScaledVector( delta1, t );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t} else if ( other.isDegenerateIntoPoint ) {\n\n\t\t\t\treturn intersectSegmentPoint( self, other, target );\n\n\t\t\t} else {\n\n\t\t\t\treturn intersectTriangleSegment( other, self, target, suppressLog );\n\n\t\t\t}\n\n\t\t} else if ( self.isDegenerateIntoPoint ) {\n\n\t\t\tif ( other.isDegenerateIntoPoint ) {\n\n\t\t\t\tif ( other.a.distanceToSquared( self.a ) < ZERO_EPSILON_SQR ) {\n\n\t\t\t\t\tif ( target ) {\n\n\t\t\t\t\t\ttarget.start.copy( self.a );\n\t\t\t\t\t\ttarget.end.copy( self.a );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t} else if ( other.isDegenerateIntoSegment ) {\n\n\t\t\t\treturn intersectSegmentPoint( other, self, target );\n\n\t\t\t} else {\n\n\t\t\t\treturn intersectTrianglePoint( other, self, target );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( other.isDegenerateIntoPoint ) {\n\n\t\t\t\treturn intersectTrianglePoint( self, other, target );\n\n\t\t\t} else if ( other.isDegenerateIntoSegment ) {\n\n\t\t\t\treturn intersectTriangleSegment( self, other, target, suppressLog );\n\n\t\t\t} /* else this is a general triangle-traingle case, so return undefined */\n\n\t\t}\n\n\t}\n\n\t/* TODO: If the triangles are coplanar and intersecting the target is nonsensical. It should at least\n\t * be a line contained by both triangles if not a different special case somehow represented in the return result.\n\t *\n\t * General triangle intersection code is based on Moller's algorithm from here: https://web.stanford.edu/class/cs277/resources/papers/Moller1997b.pdf\n\t * Reference implementation from here: https://github.com/erich666/jgt-code/blob/master/Volume_08/Number_1/Shen2003/tri_tri_test/include/Moller97.c#L570\n\t * All degeneracies are handled before the general algorithm.\n\t * Coplanar check is different from Moller's and based on SAT tests.\n\t */\n\treturn function intersectsTriangle( other, target = null, suppressLog = false ) {\n\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.update();\n\n\t\t}\n\n\t\tif ( ! other.isExtendedTriangle ) {\n\n\t\t\tsaTri2.copy( other );\n\t\t\tsaTri2.update();\n\t\t\tother = saTri2;\n\n\t\t} else if ( other.needsUpdate ) {\n\n\t\t\tother.update();\n\n\t\t}\n\n\t\tconst res = handleDegenerateCases( this, other, target, suppressLog );\n\t\tif ( res !== undefined ) {\n\n\t\t\treturn res;\n\n\t\t}\n\n\t\tconst plane1 = this.plane;\n\t\tconst plane2 = other.plane;\n\n\t\tlet a1Dist = plane2.distanceToPoint( this.a );\n\t\tlet b1Dist = plane2.distanceToPoint( this.b );\n\t\tlet c1Dist = plane2.distanceToPoint( this.c );\n\n\t\tif ( isNearZero( a1Dist ) )\n\t\t\ta1Dist = 0;\n\n\t\tif ( isNearZero( b1Dist ) )\n\t\t\tb1Dist = 0;\n\n\t\tif ( isNearZero( c1Dist ) )\n\t\t\tc1Dist = 0;\n\n\t\tconst a1b1Dist = a1Dist * b1Dist;\n\t\tconst a1c1Dist = a1Dist * c1Dist;\n\t\tif ( a1b1Dist > 0 && a1c1Dist > 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tlet a2Dist = plane1.distanceToPoint( other.a );\n\t\tlet b2Dist = plane1.distanceToPoint( other.b );\n\t\tlet c2Dist = plane1.distanceToPoint( other.c );\n\n\t\tif ( isNearZero( a2Dist ) )\n\t\t\ta2Dist = 0;\n\n\t\tif ( isNearZero( b2Dist ) )\n\t\t\tb2Dist = 0;\n\n\t\tif ( isNearZero( c2Dist ) )\n\t\t\tc2Dist = 0;\n\n\t\tconst a2b2Dist = a2Dist * b2Dist;\n\t\tconst a2c2Dist = a2Dist * c2Dist;\n\t\tif ( a2b2Dist > 0 && a2c2Dist > 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tdir1.copy( plane1.normal );\n\t\tdir2.copy( plane2.normal );\n\t\tconst intersectionLine = dir1.cross( dir2 );\n\n\t\tlet componentIndex = 0;\n\t\tlet maxComponent = Math.abs( intersectionLine.x );\n\t\tconst comp1 = Math.abs( intersectionLine.y );\n\t\tif ( comp1 > maxComponent ) {\n\n\t\t\tmaxComponent = comp1;\n\t\t\tcomponentIndex = 1;\n\n\t\t}\n\n\t\tconst comp2 = Math.abs( intersectionLine.z );\n\t\tif ( comp2 > maxComponent ) {\n\n\t\t\tcomponentIndex = 2;\n\n\t\t}\n\n\t\tconst key = componentKeys[ componentIndex ];\n\t\tconst a1Proj = this.a[ key ];\n\t\tconst b1Proj = this.b[ key ];\n\t\tconst c1Proj = this.c[ key ];\n\n\t\tconst a2Proj = other.a[ key ];\n\t\tconst b2Proj = other.b[ key ];\n\t\tconst c2Proj = other.c[ key ];\n\n\t\tif ( findIntersectionLineBounds( this, a1Proj, b1Proj, c1Proj, a1b1Dist, a1c1Dist, a1Dist, b1Dist, c1Dist, bounds1, edge1 ) ) {\n\n\t\t\treturn coplanarIntersectsTriangle( this, other, target, suppressLog );\n\n\t\t}\n\n\t\tif ( findIntersectionLineBounds( other, a2Proj, b2Proj, c2Proj, a2b2Dist, a2c2Dist, a2Dist, b2Dist, c2Dist, bounds2, edge2 ) ) {\n\n\t\t\treturn coplanarIntersectsTriangle( this, other, target, suppressLog );\n\n\t\t}\n\n\t\tif ( bounds1.y < bounds1.x ) {\n\n\t\t\tconst tmp = bounds1.y;\n\t\t\tbounds1.y = bounds1.x;\n\t\t\tbounds1.x = tmp;\n\n\t\t\ttempPoint.copy( edge1.start );\n\t\t\tedge1.start.copy( edge1.end );\n\t\t\tedge1.end.copy( tempPoint );\n\n\t\t}\n\n\t\tif ( bounds2.y < bounds2.x ) {\n\n\t\t\tconst tmp = bounds2.y;\n\t\t\tbounds2.y = bounds2.x;\n\t\t\tbounds2.x = tmp;\n\n\t\t\ttempPoint.copy( edge2.start );\n\t\t\tedge2.start.copy( edge2.end );\n\t\t\tedge2.end.copy( tempPoint );\n\n\t\t}\n\n\t\tif ( bounds1.y < bounds2.x || bounds2.y < bounds1.x ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tif ( target ) {\n\n\t\t\tif ( bounds2.x > bounds1.x ) {\n\n\t\t\t\ttarget.start.copy( edge2.start );\n\n\t\t\t} else {\n\n\t\t\t\ttarget.start.copy( edge1.start );\n\n\t\t\t}\n\n\t\t\tif ( bounds2.y < bounds1.y ) {\n\n\t\t\t\ttarget.end.copy( edge2.end );\n\n\t\t\t} else {\n\n\t\t\t\ttarget.end.copy( edge1.end );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t};\n\n} )();\n\n\nExtendedTriangle.prototype.distanceToPoint = ( function () {\n\n\tconst target = /* @__PURE__ */ new Vector3();\n\treturn function distanceToPoint( point ) {\n\n\t\tthis.closestPointToPoint( point, target );\n\t\treturn point.distanceTo( target );\n\n\t};\n\n} )();\n\n\nExtendedTriangle.prototype.distanceToTriangle = ( function () {\n\n\tconst point = /* @__PURE__ */ new Vector3();\n\tconst point2 = /* @__PURE__ */ new Vector3();\n\tconst cornerFields = [ 'a', 'b', 'c' ];\n\tconst line1 = /* @__PURE__ */ new Line3();\n\tconst line2 = /* @__PURE__ */ new Line3();\n\n\treturn function distanceToTriangle( other, target1 = null, target2 = null ) {\n\n\t\tconst lineTarget = target1 || target2 ? line1 : null;\n\t\tif ( this.intersectsTriangle( other, lineTarget ) ) {\n\n\t\t\tif ( target1 || target2 ) {\n\n\t\t\t\tif ( target1 ) lineTarget.getCenter( target1 );\n\t\t\t\tif ( target2 ) lineTarget.getCenter( target2 );\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tlet closestDistanceSq = Infinity;\n\n\t\t// check all point distances\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tlet dist;\n\t\t\tconst field = cornerFields[ i ];\n\t\t\tconst otherVec = other[ field ];\n\t\t\tthis.closestPointToPoint( otherVec, point );\n\n\t\t\tdist = otherVec.distanceToSquared( point );\n\n\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\tif ( target1 ) target1.copy( point );\n\t\t\t\tif ( target2 ) target2.copy( otherVec );\n\n\t\t\t}\n\n\n\t\t\tconst thisVec = this[ field ];\n\t\t\tother.closestPointToPoint( thisVec, point );\n\n\t\t\tdist = thisVec.distanceToSquared( point );\n\n\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\tif ( target1 ) target1.copy( thisVec );\n\t\t\t\tif ( target2 ) target2.copy( point );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst f11 = cornerFields[ i ];\n\t\t\tconst f12 = cornerFields[ ( i + 1 ) % 3 ];\n\t\t\tline1.set( this[ f11 ], this[ f12 ] );\n\t\t\tfor ( let i2 = 0; i2 < 3; i2 ++ ) {\n\n\t\t\t\tconst f21 = cornerFields[ i2 ];\n\t\t\t\tconst f22 = cornerFields[ ( i2 + 1 ) % 3 ];\n\t\t\t\tline2.set( other[ f21 ], other[ f22 ] );\n\n\t\t\t\tclosestPointsSegmentToSegment( line1, line2, point, point2 );\n\n\t\t\t\tconst dist = point.distanceToSquared( point2 );\n\t\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\t\tif ( target1 ) target1.copy( point );\n\t\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Math.sqrt( closestDistanceSq );\n\n\t};\n\n} )();\n","import { Vector3, Matrix4, Line3 } from 'three';\nimport { SeparatingAxisBounds } from './SeparatingAxisBounds.js';\nimport { ExtendedTriangle } from './ExtendedTriangle.js';\nimport { closestPointsSegmentToSegment } from './MathUtilities.js';\n\nexport class OrientedBox {\n\n\tconstructor( min, max, matrix ) {\n\n\t\tthis.isOrientedBox = true;\n\t\tthis.min = new Vector3();\n\t\tthis.max = new Vector3();\n\t\tthis.matrix = new Matrix4();\n\t\tthis.invMatrix = new Matrix4();\n\t\tthis.points = new Array( 8 ).fill().map( () => new Vector3() );\n\t\tthis.satAxes = new Array( 3 ).fill().map( () => new Vector3() );\n\t\tthis.satBounds = new Array( 3 ).fill().map( () => new SeparatingAxisBounds() );\n\t\tthis.alignedSatBounds = new Array( 3 ).fill().map( () => new SeparatingAxisBounds() );\n\t\tthis.needsUpdate = false;\n\n\t\tif ( min ) this.min.copy( min );\n\t\tif ( max ) this.max.copy( max );\n\t\tif ( matrix ) this.matrix.copy( matrix );\n\n\t}\n\n\tset( min, max, matrix ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\t\tthis.matrix.copy( matrix );\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.min.copy( other.min );\n\t\tthis.max.copy( other.max );\n\t\tthis.matrix.copy( other.matrix );\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\nOrientedBox.prototype.update = ( function () {\n\n\treturn function update() {\n\n\t\tconst matrix = this.matrix;\n\t\tconst min = this.min;\n\t\tconst max = this.max;\n\n\t\tconst points = this.points;\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\n\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\n\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\n\n\t\t\t\t\tconst i = ( ( 1 << 0 ) * x ) | ( ( 1 << 1 ) * y ) | ( ( 1 << 2 ) * z );\n\t\t\t\t\tconst v = points[ i ];\n\t\t\t\t\tv.x = x ? max.x : min.x;\n\t\t\t\t\tv.y = y ? max.y : min.y;\n\t\t\t\t\tv.z = z ? max.z : min.z;\n\n\t\t\t\t\tv.applyMatrix4( matrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst satBounds = this.satBounds;\n\t\tconst satAxes = this.satAxes;\n\t\tconst minVec = points[ 0 ];\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst axis = satAxes[ i ];\n\t\t\tconst sb = satBounds[ i ];\n\t\t\tconst index = 1 << i;\n\t\t\tconst pi = points[ index ];\n\n\t\t\taxis.subVectors( minVec, pi );\n\t\t\tsb.setFromPoints( axis, points );\n\n\t\t}\n\n\t\tconst alignedSatBounds = this.alignedSatBounds;\n\t\talignedSatBounds[ 0 ].setFromPointsField( points, 'x' );\n\t\talignedSatBounds[ 1 ].setFromPointsField( points, 'y' );\n\t\talignedSatBounds[ 2 ].setFromPointsField( points, 'z' );\n\n\t\tthis.invMatrix.copy( this.matrix ).invert();\n\t\tthis.needsUpdate = false;\n\n\t};\n\n} )();\n\nOrientedBox.prototype.intersectsBox = ( function () {\n\n\tconst aabbBounds = /* @__PURE__ */ new SeparatingAxisBounds();\n\treturn function intersectsBox( box ) {\n\n\t\t// TODO: should this be doing SAT against the AABB?\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.update();\n\n\t\t}\n\n\t\tconst min = box.min;\n\t\tconst max = box.max;\n\t\tconst satBounds = this.satBounds;\n\t\tconst satAxes = this.satAxes;\n\t\tconst alignedSatBounds = this.alignedSatBounds;\n\n\t\taabbBounds.min = min.x;\n\t\taabbBounds.max = max.x;\n\t\tif ( alignedSatBounds[ 0 ].isSeparated( aabbBounds ) ) return false;\n\n\t\taabbBounds.min = min.y;\n\t\taabbBounds.max = max.y;\n\t\tif ( alignedSatBounds[ 1 ].isSeparated( aabbBounds ) ) return false;\n\n\t\taabbBounds.min = min.z;\n\t\taabbBounds.max = max.z;\n\t\tif ( alignedSatBounds[ 2 ].isSeparated( aabbBounds ) ) return false;\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst axis = satAxes[ i ];\n\t\t\tconst sb = satBounds[ i ];\n\t\t\taabbBounds.setFromBox( axis, box );\n\t\t\tif ( sb.isSeparated( aabbBounds ) ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t};\n\n} )();\n\nOrientedBox.prototype.intersectsTriangle = ( function () {\n\n\tconst saTri = /* @__PURE__ */ new ExtendedTriangle();\n\tconst pointsArr = /* @__PURE__ */ new Array( 3 );\n\tconst cachedSatBounds = /* @__PURE__ */ new SeparatingAxisBounds();\n\tconst cachedSatBounds2 = /* @__PURE__ */ new SeparatingAxisBounds();\n\tconst cachedAxis = /* @__PURE__ */ new Vector3();\n\treturn function intersectsTriangle( triangle ) {\n\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.update();\n\n\t\t}\n\n\t\tif ( ! triangle.isExtendedTriangle ) {\n\n\t\t\tsaTri.copy( triangle );\n\t\t\tsaTri.update();\n\t\t\ttriangle = saTri;\n\n\t\t} else if ( triangle.needsUpdate ) {\n\n\t\t\ttriangle.update();\n\n\t\t}\n\n\t\tconst satBounds = this.satBounds;\n\t\tconst satAxes = this.satAxes;\n\n\t\tpointsArr[ 0 ] = triangle.a;\n\t\tpointsArr[ 1 ] = triangle.b;\n\t\tpointsArr[ 2 ] = triangle.c;\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst sb = satBounds[ i ];\n\t\t\tconst sa = satAxes[ i ];\n\t\t\tcachedSatBounds.setFromPoints( sa, pointsArr );\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\n\n\t\t}\n\n\t\tconst triSatBounds = triangle.satBounds;\n\t\tconst triSatAxes = triangle.satAxes;\n\t\tconst points = this.points;\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst sb = triSatBounds[ i ];\n\t\t\tconst sa = triSatAxes[ i ];\n\t\t\tcachedSatBounds.setFromPoints( sa, points );\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\n\n\t\t}\n\n\t\t// check crossed axes\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst sa1 = satAxes[ i ];\n\t\t\tfor ( let i2 = 0; i2 < 4; i2 ++ ) {\n\n\t\t\t\tconst sa2 = triSatAxes[ i2 ];\n\t\t\t\tcachedAxis.crossVectors( sa1, sa2 );\n\t\t\t\tcachedSatBounds.setFromPoints( cachedAxis, pointsArr );\n\t\t\t\tcachedSatBounds2.setFromPoints( cachedAxis, points );\n\t\t\t\tif ( cachedSatBounds.isSeparated( cachedSatBounds2 ) ) return false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t};\n\n} )();\n\nOrientedBox.prototype.closestPointToPoint = ( function () {\n\n\treturn function closestPointToPoint( point, target1 ) {\n\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.update();\n\n\t\t}\n\n\t\ttarget1\n\t\t\t.copy( point )\n\t\t\t.applyMatrix4( this.invMatrix )\n\t\t\t.clamp( this.min, this.max )\n\t\t\t.applyMatrix4( this.matrix );\n\n\t\treturn target1;\n\n\t};\n\n} )();\n\nOrientedBox.prototype.distanceToPoint = ( function () {\n\n\tconst target = new Vector3();\n\treturn function distanceToPoint( point ) {\n\n\t\tthis.closestPointToPoint( point, target );\n\t\treturn point.distanceTo( target );\n\n\t};\n\n} )();\n\nOrientedBox.prototype.distanceToBox = ( function () {\n\n\tconst xyzFields = [ 'x', 'y', 'z' ];\n\tconst segments1 = /* @__PURE__ */ new Array( 12 ).fill().map( () => new Line3() );\n\tconst segments2 = /* @__PURE__ */ new Array( 12 ).fill().map( () => new Line3() );\n\n\tconst point1 = /* @__PURE__ */ new Vector3();\n\tconst point2 = /* @__PURE__ */ new Vector3();\n\n\t// early out if we find a value below threshold\n\treturn function distanceToBox( box, threshold = 0, target1 = null, target2 = null ) {\n\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.update();\n\n\t\t}\n\n\t\tif ( this.intersectsBox( box ) ) {\n\n\t\t\tif ( target1 || target2 ) {\n\n\t\t\t\tbox.getCenter( point2 );\n\t\t\t\tthis.closestPointToPoint( point2, point1 );\n\t\t\t\tbox.closestPointToPoint( point1, point2 );\n\n\t\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tconst threshold2 = threshold * threshold;\n\t\tconst min = box.min;\n\t\tconst max = box.max;\n\t\tconst points = this.points;\n\n\n\t\t// iterate over every edge and compare distances\n\t\tlet closestDistanceSq = Infinity;\n\n\t\t// check over all these points\n\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\tconst p = points[ i ];\n\t\t\tpoint2.copy( p ).clamp( min, max );\n\n\t\t\tconst dist = p.distanceToSquared( point2 );\n\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\tif ( target1 ) target1.copy( p );\n\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate and check all line segment distances\n\t\tlet count = 0;\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tfor ( let i1 = 0; i1 <= 1; i1 ++ ) {\n\n\t\t\t\tfor ( let i2 = 0; i2 <= 1; i2 ++ ) {\n\n\t\t\t\t\tconst nextIndex = ( i + 1 ) % 3;\n\t\t\t\t\tconst nextIndex2 = ( i + 2 ) % 3;\n\n\t\t\t\t\t// get obb line segments\n\t\t\t\t\tconst index = i1 << nextIndex | i2 << nextIndex2;\n\t\t\t\t\tconst index2 = 1 << i | i1 << nextIndex | i2 << nextIndex2;\n\t\t\t\t\tconst p1 = points[ index ];\n\t\t\t\t\tconst p2 = points[ index2 ];\n\t\t\t\t\tconst line1 = segments1[ count ];\n\t\t\t\t\tline1.set( p1, p2 );\n\n\n\t\t\t\t\t// get aabb line segments\n\t\t\t\t\tconst f1 = xyzFields[ i ];\n\t\t\t\t\tconst f2 = xyzFields[ nextIndex ];\n\t\t\t\t\tconst f3 = xyzFields[ nextIndex2 ];\n\t\t\t\t\tconst line2 = segments2[ count ];\n\t\t\t\t\tconst start = line2.start;\n\t\t\t\t\tconst end = line2.end;\n\n\t\t\t\t\tstart[ f1 ] = min[ f1 ];\n\t\t\t\t\tstart[ f2 ] = i1 ? min[ f2 ] : max[ f2 ];\n\t\t\t\t\tstart[ f3 ] = i2 ? min[ f3 ] : max[ f2 ];\n\n\t\t\t\t\tend[ f1 ] = max[ f1 ];\n\t\t\t\t\tend[ f2 ] = i1 ? min[ f2 ] : max[ f2 ];\n\t\t\t\t\tend[ f3 ] = i2 ? min[ f3 ] : max[ f2 ];\n\n\t\t\t\t\tcount ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// check all the other boxes point\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\n\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\n\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\n\n\t\t\t\t\tpoint2.x = x ? max.x : min.x;\n\t\t\t\t\tpoint2.y = y ? max.y : min.y;\n\t\t\t\t\tpoint2.z = z ? max.z : min.z;\n\n\t\t\t\t\tthis.closestPointToPoint( point2, point1 );\n\t\t\t\t\tconst dist = point2.distanceToSquared( point1 );\n\t\t\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 12; i ++ ) {\n\n\t\t\tconst l1 = segments1[ i ];\n\t\t\tfor ( let i2 = 0; i2 < 12; i2 ++ ) {\n\n\t\t\t\tconst l2 = segments2[ i2 ];\n\t\t\t\tclosestPointsSegmentToSegment( l1, l2, point1, point2 );\n\t\t\t\tconst dist = point1.distanceToSquared( point2 );\n\t\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Math.sqrt( closestDistanceSq );\n\n\t};\n\n} )();\n","import { ExtendedTriangle } from '../math/ExtendedTriangle.js';\nimport { PrimitivePool } from './PrimitivePool.js';\n\nclass ExtendedTrianglePoolBase extends PrimitivePool {\n\n\tconstructor() {\n\n\t\tsuper( () => new ExtendedTriangle() );\n\n\t}\n\n}\n\nexport const ExtendedTrianglePool = /* @__PURE__ */ new ExtendedTrianglePoolBase();\n","import { Vector3 } from 'three';\n\nconst temp = /* @__PURE__ */ new Vector3();\nconst temp1 = /* @__PURE__ */ new Vector3();\n\nexport function closestPointToPoint(\n\tbvh,\n\tpoint,\n\ttarget = { },\n\tminThreshold = 0,\n\tmaxThreshold = Infinity,\n) {\n\n\t// early out if under minThreshold\n\t// skip checking if over maxThreshold\n\t// set minThreshold = maxThreshold to quickly check if a point is within a threshold\n\t// returns Infinity if no value found\n\tconst minThresholdSq = minThreshold * minThreshold;\n\tconst maxThresholdSq = maxThreshold * maxThreshold;\n\tlet closestDistanceSq = Infinity;\n\tlet closestDistanceTriIndex = null;\n\tbvh.shapecast(\n\n\t\t{\n\n\t\t\tboundsTraverseOrder: box => {\n\n\t\t\t\ttemp.copy( point ).clamp( box.min, box.max );\n\t\t\t\treturn temp.distanceToSquared( point );\n\n\t\t\t},\n\n\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\n\n\t\t\t\treturn score < closestDistanceSq && score < maxThresholdSq;\n\n\t\t\t},\n\n\t\t\tintersectsTriangle: ( tri, triIndex ) => {\n\n\t\t\t\ttri.closestPointToPoint( point, temp );\n\t\t\t\tconst distSq = point.distanceToSquared( temp );\n\t\t\t\tif ( distSq < closestDistanceSq ) {\n\n\t\t\t\t\ttemp1.copy( temp );\n\t\t\t\t\tclosestDistanceSq = distSq;\n\t\t\t\t\tclosestDistanceTriIndex = triIndex;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distSq < minThresholdSq ) {\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t}\n\n\t);\n\n\tif ( closestDistanceSq === Infinity ) return null;\n\n\tconst closestDistance = Math.sqrt( closestDistanceSq );\n\n\tif ( ! target.point ) target.point = temp1.clone();\n\telse target.point.copy( temp1 );\n\ttarget.distance = closestDistance,\n\ttarget.faceIndex = closestDistanceTriIndex;\n\n\treturn target;\n\n}\n","import { Vector3, Vector2, Triangle, DoubleSide, BackSide, REVISION } from 'three';\n\nconst IS_GT_REVISION_169 = parseInt( REVISION ) >= 169;\nconst IS_LT_REVISION_161 = parseInt( REVISION ) <= 161;\n\n// Ripped and modified From THREE.js Mesh raycast\n// https://github.com/mrdoob/three.js/blob/0aa87c999fe61e216c1133fba7a95772b503eddf/src/objects/Mesh.js#L115\nconst _vA = /* @__PURE__ */ new Vector3();\nconst _vB = /* @__PURE__ */ new Vector3();\nconst _vC = /* @__PURE__ */ new Vector3();\n\nconst _uvA = /* @__PURE__ */ new Vector2();\nconst _uvB = /* @__PURE__ */ new Vector2();\nconst _uvC = /* @__PURE__ */ new Vector2();\n\nconst _normalA = /* @__PURE__ */ new Vector3();\nconst _normalB = /* @__PURE__ */ new Vector3();\nconst _normalC = /* @__PURE__ */ new Vector3();\n\nconst _intersectionPoint = /* @__PURE__ */ new Vector3();\nfunction checkIntersection( ray, pA, pB, pC, point, side, near, far ) {\n\n\tlet intersect;\n\tif ( side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, side !== DoubleSide, point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\tconst distance = ray.origin.distanceTo( point );\n\n\tif ( distance < near || distance > far ) return null;\n\n\treturn {\n\n\t\tdistance: distance,\n\t\tpoint: point.clone(),\n\n\t};\n\n}\n\nfunction checkBufferGeometryIntersection( ray, position, normal, uv, uv1, a, b, c, side, near, far ) {\n\n\t_vA.fromBufferAttribute( position, a );\n\t_vB.fromBufferAttribute( position, b );\n\t_vC.fromBufferAttribute( position, c );\n\n\tconst intersection = checkIntersection( ray, _vA, _vB, _vC, _intersectionPoint, side, near, far );\n\n\tif ( intersection ) {\n\n\t\tif ( uv ) {\n\n\t\t\t_uvA.fromBufferAttribute( uv, a );\n\t\t\t_uvB.fromBufferAttribute( uv, b );\n\t\t\t_uvC.fromBufferAttribute( uv, c );\n\n\t\t\tintersection.uv = new Vector2();\n\t\t\tconst res = Triangle.getInterpolation( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, intersection.uv );\n\t\t\tif ( ! IS_GT_REVISION_169 ) {\n\n\t\t\t\tintersection.uv = res;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv1 ) {\n\n\t\t\t_uvA.fromBufferAttribute( uv1, a );\n\t\t\t_uvB.fromBufferAttribute( uv1, b );\n\t\t\t_uvC.fromBufferAttribute( uv1, c );\n\n\t\t\tintersection.uv1 = new Vector2();\n\t\t\tconst res = Triangle.getInterpolation( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, intersection.uv1 );\n\t\t\tif ( ! IS_GT_REVISION_169 ) {\n\n\t\t\t\tintersection.uv1 = res;\n\n\t\t\t}\n\n\t\t\tif ( IS_LT_REVISION_161 ) {\n\n\t\t\t\tintersection.uv2 = intersection.uv1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( normal ) {\n\n\t\t\t_normalA.fromBufferAttribute( normal, a );\n\t\t\t_normalB.fromBufferAttribute( normal, b );\n\t\t\t_normalC.fromBufferAttribute( normal, c );\n\n\t\t\tintersection.normal = new Vector3();\n\t\t\tconst res = Triangle.getInterpolation( _intersectionPoint, _vA, _vB, _vC, _normalA, _normalB, _normalC, intersection.normal );\n\t\t\tif ( intersection.normal.dot( ray.direction ) > 0 ) {\n\n\t\t\t\tintersection.normal.multiplyScalar( - 1 );\n\n\t\t\t}\n\n\t\t\tif ( ! IS_GT_REVISION_169 ) {\n\n\t\t\t\tintersection.normal = res;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA, _vB, _vC, face.normal );\n\n\t\tintersection.face = face;\n\t\tintersection.faceIndex = a;\n\n\t\tif ( IS_GT_REVISION_169 ) {\n\n\t\t\tconst barycoord = new Vector3();\n\t\t\tTriangle.getBarycoord( _intersectionPoint, _vA, _vB, _vC, barycoord );\n\n\t\t\tintersection.barycoord = barycoord;\n\n\t\t}\n\n\t}\n\n\treturn intersection;\n\n}\n\nfunction getSide( materialOrSide ) {\n\n\treturn materialOrSide && materialOrSide.isMaterial ? materialOrSide.side : materialOrSide;\n\n}\n\n// https://github.com/mrdoob/three.js/blob/0aa87c999fe61e216c1133fba7a95772b503eddf/src/objects/Mesh.js#L258\nexport function intersectTri( geometry, materialOrSide, ray, tri, intersections, near, far ) {\n\n\tconst triOffset = tri * 3;\n\tlet a = triOffset + 0;\n\tlet b = triOffset + 1;\n\tlet c = triOffset + 2;\n\n\tconst { index, groups } = geometry;\n\tif ( geometry.index ) {\n\n\t\ta = index.getX( a );\n\t\tb = index.getX( b );\n\t\tc = index.getX( c );\n\n\t}\n\n\tconst { position, normal, uv, uv1 } = geometry.attributes;\n\tif ( Array.isArray( materialOrSide ) ) {\n\n\t\t// check which groups a triangle is present in and run the intersections\n\t\t// TODO: we shouldn't need to run and intersection test multiple times\n\t\tconst firstIndex = tri * 3;\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst { start, count, materialIndex } = groups[ i ];\n\t\t\tif ( firstIndex >= start && firstIndex < start + count ) {\n\n\t\t\t\tconst side = getSide( materialOrSide[ materialIndex ] );\n\t\t\t\tconst intersection = checkBufferGeometryIntersection( ray, position, normal, uv, uv1, a, b, c, side, near, far );\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tintersection.faceIndex = tri;\n\t\t\t\t\tintersection.face.materialIndex = materialIndex;\n\n\t\t\t\t\tif ( intersections ) {\n\n\t\t\t\t\t\tintersections.push( intersection );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn intersection;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// run the intersection for the single material\n\t\tconst side = getSide( materialOrSide );\n\t\tconst intersection = checkBufferGeometryIntersection( ray, position, normal, uv, uv1, a, b, c, side, near, far );\n\t\tif ( intersection ) {\n\n\t\t\tintersection.faceIndex = tri;\n\t\t\tintersection.face.materialIndex = 0;\n\n\t\t\tif ( intersections ) {\n\n\t\t\t\tintersections.push( intersection );\n\n\t\t\t} else {\n\n\t\t\t\treturn intersection;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn null;\n\n}\n","\nimport { Vector2, Vector3, Triangle } from 'three';\n\n// sets the vertices of triangle `tri` with the 3 vertices after i\nexport function setTriangle( tri, i, index, pos ) {\n\n\tconst ta = tri.a;\n\tconst tb = tri.b;\n\tconst tc = tri.c;\n\n\tlet i0 = i;\n\tlet i1 = i + 1;\n\tlet i2 = i + 2;\n\tif ( index ) {\n\n\t\ti0 = index.getX( i0 );\n\t\ti1 = index.getX( i1 );\n\t\ti2 = index.getX( i2 );\n\n\t}\n\n\tta.x = pos.getX( i0 );\n\tta.y = pos.getY( i0 );\n\tta.z = pos.getZ( i0 );\n\n\ttb.x = pos.getX( i1 );\n\ttb.y = pos.getY( i1 );\n\ttb.z = pos.getZ( i1 );\n\n\ttc.x = pos.getX( i2 );\n\ttc.y = pos.getY( i2 );\n\ttc.z = pos.getZ( i2 );\n\n}\n\nconst tempV1 = /* @__PURE__ */ new Vector3();\nconst tempV2 = /* @__PURE__ */ new Vector3();\nconst tempV3 = /* @__PURE__ */ new Vector3();\nconst tempUV1 = /* @__PURE__ */ new Vector2();\nconst tempUV2 = /* @__PURE__ */ new Vector2();\nconst tempUV3 = /* @__PURE__ */ new Vector2();\n\nexport function getTriangleHitPointInfo( point, geometry, triangleIndex, target ) {\n\n\tconst indices = geometry.getIndex().array;\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst uvs = geometry.getAttribute( 'uv' );\n\n\tconst a = indices[ triangleIndex * 3 ];\n\tconst b = indices[ triangleIndex * 3 + 1 ];\n\tconst c = indices[ triangleIndex * 3 + 2 ];\n\n\ttempV1.fromBufferAttribute( positions, a );\n\ttempV2.fromBufferAttribute( positions, b );\n\ttempV3.fromBufferAttribute( positions, c );\n\n\t// find the associated material index\n\tlet materialIndex = 0;\n\tconst groups = geometry.groups;\n\tconst firstVertexIndex = triangleIndex * 3;\n\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\t\tconst { start, count } = group;\n\t\tif ( firstVertexIndex >= start && firstVertexIndex < start + count ) {\n\n\t\t\tmaterialIndex = group.materialIndex;\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\t// extract barycoord\n\tconst barycoord = target && target.barycoord ? target.barycoord : new Vector3();\n\tTriangle.getBarycoord( point, tempV1, tempV2, tempV3, barycoord );\n\n\t// extract uvs\n\tlet uv = null;\n\tif ( uvs ) {\n\n\t\ttempUV1.fromBufferAttribute( uvs, a );\n\t\ttempUV2.fromBufferAttribute( uvs, b );\n\t\ttempUV3.fromBufferAttribute( uvs, c );\n\n\t\tif ( target && target.uv ) uv = target.uv;\n\t\telse uv = new Vector2();\n\n\t\tTriangle.getInterpolation( point, tempV1, tempV2, tempV3, tempUV1, tempUV2, tempUV3, uv );\n\n\t}\n\n\t// adjust the provided target or create a new one\n\tif ( target ) {\n\n\t\tif ( ! target.face ) target.face = { };\n\t\ttarget.face.a = a;\n\t\ttarget.face.b = b;\n\t\ttarget.face.c = c;\n\t\ttarget.face.materialIndex = materialIndex;\n\t\tif ( ! target.face.normal ) target.face.normal = new Vector3();\n\t\tTriangle.getNormal( tempV1, tempV2, tempV3, target.face.normal );\n\n\t\tif ( uv ) target.uv = uv;\n\t\ttarget.barycoord = barycoord;\n\n\t\treturn target;\n\n\t} else {\n\n\t\treturn {\n\t\t\tface: {\n\t\t\t\ta: a,\n\t\t\t\tb: b,\n\t\t\t\tc: c,\n\t\t\t\tmaterialIndex: materialIndex,\n\t\t\t\tnormal: Triangle.getNormal( tempV1, tempV2, tempV3, new Vector3() )\n\t\t\t},\n\t\t\tuv: uv,\n\t\t\tbarycoord: barycoord,\n\t\t};\n\n\t}\n\n}\n","import { intersectTri } from '../../utils/ThreeRayIntersectUtilities.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\n\n/*************************************************************/\n/* This file is generated from \"iterationUtils.template.js\". */\n/*************************************************************/\n\nfunction intersectTris( bvh, materialOrSide, ray, offset, count, intersections, near, far ) {\n\n\tconst { geometry, _indirectBuffer } = bvh;\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\n\t\tintersectTri( geometry, materialOrSide, ray, i, intersections, near, far );\n\n\n\t}\n\n}\n\nfunction intersectClosestTri( bvh, materialOrSide, ray, offset, count, near, far ) {\n\n\tconst { geometry, _indirectBuffer } = bvh;\n\tlet dist = Infinity;\n\tlet res = null;\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\t\tlet intersection;\n\n\t\tintersection = intersectTri( geometry, materialOrSide, ray, i, null, near, far );\n\n\n\t\tif ( intersection && intersection.distance < dist ) {\n\n\t\t\tres = intersection;\n\t\t\tdist = intersection.distance;\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\nfunction iterateOverTriangles(\n\toffset,\n\tcount,\n\tbvh,\n\tintersectsTriangleFunc,\n\tcontained,\n\tdepth,\n\ttriangle\n) {\n\n\tconst { geometry } = bvh;\n\tconst { index } = geometry;\n\tconst pos = geometry.attributes.position;\n\tfor ( let i = offset, l = count + offset; i < l; i ++ ) {\n\n\t\tlet tri;\n\n\t\ttri = i;\n\n\t\tsetTriangle( triangle, tri * 3, index, pos );\n\t\ttriangle.needsUpdate = true;\n\n\t\tif ( intersectsTriangleFunc( triangle, tri, contained, depth ) ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t}\n\n\treturn false;\n\n}\n\nexport { intersectClosestTri, intersectTris, iterateOverTriangles };\n","import { UINT32_PER_NODE, BYTES_PER_NODE } from '../Constants.js';\nimport { IS_LEAF, OFFSET, COUNT, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\n\n/****************************************************/\n/* This file is generated from \"refit.template.js\". */\n/****************************************************/\n\nfunction refit( bvh, nodeIndices = null ) {\n\n\tif ( nodeIndices && Array.isArray( nodeIndices ) ) {\n\n\t\tnodeIndices = new Set( nodeIndices );\n\n\t}\n\n\tconst geometry = bvh.geometry;\n\tconst indexArr = geometry.index ? geometry.index.array : null;\n\tconst posAttr = geometry.attributes.position;\n\n\tlet buffer, uint32Array, uint16Array, float32Array;\n\tlet byteOffset = 0;\n\tconst roots = bvh._roots;\n\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\tbuffer = roots[ i ];\n\t\tuint32Array = new Uint32Array( buffer );\n\t\tuint16Array = new Uint16Array( buffer );\n\t\tfloat32Array = new Float32Array( buffer );\n\n\t\t_traverse( 0, byteOffset );\n\t\tbyteOffset += buffer.byteLength;\n\n\t}\n\n\tfunction _traverse( nodeIndex32, byteOffset, force = false ) {\n\n\t\tconst nodeIndex16 = nodeIndex32 * 2;\n\t\tif ( IS_LEAF( nodeIndex16, uint16Array ) ) {\n\n\t\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\t\t\tlet minx = Infinity;\n\t\t\tlet miny = Infinity;\n\t\t\tlet minz = Infinity;\n\t\t\tlet maxx = - Infinity;\n\t\t\tlet maxy = - Infinity;\n\t\t\tlet maxz = - Infinity;\n\n\n\t\t\tfor ( let i = 3 * offset, l = 3 * ( offset + count ); i < l; i ++ ) {\n\n\t\t\t\tlet index = indexArr[ i ];\n\t\t\t\tconst x = posAttr.getX( index );\n\t\t\t\tconst y = posAttr.getY( index );\n\t\t\t\tconst z = posAttr.getZ( index );\n\n\t\t\t\tif ( x < minx ) minx = x;\n\t\t\t\tif ( x > maxx ) maxx = x;\n\n\t\t\t\tif ( y < miny ) miny = y;\n\t\t\t\tif ( y > maxy ) maxy = y;\n\n\t\t\t\tif ( z < minz ) minz = z;\n\t\t\t\tif ( z > maxz ) maxz = z;\n\n\t\t\t}\n\n\n\t\t\tif (\n\t\t\t\tfloat32Array[ nodeIndex32 + 0 ] !== minx ||\n\t\t\t\tfloat32Array[ nodeIndex32 + 1 ] !== miny ||\n\t\t\t\tfloat32Array[ nodeIndex32 + 2 ] !== minz ||\n\n\t\t\t\tfloat32Array[ nodeIndex32 + 3 ] !== maxx ||\n\t\t\t\tfloat32Array[ nodeIndex32 + 4 ] !== maxy ||\n\t\t\t\tfloat32Array[ nodeIndex32 + 5 ] !== maxz\n\t\t\t) {\n\n\t\t\t\tfloat32Array[ nodeIndex32 + 0 ] = minx;\n\t\t\t\tfloat32Array[ nodeIndex32 + 1 ] = miny;\n\t\t\t\tfloat32Array[ nodeIndex32 + 2 ] = minz;\n\n\t\t\t\tfloat32Array[ nodeIndex32 + 3 ] = maxx;\n\t\t\t\tfloat32Array[ nodeIndex32 + 4 ] = maxy;\n\t\t\t\tfloat32Array[ nodeIndex32 + 5 ] = maxz;\n\n\t\t\t\treturn true;\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst left = LEFT_NODE( nodeIndex32 );\n\t\t\tconst right = RIGHT_NODE( nodeIndex32, uint32Array );\n\n\t\t\t// the identifying node indices provided by the shapecast function include offsets of all\n\t\t\t// root buffers to guarantee they're unique between roots so offset left and right indices here.\n\t\t\tlet forceChildren = force;\n\t\t\tlet includesLeft = false;\n\t\t\tlet includesRight = false;\n\n\t\t\tif ( nodeIndices ) {\n\n\t\t\t\t// if we see that neither the left or right child are included in the set that need to be updated\n\t\t\t\t// then we assume that all children need to be updated.\n\t\t\t\tif ( ! forceChildren ) {\n\n\t\t\t\t\tconst leftNodeId = left / UINT32_PER_NODE + byteOffset / BYTES_PER_NODE;\n\t\t\t\t\tconst rightNodeId = right / UINT32_PER_NODE + byteOffset / BYTES_PER_NODE;\n\t\t\t\t\tincludesLeft = nodeIndices.has( leftNodeId );\n\t\t\t\t\tincludesRight = nodeIndices.has( rightNodeId );\n\t\t\t\t\tforceChildren = ! includesLeft && ! includesRight;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tincludesLeft = true;\n\t\t\t\tincludesRight = true;\n\n\t\t\t}\n\n\t\t\tconst traverseLeft = forceChildren || includesLeft;\n\t\t\tconst traverseRight = forceChildren || includesRight;\n\n\t\t\tlet leftChange = false;\n\t\t\tif ( traverseLeft ) {\n\n\t\t\t\tleftChange = _traverse( left, byteOffset, forceChildren );\n\n\t\t\t}\n\n\t\t\tlet rightChange = false;\n\t\t\tif ( traverseRight ) {\n\n\t\t\t\trightChange = _traverse( right, byteOffset, forceChildren );\n\n\t\t\t}\n\n\t\t\tconst didChange = leftChange || rightChange;\n\t\t\tif ( didChange ) {\n\n\t\t\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\tconst left_i = left + i;\n\t\t\t\t\tconst right_i = right + i;\n\t\t\t\t\tconst minLeftValue = float32Array[ left_i ];\n\t\t\t\t\tconst maxLeftValue = float32Array[ left_i + 3 ];\n\t\t\t\t\tconst minRightValue = float32Array[ right_i ];\n\t\t\t\t\tconst maxRightValue = float32Array[ right_i + 3 ];\n\n\t\t\t\t\tfloat32Array[ nodeIndex32 + i ] = minLeftValue < minRightValue ? minLeftValue : minRightValue;\n\t\t\t\t\tfloat32Array[ nodeIndex32 + i + 3 ] = maxLeftValue > maxRightValue ? maxLeftValue : maxRightValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn didChange;\n\n\t\t}\n\n\t}\n\n}\n\nexport { refit };\n","/**\n * This function performs intersection tests similar to Ray.intersectBox in three.js,\n * with the difference that the box values are read from an array to improve performance.\n */\nexport function intersectRay( nodeIndex32, array, ray, near, far ) {\n\n\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\tconst invdirx = 1 / ray.direction.x,\n\t\tinvdiry = 1 / ray.direction.y,\n\t\tinvdirz = 1 / ray.direction.z;\n\n\tconst ox = ray.origin.x;\n\tconst oy = ray.origin.y;\n\tconst oz = ray.origin.z;\n\n\tlet minx = array[ nodeIndex32 ];\n\tlet maxx = array[ nodeIndex32 + 3 ];\n\n\tlet miny = array[ nodeIndex32 + 1 ];\n\tlet maxy = array[ nodeIndex32 + 3 + 1 ];\n\n\tlet minz = array[ nodeIndex32 + 2 ];\n\tlet maxz = array[ nodeIndex32 + 3 + 2 ];\n\n\tif ( invdirx >= 0 ) {\n\n\t\ttmin = ( minx - ox ) * invdirx;\n\t\ttmax = ( maxx - ox ) * invdirx;\n\n\t} else {\n\n\t\ttmin = ( maxx - ox ) * invdirx;\n\t\ttmax = ( minx - ox ) * invdirx;\n\n\t}\n\n\tif ( invdiry >= 0 ) {\n\n\t\ttymin = ( miny - oy ) * invdiry;\n\t\ttymax = ( maxy - oy ) * invdiry;\n\n\t} else {\n\n\t\ttymin = ( maxy - oy ) * invdiry;\n\t\ttymax = ( miny - oy ) * invdiry;\n\n\t}\n\n\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return false;\n\n\tif ( tymin > tmin || isNaN( tmin ) ) tmin = tymin;\n\n\tif ( tymax < tmax || isNaN( tmax ) ) tmax = tymax;\n\n\tif ( invdirz >= 0 ) {\n\n\t\ttzmin = ( minz - oz ) * invdirz;\n\t\ttzmax = ( maxz - oz ) * invdirz;\n\n\t} else {\n\n\t\ttzmin = ( maxz - oz ) * invdirz;\n\t\ttzmax = ( minz - oz ) * invdirz;\n\n\t}\n\n\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return false;\n\n\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t//return point closest to the ray (positive side)\n\n\treturn tmin <= far && tmax >= near;\n\n}\n","import { intersectTri } from '../../utils/ThreeRayIntersectUtilities.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\n\n/*************************************************************/\n/* This file is generated from \"iterationUtils.template.js\". */\n/*************************************************************/\n\nfunction intersectTris_indirect( bvh, materialOrSide, ray, offset, count, intersections, near, far ) {\n\n\tconst { geometry, _indirectBuffer } = bvh;\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\t\tlet vi = _indirectBuffer ? _indirectBuffer[ i ] : i;\n\t\tintersectTri( geometry, materialOrSide, ray, vi, intersections, near, far );\n\n\n\t}\n\n}\n\nfunction intersectClosestTri_indirect( bvh, materialOrSide, ray, offset, count, near, far ) {\n\n\tconst { geometry, _indirectBuffer } = bvh;\n\tlet dist = Infinity;\n\tlet res = null;\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\t\tlet intersection;\n\t\tintersection = intersectTri( geometry, materialOrSide, ray, _indirectBuffer ? _indirectBuffer[ i ] : i, null, near, far );\n\n\n\t\tif ( intersection && intersection.distance < dist ) {\n\n\t\t\tres = intersection;\n\t\t\tdist = intersection.distance;\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\nfunction iterateOverTriangles_indirect(\n\toffset,\n\tcount,\n\tbvh,\n\tintersectsTriangleFunc,\n\tcontained,\n\tdepth,\n\ttriangle\n) {\n\n\tconst { geometry } = bvh;\n\tconst { index } = geometry;\n\tconst pos = geometry.attributes.position;\n\tfor ( let i = offset, l = count + offset; i < l; i ++ ) {\n\n\t\tlet tri;\n\t\ttri = bvh.resolveTriangleIndex( i );\n\n\t\tsetTriangle( triangle, tri * 3, index, pos );\n\t\ttriangle.needsUpdate = true;\n\n\t\tif ( intersectsTriangleFunc( triangle, tri, contained, depth ) ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t}\n\n\treturn false;\n\n}\n\nexport { intersectClosestTri_indirect, intersectTris_indirect, iterateOverTriangles_indirect };\n","import { intersectRay } from '../utils/intersectUtils.js';\nimport { IS_LEAF, OFFSET, COUNT, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport { intersectTris } from '../utils/iterationUtils.generated.js';\nimport '../utils/iterationUtils_indirect.generated.js';\n\n/******************************************************/\n/* This file is generated from \"raycast.template.js\". */\n/******************************************************/\n\nfunction raycast( bvh, root, materialOrSide, ray, intersects, near, far ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\t_raycast( 0, bvh, materialOrSide, ray, intersects, near, far );\n\tBufferStack.clearBuffer();\n\n}\n\nfunction _raycast( nodeIndex32, bvh, materialOrSide, ray, intersects, near, far ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tconst nodeIndex16 = nodeIndex32 * 2;\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\n\t\tintersectTris( bvh, materialOrSide, ray, offset, count, intersects, near, far );\n\n\n\t} else {\n\n\t\tconst leftIndex = LEFT_NODE( nodeIndex32 );\n\t\tif ( intersectRay( leftIndex, float32Array, ray, near, far ) ) {\n\n\t\t\t_raycast( leftIndex, bvh, materialOrSide, ray, intersects, near, far );\n\n\t\t}\n\n\t\tconst rightIndex = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\tif ( intersectRay( rightIndex, float32Array, ray, near, far ) ) {\n\n\t\t\t_raycast( rightIndex, bvh, materialOrSide, ray, intersects, near, far );\n\n\t\t}\n\n\t}\n\n}\n\nexport { raycast };\n","import { IS_LEAF, OFFSET, COUNT, SPLIT_AXIS, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport { intersectRay } from '../utils/intersectUtils.js';\nimport { intersectClosestTri } from '../utils/iterationUtils.generated.js';\nimport '../utils/iterationUtils_indirect.generated.js';\n\n/***********************************************************/\n/* This file is generated from \"raycastFirst.template.js\". */\n/***********************************************************/\n\nconst _xyzFields = [ 'x', 'y', 'z' ];\n\nfunction raycastFirst( bvh, root, materialOrSide, ray, near, far ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\tconst result = _raycastFirst( 0, bvh, materialOrSide, ray, near, far );\n\tBufferStack.clearBuffer();\n\n\treturn result;\n\n}\n\nfunction _raycastFirst( nodeIndex32, bvh, materialOrSide, ray, near, far ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\n\t\t// eslint-disable-next-line no-unreachable\n\t\treturn intersectClosestTri( bvh, materialOrSide, ray, offset, count, near, far );\n\n\n\t} else {\n\n\t\t// consider the position of the split plane with respect to the oncoming ray; whichever direction\n\t\t// the ray is coming from, look for an intersection among that side of the tree first\n\t\tconst splitAxis = SPLIT_AXIS( nodeIndex32, uint32Array );\n\t\tconst xyzAxis = _xyzFields[ splitAxis ];\n\t\tconst rayDir = ray.direction[ xyzAxis ];\n\t\tconst leftToRight = rayDir >= 0;\n\n\t\t// c1 is the child to check first\n\t\tlet c1, c2;\n\t\tif ( leftToRight ) {\n\n\t\t\tc1 = LEFT_NODE( nodeIndex32 );\n\t\t\tc2 = RIGHT_NODE( nodeIndex32, uint32Array );\n\n\t\t} else {\n\n\t\t\tc1 = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\t\tc2 = LEFT_NODE( nodeIndex32 );\n\n\t\t}\n\n\t\tconst c1Intersection = intersectRay( c1, float32Array, ray, near, far );\n\t\tconst c1Result = c1Intersection ? _raycastFirst( c1, bvh, materialOrSide, ray, near, far ) : null;\n\n\t\t// if we got an intersection in the first node and it's closer than the second node's bounding\n\t\t// box, we don't need to consider the second node because it couldn't possibly be a better result\n\t\tif ( c1Result ) {\n\n\t\t\t// check if the point is within the second bounds\n\t\t\t// \"point\" is in the local frame of the bvh\n\t\t\tconst point = c1Result.point[ xyzAxis ];\n\t\t\tconst isOutside = leftToRight ?\n\t\t\t\tpoint <= float32Array[ c2 + splitAxis ] : // min bounding data\n\t\t\t\tpoint >= float32Array[ c2 + splitAxis + 3 ]; // max bounding data\n\n\t\t\tif ( isOutside ) {\n\n\t\t\t\treturn c1Result;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// either there was no intersection in the first node, or there could still be a closer\n\t\t// intersection in the second, so check the second node and then take the better of the two\n\t\tconst c2Intersection = intersectRay( c2, float32Array, ray, near, far );\n\t\tconst c2Result = c2Intersection ? _raycastFirst( c2, bvh, materialOrSide, ray, near, far ) : null;\n\n\t\tif ( c1Result && c2Result ) {\n\n\t\t\treturn c1Result.distance <= c2Result.distance ? c1Result : c2Result;\n\n\t\t} else {\n\n\t\t\treturn c1Result || c2Result || null;\n\n\t\t}\n\n\t}\n\n}\n\nexport { raycastFirst };\n","import { Box3, Matrix4 } from 'three';\nimport { OrientedBox } from '../../math/OrientedBox.js';\nimport { ExtendedTriangle } from '../../math/ExtendedTriangle.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\nimport { arrayToBox } from '../../utils/ArrayBoxUtilities.js';\nimport { IS_LEAF, OFFSET, COUNT, BOUNDING_DATA_INDEX, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport { getTriCount } from '../build/geometryUtils.js';\n\n/*****************************************************************/\n/* This file is generated from \"intersectsGeometry.template.js\". */\n/*****************************************************************/\n/* eslint-disable indent */\n\nconst boundingBox = /* @__PURE__ */ new Box3();\nconst triangle = /* @__PURE__ */ new ExtendedTriangle();\nconst triangle2 = /* @__PURE__ */ new ExtendedTriangle();\nconst invertedMat = /* @__PURE__ */ new Matrix4();\n\nconst obb = /* @__PURE__ */ new OrientedBox();\nconst obb2 = /* @__PURE__ */ new OrientedBox();\n\nfunction intersectsGeometry( bvh, root, otherGeometry, geometryToBvh ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\tconst result = _intersectsGeometry( 0, bvh, otherGeometry, geometryToBvh );\n\tBufferStack.clearBuffer();\n\n\treturn result;\n\n}\n\nfunction _intersectsGeometry( nodeIndex32, bvh, otherGeometry, geometryToBvh, cachedObb = null ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\tif ( cachedObb === null ) {\n\n\t\tif ( ! otherGeometry.boundingBox ) {\n\n\t\t\totherGeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\n\t\tcachedObb = obb;\n\n\t}\n\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst thisGeometry = bvh.geometry;\n\t\tconst thisIndex = thisGeometry.index;\n\t\tconst thisPos = thisGeometry.attributes.position;\n\n\t\tconst otherIndex = otherGeometry.index;\n\t\tconst otherPos = otherGeometry.attributes.position;\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\t\t// get the inverse of the geometry matrix so we can transform our triangles into the\n\t\t// geometry space we're trying to test. We assume there are fewer triangles being checked\n\t\t// here.\n\t\tinvertedMat.copy( geometryToBvh ).invert();\n\n\t\tif ( otherGeometry.boundsTree ) {\n\n\t\t\t// if there's a bounds tree\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( nodeIndex32 ), float32Array, obb2 );\n\t\t\tobb2.matrix.copy( invertedMat );\n\t\t\tobb2.needsUpdate = true;\n\n\t\t\t// TODO: use a triangle iteration function here\n\t\t\tconst res = otherGeometry.boundsTree.shapecast( {\n\n\t\t\t\tintersectsBounds: box => obb2.intersectsBox( box ),\n\n\t\t\t\tintersectsTriangle: tri => {\n\n\t\t\t\t\ttri.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.needsUpdate = true;\n\n\n\t\t\t\t\tfor ( let i = offset * 3, l = ( count + offset ) * 3; i < l; i += 3 ) {\n\n\t\t\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\n\t\t\t\t\t\tsetTriangle( triangle2, i, thisIndex, thisPos );\n\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\t\t\t\t\t\tif ( tri.intersectsTriangle( triangle2 ) ) {\n\n\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\treturn res;\n\n\t\t} else {\n\n\t\t\t// if we're just dealing with raw geometry\n\t\t\tconst otherTriangleCount = getTriCount( otherGeometry );\n\n\n\t\t\tfor ( let i = offset * 3, l = ( count + offset ) * 3; i < l; i += 3 ) {\n\n\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\n\t\t\t\tsetTriangle( triangle, i, thisIndex, thisPos );\n\n\n\t\t\t\ttriangle.a.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.b.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.c.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\tfor ( let i2 = 0, l2 = otherTriangleCount * 3; i2 < l2; i2 += 3 ) {\n\n\t\t\t\t\tsetTriangle( triangle2, i2, otherIndex, otherPos );\n\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\tif ( triangle.intersectsTriangle( triangle2 ) ) {\n\n\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\n\t\t}\n\n\t} else {\n\n\t\tconst left = LEFT_NODE( nodeIndex32 );\n\t\tconst right = RIGHT_NODE( nodeIndex32, uint32Array );\n\n\t\tarrayToBox( BOUNDING_DATA_INDEX( left ), float32Array, boundingBox );\n\t\tconst leftIntersection =\n\t\t\tcachedObb.intersectsBox( boundingBox ) &&\n\t\t\t_intersectsGeometry( left, bvh, otherGeometry, geometryToBvh, cachedObb );\n\n\t\tif ( leftIntersection ) return true;\n\n\t\tarrayToBox( BOUNDING_DATA_INDEX( right ), float32Array, boundingBox );\n\t\tconst rightIntersection =\n\t\t\tcachedObb.intersectsBox( boundingBox ) &&\n\t\t\t_intersectsGeometry( right, bvh, otherGeometry, geometryToBvh, cachedObb );\n\n\t\tif ( rightIntersection ) return true;\n\n\t\treturn false;\n\n\t}\n\n}\n\nexport { intersectsGeometry };\n","import { Matrix4, Vector3 } from 'three';\nimport { OrientedBox } from '../../math/OrientedBox.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\nimport { getTriCount } from '../build/geometryUtils.js';\nimport { ExtendedTrianglePool } from '../../utils/ExtendedTrianglePool.js';\n\n/*********************************************************************/\n/* This file is generated from \"closestPointToGeometry.template.js\". */\n/*********************************************************************/\n\nconst tempMatrix = /* @__PURE__ */ new Matrix4();\nconst obb = /* @__PURE__ */ new OrientedBox();\nconst obb2 = /* @__PURE__ */ new OrientedBox();\nconst temp1 = /* @__PURE__ */ new Vector3();\nconst temp2 = /* @__PURE__ */ new Vector3();\nconst temp3 = /* @__PURE__ */ new Vector3();\nconst temp4 = /* @__PURE__ */ new Vector3();\n\nfunction closestPointToGeometry(\n\tbvh,\n\totherGeometry,\n\tgeometryToBvh,\n\ttarget1 = { },\n\ttarget2 = { },\n\tminThreshold = 0,\n\tmaxThreshold = Infinity,\n) {\n\n\tif ( ! otherGeometry.boundingBox ) {\n\n\t\totherGeometry.computeBoundingBox();\n\n\t}\n\n\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\n\tobb.needsUpdate = true;\n\n\tconst geometry = bvh.geometry;\n\tconst pos = geometry.attributes.position;\n\tconst index = geometry.index;\n\tconst otherPos = otherGeometry.attributes.position;\n\tconst otherIndex = otherGeometry.index;\n\tconst triangle = ExtendedTrianglePool.getPrimitive();\n\tconst triangle2 = ExtendedTrianglePool.getPrimitive();\n\n\tlet tempTarget1 = temp1;\n\tlet tempTargetDest1 = temp2;\n\tlet tempTarget2 = null;\n\tlet tempTargetDest2 = null;\n\n\tif ( target2 ) {\n\n\t\ttempTarget2 = temp3;\n\t\ttempTargetDest2 = temp4;\n\n\t}\n\n\tlet closestDistance = Infinity;\n\tlet closestDistanceTriIndex = null;\n\tlet closestDistanceOtherTriIndex = null;\n\ttempMatrix.copy( geometryToBvh ).invert();\n\tobb2.matrix.copy( tempMatrix );\n\tbvh.shapecast(\n\t\t{\n\n\t\t\tboundsTraverseOrder: box => {\n\n\t\t\t\treturn obb.distanceToBox( box );\n\n\t\t\t},\n\n\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\n\n\t\t\t\tif ( score < closestDistance && score < maxThreshold ) {\n\n\t\t\t\t\t// if we know the triangles of this bounds will be intersected next then\n\t\t\t\t\t// save the bounds to use during triangle checks.\n\t\t\t\t\tif ( isLeaf ) {\n\n\t\t\t\t\t\tobb2.min.copy( box.min );\n\t\t\t\t\t\tobb2.max.copy( box.max );\n\t\t\t\t\t\tobb2.needsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\tintersectsRange: ( offset, count ) => {\n\n\t\t\t\tif ( otherGeometry.boundsTree ) {\n\n\t\t\t\t\t// if the other geometry has a bvh then use the accelerated path where we use shapecast to find\n\t\t\t\t\t// the closest bounds in the other geometry to check.\n\t\t\t\t\tconst otherBvh = otherGeometry.boundsTree;\n\t\t\t\t\treturn otherBvh.shapecast( {\n\t\t\t\t\t\tboundsTraverseOrder: box => {\n\n\t\t\t\t\t\t\treturn obb2.distanceToBox( box );\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\n\n\t\t\t\t\t\t\treturn score < closestDistance && score < maxThreshold;\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\tintersectsRange: ( otherOffset, otherCount ) => {\n\n\t\t\t\t\t\t\tfor ( let i2 = otherOffset, l2 = otherOffset + otherCount; i2 < l2; i2 ++ ) {\n\n\n\t\t\t\t\t\t\t\tsetTriangle( triangle2, 3 * i2, otherIndex, otherPos );\n\n\t\t\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\t\t\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\n\t\t\t\t\t\t\t\t\tsetTriangle( triangle, 3 * i, index, pos );\n\n\t\t\t\t\t\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\n\t\t\t\t\t\t\t\t\tif ( dist < closestDistance ) {\n\n\t\t\t\t\t\t\t\t\t\ttempTargetDest1.copy( tempTarget1 );\n\n\t\t\t\t\t\t\t\t\t\tif ( tempTargetDest2 ) {\n\n\t\t\t\t\t\t\t\t\t\t\ttempTargetDest2.copy( tempTarget2 );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tclosestDistance = dist;\n\t\t\t\t\t\t\t\t\t\tclosestDistanceTriIndex = i;\n\t\t\t\t\t\t\t\t\t\tclosestDistanceOtherTriIndex = i2;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\n\t\t\t\t\t\t\t\t\tif ( dist < minThreshold ) {\n\n\t\t\t\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t},\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// If no bounds tree then we'll just check every triangle.\n\t\t\t\t\tconst triCount = getTriCount( otherGeometry );\n\t\t\t\t\tfor ( let i2 = 0, l2 = triCount; i2 < l2; i2 ++ ) {\n\n\t\t\t\t\t\tsetTriangle( triangle2, 3 * i2, otherIndex, otherPos );\n\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\n\t\t\t\t\t\t\tsetTriangle( triangle, 3 * i, index, pos );\n\n\t\t\t\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\n\t\t\t\t\t\t\tif ( dist < closestDistance ) {\n\n\t\t\t\t\t\t\t\ttempTargetDest1.copy( tempTarget1 );\n\n\t\t\t\t\t\t\t\tif ( tempTargetDest2 ) {\n\n\t\t\t\t\t\t\t\t\ttempTargetDest2.copy( tempTarget2 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tclosestDistance = dist;\n\t\t\t\t\t\t\t\tclosestDistanceTriIndex = i;\n\t\t\t\t\t\t\t\tclosestDistanceOtherTriIndex = i2;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\n\t\t\t\t\t\t\tif ( dist < minThreshold ) {\n\n\t\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t}\n\n\t);\n\n\tExtendedTrianglePool.releasePrimitive( triangle );\n\tExtendedTrianglePool.releasePrimitive( triangle2 );\n\n\tif ( closestDistance === Infinity ) {\n\n\t\treturn null;\n\n\t}\n\n\tif ( ! target1.point ) {\n\n\t\ttarget1.point = tempTargetDest1.clone();\n\n\t} else {\n\n\t\ttarget1.point.copy( tempTargetDest1 );\n\n\t}\n\n\ttarget1.distance = closestDistance,\n\ttarget1.faceIndex = closestDistanceTriIndex;\n\n\tif ( target2 ) {\n\n\t\tif ( ! target2.point ) target2.point = tempTargetDest2.clone();\n\t\telse target2.point.copy( tempTargetDest2 );\n\t\ttarget2.point.applyMatrix4( tempMatrix );\n\t\ttempTargetDest1.applyMatrix4( tempMatrix );\n\t\ttarget2.distance = tempTargetDest1.sub( target2.point ).length();\n\t\ttarget2.faceIndex = closestDistanceOtherTriIndex;\n\n\t}\n\n\treturn target1;\n\n}\n\nexport { closestPointToGeometry };\n","import { UINT32_PER_NODE, BYTES_PER_NODE } from '../Constants.js';\nimport { IS_LEAF, OFFSET, COUNT, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\n\n/****************************************************/\n/* This file is generated from \"refit.template.js\". */\n/****************************************************/\n\nfunction refit_indirect( bvh, nodeIndices = null ) {\n\n\tif ( nodeIndices && Array.isArray( nodeIndices ) ) {\n\n\t\tnodeIndices = new Set( nodeIndices );\n\n\t}\n\n\tconst geometry = bvh.geometry;\n\tconst indexArr = geometry.index ? geometry.index.array : null;\n\tconst posAttr = geometry.attributes.position;\n\n\tlet buffer, uint32Array, uint16Array, float32Array;\n\tlet byteOffset = 0;\n\tconst roots = bvh._roots;\n\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\tbuffer = roots[ i ];\n\t\tuint32Array = new Uint32Array( buffer );\n\t\tuint16Array = new Uint16Array( buffer );\n\t\tfloat32Array = new Float32Array( buffer );\n\n\t\t_traverse( 0, byteOffset );\n\t\tbyteOffset += buffer.byteLength;\n\n\t}\n\n\tfunction _traverse( nodeIndex32, byteOffset, force = false ) {\n\n\t\tconst nodeIndex16 = nodeIndex32 * 2;\n\t\tif ( IS_LEAF( nodeIndex16, uint16Array ) ) {\n\n\t\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\t\t\tlet minx = Infinity;\n\t\t\tlet miny = Infinity;\n\t\t\tlet minz = Infinity;\n\t\t\tlet maxx = - Infinity;\n\t\t\tlet maxy = - Infinity;\n\t\t\tlet maxz = - Infinity;\n\n\t\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\t\t\t\tconst t = 3 * bvh.resolveTriangleIndex( i );\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tlet index = t + j;\n\t\t\t\t\tindex = indexArr ? indexArr[ index ] : index;\n\n\t\t\t\t\tconst x = posAttr.getX( index );\n\t\t\t\t\tconst y = posAttr.getY( index );\n\t\t\t\t\tconst z = posAttr.getZ( index );\n\n\t\t\t\t\tif ( x < minx ) minx = x;\n\t\t\t\t\tif ( x > maxx ) maxx = x;\n\n\t\t\t\t\tif ( y < miny ) miny = y;\n\t\t\t\t\tif ( y > maxy ) maxy = y;\n\n\t\t\t\t\tif ( z < minz ) minz = z;\n\t\t\t\t\tif ( z > maxz ) maxz = z;\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tif (\n\t\t\t\tfloat32Array[ nodeIndex32 + 0 ] !== minx ||\n\t\t\t\tfloat32Array[ nodeIndex32 + 1 ] !== miny ||\n\t\t\t\tfloat32Array[ nodeIndex32 + 2 ] !== minz ||\n\n\t\t\t\tfloat32Array[ nodeIndex32 + 3 ] !== maxx ||\n\t\t\t\tfloat32Array[ nodeIndex32 + 4 ] !== maxy ||\n\t\t\t\tfloat32Array[ nodeIndex32 + 5 ] !== maxz\n\t\t\t) {\n\n\t\t\t\tfloat32Array[ nodeIndex32 + 0 ] = minx;\n\t\t\t\tfloat32Array[ nodeIndex32 + 1 ] = miny;\n\t\t\t\tfloat32Array[ nodeIndex32 + 2 ] = minz;\n\n\t\t\t\tfloat32Array[ nodeIndex32 + 3 ] = maxx;\n\t\t\t\tfloat32Array[ nodeIndex32 + 4 ] = maxy;\n\t\t\t\tfloat32Array[ nodeIndex32 + 5 ] = maxz;\n\n\t\t\t\treturn true;\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst left = LEFT_NODE( nodeIndex32 );\n\t\t\tconst right = RIGHT_NODE( nodeIndex32, uint32Array );\n\n\t\t\t// the identifying node indices provided by the shapecast function include offsets of all\n\t\t\t// root buffers to guarantee they're unique between roots so offset left and right indices here.\n\t\t\tlet forceChildren = force;\n\t\t\tlet includesLeft = false;\n\t\t\tlet includesRight = false;\n\n\t\t\tif ( nodeIndices ) {\n\n\t\t\t\t// if we see that neither the left or right child are included in the set that need to be updated\n\t\t\t\t// then we assume that all children need to be updated.\n\t\t\t\tif ( ! forceChildren ) {\n\n\t\t\t\t\tconst leftNodeId = left / UINT32_PER_NODE + byteOffset / BYTES_PER_NODE;\n\t\t\t\t\tconst rightNodeId = right / UINT32_PER_NODE + byteOffset / BYTES_PER_NODE;\n\t\t\t\t\tincludesLeft = nodeIndices.has( leftNodeId );\n\t\t\t\t\tincludesRight = nodeIndices.has( rightNodeId );\n\t\t\t\t\tforceChildren = ! includesLeft && ! includesRight;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tincludesLeft = true;\n\t\t\t\tincludesRight = true;\n\n\t\t\t}\n\n\t\t\tconst traverseLeft = forceChildren || includesLeft;\n\t\t\tconst traverseRight = forceChildren || includesRight;\n\n\t\t\tlet leftChange = false;\n\t\t\tif ( traverseLeft ) {\n\n\t\t\t\tleftChange = _traverse( left, byteOffset, forceChildren );\n\n\t\t\t}\n\n\t\t\tlet rightChange = false;\n\t\t\tif ( traverseRight ) {\n\n\t\t\t\trightChange = _traverse( right, byteOffset, forceChildren );\n\n\t\t\t}\n\n\t\t\tconst didChange = leftChange || rightChange;\n\t\t\tif ( didChange ) {\n\n\t\t\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\tconst left_i = left + i;\n\t\t\t\t\tconst right_i = right + i;\n\t\t\t\t\tconst minLeftValue = float32Array[ left_i ];\n\t\t\t\t\tconst maxLeftValue = float32Array[ left_i + 3 ];\n\t\t\t\t\tconst minRightValue = float32Array[ right_i ];\n\t\t\t\t\tconst maxRightValue = float32Array[ right_i + 3 ];\n\n\t\t\t\t\tfloat32Array[ nodeIndex32 + i ] = minLeftValue < minRightValue ? minLeftValue : minRightValue;\n\t\t\t\t\tfloat32Array[ nodeIndex32 + i + 3 ] = maxLeftValue > maxRightValue ? maxLeftValue : maxRightValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn didChange;\n\n\t\t}\n\n\t}\n\n}\n\nexport { refit_indirect };\n","import { intersectRay } from '../utils/intersectUtils.js';\nimport { IS_LEAF, OFFSET, COUNT, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport '../utils/iterationUtils.generated.js';\nimport { intersectTris_indirect } from '../utils/iterationUtils_indirect.generated.js';\n\n/******************************************************/\n/* This file is generated from \"raycast.template.js\". */\n/******************************************************/\n\nfunction raycast_indirect( bvh, root, materialOrSide, ray, intersects, near, far ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\t_raycast( 0, bvh, materialOrSide, ray, intersects, near, far );\n\tBufferStack.clearBuffer();\n\n}\n\nfunction _raycast( nodeIndex32, bvh, materialOrSide, ray, intersects, near, far ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tconst nodeIndex16 = nodeIndex32 * 2;\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\t\tintersectTris_indirect( bvh, materialOrSide, ray, offset, count, intersects, near, far );\n\n\n\t} else {\n\n\t\tconst leftIndex = LEFT_NODE( nodeIndex32 );\n\t\tif ( intersectRay( leftIndex, float32Array, ray, near, far ) ) {\n\n\t\t\t_raycast( leftIndex, bvh, materialOrSide, ray, intersects, near, far );\n\n\t\t}\n\n\t\tconst rightIndex = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\tif ( intersectRay( rightIndex, float32Array, ray, near, far ) ) {\n\n\t\t\t_raycast( rightIndex, bvh, materialOrSide, ray, intersects, near, far );\n\n\t\t}\n\n\t}\n\n}\n\nexport { raycast_indirect };\n","import { IS_LEAF, OFFSET, COUNT, SPLIT_AXIS, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport { intersectRay } from '../utils/intersectUtils.js';\nimport '../utils/iterationUtils.generated.js';\nimport { intersectClosestTri_indirect } from '../utils/iterationUtils_indirect.generated.js';\n\n/***********************************************************/\n/* This file is generated from \"raycastFirst.template.js\". */\n/***********************************************************/\n\nconst _xyzFields = [ 'x', 'y', 'z' ];\n\nfunction raycastFirst_indirect( bvh, root, materialOrSide, ray, near, far ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\tconst result = _raycastFirst( 0, bvh, materialOrSide, ray, near, far );\n\tBufferStack.clearBuffer();\n\n\treturn result;\n\n}\n\nfunction _raycastFirst( nodeIndex32, bvh, materialOrSide, ray, near, far ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\t\treturn intersectClosestTri_indirect( bvh, materialOrSide, ray, offset, count, near, far );\n\n\n\t} else {\n\n\t\t// consider the position of the split plane with respect to the oncoming ray; whichever direction\n\t\t// the ray is coming from, look for an intersection among that side of the tree first\n\t\tconst splitAxis = SPLIT_AXIS( nodeIndex32, uint32Array );\n\t\tconst xyzAxis = _xyzFields[ splitAxis ];\n\t\tconst rayDir = ray.direction[ xyzAxis ];\n\t\tconst leftToRight = rayDir >= 0;\n\n\t\t// c1 is the child to check first\n\t\tlet c1, c2;\n\t\tif ( leftToRight ) {\n\n\t\t\tc1 = LEFT_NODE( nodeIndex32 );\n\t\t\tc2 = RIGHT_NODE( nodeIndex32, uint32Array );\n\n\t\t} else {\n\n\t\t\tc1 = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\t\tc2 = LEFT_NODE( nodeIndex32 );\n\n\t\t}\n\n\t\tconst c1Intersection = intersectRay( c1, float32Array, ray, near, far );\n\t\tconst c1Result = c1Intersection ? _raycastFirst( c1, bvh, materialOrSide, ray, near, far ) : null;\n\n\t\t// if we got an intersection in the first node and it's closer than the second node's bounding\n\t\t// box, we don't need to consider the second node because it couldn't possibly be a better result\n\t\tif ( c1Result ) {\n\n\t\t\t// check if the point is within the second bounds\n\t\t\t// \"point\" is in the local frame of the bvh\n\t\t\tconst point = c1Result.point[ xyzAxis ];\n\t\t\tconst isOutside = leftToRight ?\n\t\t\t\tpoint <= float32Array[ c2 + splitAxis ] : // min bounding data\n\t\t\t\tpoint >= float32Array[ c2 + splitAxis + 3 ]; // max bounding data\n\n\t\t\tif ( isOutside ) {\n\n\t\t\t\treturn c1Result;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// either there was no intersection in the first node, or there could still be a closer\n\t\t// intersection in the second, so check the second node and then take the better of the two\n\t\tconst c2Intersection = intersectRay( c2, float32Array, ray, near, far );\n\t\tconst c2Result = c2Intersection ? _raycastFirst( c2, bvh, materialOrSide, ray, near, far ) : null;\n\n\t\tif ( c1Result && c2Result ) {\n\n\t\t\treturn c1Result.distance <= c2Result.distance ? c1Result : c2Result;\n\n\t\t} else {\n\n\t\t\treturn c1Result || c2Result || null;\n\n\t\t}\n\n\t}\n\n}\n\nexport { raycastFirst_indirect };\n","import { Box3, Matrix4 } from 'three';\nimport { OrientedBox } from '../../math/OrientedBox.js';\nimport { ExtendedTriangle } from '../../math/ExtendedTriangle.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\nimport { arrayToBox } from '../../utils/ArrayBoxUtilities.js';\nimport { IS_LEAF, OFFSET, COUNT, BOUNDING_DATA_INDEX, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport { getTriCount } from '../build/geometryUtils.js';\n\n/*****************************************************************/\n/* This file is generated from \"intersectsGeometry.template.js\". */\n/*****************************************************************/\n/* eslint-disable indent */\n\nconst boundingBox = /* @__PURE__ */ new Box3();\nconst triangle = /* @__PURE__ */ new ExtendedTriangle();\nconst triangle2 = /* @__PURE__ */ new ExtendedTriangle();\nconst invertedMat = /* @__PURE__ */ new Matrix4();\n\nconst obb = /* @__PURE__ */ new OrientedBox();\nconst obb2 = /* @__PURE__ */ new OrientedBox();\n\nfunction intersectsGeometry_indirect( bvh, root, otherGeometry, geometryToBvh ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\tconst result = _intersectsGeometry( 0, bvh, otherGeometry, geometryToBvh );\n\tBufferStack.clearBuffer();\n\n\treturn result;\n\n}\n\nfunction _intersectsGeometry( nodeIndex32, bvh, otherGeometry, geometryToBvh, cachedObb = null ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\tif ( cachedObb === null ) {\n\n\t\tif ( ! otherGeometry.boundingBox ) {\n\n\t\t\totherGeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\n\t\tcachedObb = obb;\n\n\t}\n\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst thisGeometry = bvh.geometry;\n\t\tconst thisIndex = thisGeometry.index;\n\t\tconst thisPos = thisGeometry.attributes.position;\n\n\t\tconst otherIndex = otherGeometry.index;\n\t\tconst otherPos = otherGeometry.attributes.position;\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\t\t// get the inverse of the geometry matrix so we can transform our triangles into the\n\t\t// geometry space we're trying to test. We assume there are fewer triangles being checked\n\t\t// here.\n\t\tinvertedMat.copy( geometryToBvh ).invert();\n\n\t\tif ( otherGeometry.boundsTree ) {\n\n\t\t\t// if there's a bounds tree\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( nodeIndex32 ), float32Array, obb2 );\n\t\t\tobb2.matrix.copy( invertedMat );\n\t\t\tobb2.needsUpdate = true;\n\n\t\t\t// TODO: use a triangle iteration function here\n\t\t\tconst res = otherGeometry.boundsTree.shapecast( {\n\n\t\t\t\tintersectsBounds: box => obb2.intersectsBox( box ),\n\n\t\t\t\tintersectsTriangle: tri => {\n\n\t\t\t\t\ttri.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.needsUpdate = true;\n\n\t\t\t\t\tfor ( let i = offset, l = count + offset; i < l; i ++ ) {\n\n\t\t\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\n\t\t\t\t\t\tsetTriangle( triangle2, 3 * bvh.resolveTriangleIndex( i ), thisIndex, thisPos );\n\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\t\t\t\t\t\tif ( tri.intersectsTriangle( triangle2 ) ) {\n\n\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\treturn res;\n\n\t\t} else {\n\n\t\t\t// if we're just dealing with raw geometry\n\t\t\tconst otherTriangleCount = getTriCount( otherGeometry );\n\n\t\t\tfor ( let i = offset, l = count + offset; i < l; i ++ ) {\n\n\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\n\t\t\t\tconst ti = bvh.resolveTriangleIndex( i );\n\t\t\t\tsetTriangle( triangle, 3 * ti, thisIndex, thisPos );\n\n\n\t\t\t\ttriangle.a.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.b.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.c.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\tfor ( let i2 = 0, l2 = otherTriangleCount * 3; i2 < l2; i2 += 3 ) {\n\n\t\t\t\t\tsetTriangle( triangle2, i2, otherIndex, otherPos );\n\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\tif ( triangle.intersectsTriangle( triangle2 ) ) {\n\n\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t} else {\n\n\t\tconst left = LEFT_NODE( nodeIndex32 );\n\t\tconst right = RIGHT_NODE( nodeIndex32, uint32Array );\n\n\t\tarrayToBox( BOUNDING_DATA_INDEX( left ), float32Array, boundingBox );\n\t\tconst leftIntersection =\n\t\t\tcachedObb.intersectsBox( boundingBox ) &&\n\t\t\t_intersectsGeometry( left, bvh, otherGeometry, geometryToBvh, cachedObb );\n\n\t\tif ( leftIntersection ) return true;\n\n\t\tarrayToBox( BOUNDING_DATA_INDEX( right ), float32Array, boundingBox );\n\t\tconst rightIntersection =\n\t\t\tcachedObb.intersectsBox( boundingBox ) &&\n\t\t\t_intersectsGeometry( right, bvh, otherGeometry, geometryToBvh, cachedObb );\n\n\t\tif ( rightIntersection ) return true;\n\n\t\treturn false;\n\n\t}\n\n}\n\nexport { intersectsGeometry_indirect };\n","import { Matrix4, Vector3 } from 'three';\nimport { OrientedBox } from '../../math/OrientedBox.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\nimport { getTriCount } from '../build/geometryUtils.js';\nimport { ExtendedTrianglePool } from '../../utils/ExtendedTrianglePool.js';\n\n/*********************************************************************/\n/* This file is generated from \"closestPointToGeometry.template.js\". */\n/*********************************************************************/\n\nconst tempMatrix = /* @__PURE__ */ new Matrix4();\nconst obb = /* @__PURE__ */ new OrientedBox();\nconst obb2 = /* @__PURE__ */ new OrientedBox();\nconst temp1 = /* @__PURE__ */ new Vector3();\nconst temp2 = /* @__PURE__ */ new Vector3();\nconst temp3 = /* @__PURE__ */ new Vector3();\nconst temp4 = /* @__PURE__ */ new Vector3();\n\nfunction closestPointToGeometry_indirect(\n\tbvh,\n\totherGeometry,\n\tgeometryToBvh,\n\ttarget1 = { },\n\ttarget2 = { },\n\tminThreshold = 0,\n\tmaxThreshold = Infinity,\n) {\n\n\tif ( ! otherGeometry.boundingBox ) {\n\n\t\totherGeometry.computeBoundingBox();\n\n\t}\n\n\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\n\tobb.needsUpdate = true;\n\n\tconst geometry = bvh.geometry;\n\tconst pos = geometry.attributes.position;\n\tconst index = geometry.index;\n\tconst otherPos = otherGeometry.attributes.position;\n\tconst otherIndex = otherGeometry.index;\n\tconst triangle = ExtendedTrianglePool.getPrimitive();\n\tconst triangle2 = ExtendedTrianglePool.getPrimitive();\n\n\tlet tempTarget1 = temp1;\n\tlet tempTargetDest1 = temp2;\n\tlet tempTarget2 = null;\n\tlet tempTargetDest2 = null;\n\n\tif ( target2 ) {\n\n\t\ttempTarget2 = temp3;\n\t\ttempTargetDest2 = temp4;\n\n\t}\n\n\tlet closestDistance = Infinity;\n\tlet closestDistanceTriIndex = null;\n\tlet closestDistanceOtherTriIndex = null;\n\ttempMatrix.copy( geometryToBvh ).invert();\n\tobb2.matrix.copy( tempMatrix );\n\tbvh.shapecast(\n\t\t{\n\n\t\t\tboundsTraverseOrder: box => {\n\n\t\t\t\treturn obb.distanceToBox( box );\n\n\t\t\t},\n\n\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\n\n\t\t\t\tif ( score < closestDistance && score < maxThreshold ) {\n\n\t\t\t\t\t// if we know the triangles of this bounds will be intersected next then\n\t\t\t\t\t// save the bounds to use during triangle checks.\n\t\t\t\t\tif ( isLeaf ) {\n\n\t\t\t\t\t\tobb2.min.copy( box.min );\n\t\t\t\t\t\tobb2.max.copy( box.max );\n\t\t\t\t\t\tobb2.needsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\tintersectsRange: ( offset, count ) => {\n\n\t\t\t\tif ( otherGeometry.boundsTree ) {\n\n\t\t\t\t\t// if the other geometry has a bvh then use the accelerated path where we use shapecast to find\n\t\t\t\t\t// the closest bounds in the other geometry to check.\n\t\t\t\t\tconst otherBvh = otherGeometry.boundsTree;\n\t\t\t\t\treturn otherBvh.shapecast( {\n\t\t\t\t\t\tboundsTraverseOrder: box => {\n\n\t\t\t\t\t\t\treturn obb2.distanceToBox( box );\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\n\n\t\t\t\t\t\t\treturn score < closestDistance && score < maxThreshold;\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\tintersectsRange: ( otherOffset, otherCount ) => {\n\n\t\t\t\t\t\t\tfor ( let i2 = otherOffset, l2 = otherOffset + otherCount; i2 < l2; i2 ++ ) {\n\n\t\t\t\t\t\t\t\tconst ti2 = otherBvh.resolveTriangleIndex( i2 );\n\t\t\t\t\t\t\t\tsetTriangle( triangle2, 3 * ti2, otherIndex, otherPos );\n\n\t\t\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\t\t\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tconst ti = bvh.resolveTriangleIndex( i );\n\t\t\t\t\t\t\t\t\tsetTriangle( triangle, 3 * ti, index, pos );\n\n\t\t\t\t\t\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\n\t\t\t\t\t\t\t\t\tif ( dist < closestDistance ) {\n\n\t\t\t\t\t\t\t\t\t\ttempTargetDest1.copy( tempTarget1 );\n\n\t\t\t\t\t\t\t\t\t\tif ( tempTargetDest2 ) {\n\n\t\t\t\t\t\t\t\t\t\t\ttempTargetDest2.copy( tempTarget2 );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tclosestDistance = dist;\n\t\t\t\t\t\t\t\t\t\tclosestDistanceTriIndex = i;\n\t\t\t\t\t\t\t\t\t\tclosestDistanceOtherTriIndex = i2;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\n\t\t\t\t\t\t\t\t\tif ( dist < minThreshold ) {\n\n\t\t\t\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t},\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// If no bounds tree then we'll just check every triangle.\n\t\t\t\t\tconst triCount = getTriCount( otherGeometry );\n\t\t\t\t\tfor ( let i2 = 0, l2 = triCount; i2 < l2; i2 ++ ) {\n\n\t\t\t\t\t\tsetTriangle( triangle2, 3 * i2, otherIndex, otherPos );\n\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst ti = bvh.resolveTriangleIndex( i );\n\t\t\t\t\t\t\tsetTriangle( triangle, 3 * ti, index, pos );\n\n\t\t\t\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\n\t\t\t\t\t\t\tif ( dist < closestDistance ) {\n\n\t\t\t\t\t\t\t\ttempTargetDest1.copy( tempTarget1 );\n\n\t\t\t\t\t\t\t\tif ( tempTargetDest2 ) {\n\n\t\t\t\t\t\t\t\t\ttempTargetDest2.copy( tempTarget2 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tclosestDistance = dist;\n\t\t\t\t\t\t\t\tclosestDistanceTriIndex = i;\n\t\t\t\t\t\t\t\tclosestDistanceOtherTriIndex = i2;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\n\t\t\t\t\t\t\tif ( dist < minThreshold ) {\n\n\t\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t}\n\n\t);\n\n\tExtendedTrianglePool.releasePrimitive( triangle );\n\tExtendedTrianglePool.releasePrimitive( triangle2 );\n\n\tif ( closestDistance === Infinity ) {\n\n\t\treturn null;\n\n\t}\n\n\tif ( ! target1.point ) {\n\n\t\ttarget1.point = tempTargetDest1.clone();\n\n\t} else {\n\n\t\ttarget1.point.copy( tempTargetDest1 );\n\n\t}\n\n\ttarget1.distance = closestDistance,\n\ttarget1.faceIndex = closestDistanceTriIndex;\n\n\tif ( target2 ) {\n\n\t\tif ( ! target2.point ) target2.point = tempTargetDest2.clone();\n\t\telse target2.point.copy( tempTargetDest2 );\n\t\ttarget2.point.applyMatrix4( tempMatrix );\n\t\ttempTargetDest1.applyMatrix4( tempMatrix );\n\t\ttarget2.distance = tempTargetDest1.sub( target2.point ).length();\n\t\ttarget2.faceIndex = closestDistanceOtherTriIndex;\n\n\t}\n\n\treturn target1;\n\n}\n\nexport { closestPointToGeometry_indirect };\n","// converts the given BVH raycast intersection to align with the three.js raycast\n// structure (include object, world space distance and point).\nexport function convertRaycastIntersect( hit, object, raycaster ) {\n\n\tif ( hit === null ) {\n\n\t\treturn null;\n\n\t}\n\n\thit.point.applyMatrix4( object.matrixWorld );\n\thit.distance = hit.point.distanceTo( raycaster.ray.origin );\n\thit.object = object;\n\n\treturn hit;\n\n}\n","import { BufferAttribute, FrontSide, Ray, Vector3, Matrix4 } from 'three';\nimport { SKIP_GENERATION, BYTES_PER_NODE, UINT32_PER_NODE, FLOAT32_EPSILON } from './Constants.js';\nimport { OrientedBox } from '../math/OrientedBox.js';\nimport { ExtendedTrianglePool } from '../utils/ExtendedTrianglePool.js';\nimport { closestPointToPoint } from './cast/closestPointToPoint.js';\nimport { IS_LEAF } from './utils/nodeBufferUtils.js';\n\nimport { iterateOverTriangles } from './utils/iterationUtils.generated.js';\nimport { refit } from './cast/refit.generated.js';\nimport { raycast } from './cast/raycast.generated.js';\nimport { raycastFirst } from './cast/raycastFirst.generated.js';\nimport { intersectsGeometry } from './cast/intersectsGeometry.generated.js';\nimport { closestPointToGeometry } from './cast/closestPointToGeometry.generated.js';\n\nimport { iterateOverTriangles_indirect } from './utils/iterationUtils_indirect.generated.js';\nimport { refit_indirect } from './cast/refit_indirect.generated.js';\nimport { raycast_indirect } from './cast/raycast_indirect.generated.js';\nimport { raycastFirst_indirect } from './cast/raycastFirst_indirect.generated.js';\nimport { intersectsGeometry_indirect } from './cast/intersectsGeometry_indirect.generated.js';\nimport { closestPointToGeometry_indirect } from './cast/closestPointToGeometry_indirect.generated.js';\nimport { setTriangle } from '../utils/TriangleUtilities.js';\nimport { convertRaycastIntersect } from '../utils/GeometryRayIntersectUtilities.js';\nimport { GeometryBVH } from './GeometryBVH.js';\n\nconst _obb = /* @__PURE__ */ new OrientedBox();\nconst _ray = /* @__PURE__ */ new Ray();\nconst _direction = /* @__PURE__ */ new Vector3();\nconst _inverseMatrix = /* @__PURE__ */ new Matrix4();\nconst _worldScale = /* @__PURE__ */ new Vector3();\nconst _getters = [ 'getX', 'getY', 'getZ' ];\n\nexport class MeshBVH extends GeometryBVH {\n\n\tstatic serialize( bvh, options = {} ) {\n\n\t\toptions = {\n\t\t\tcloneBuffers: true,\n\t\t\t...options,\n\t\t};\n\n\t\tconst geometry = bvh.geometry;\n\t\tconst rootData = bvh._roots;\n\t\tconst indirectBuffer = bvh._indirectBuffer;\n\t\tconst indexAttribute = geometry.getIndex();\n\t\tconst result = {\n\t\t\tversion: 1,\n\t\t\troots: null,\n\t\t\tindex: null,\n\t\t\tindirectBuffer: null,\n\t\t};\n\t\tif ( options.cloneBuffers ) {\n\n\t\t\tresult.roots = rootData.map( root => root.slice() );\n\t\t\tresult.index = indexAttribute ? indexAttribute.array.slice() : null;\n\t\t\tresult.indirectBuffer = indirectBuffer ? indirectBuffer.slice() : null;\n\n\t\t} else {\n\n\t\t\tresult.roots = rootData;\n\t\t\tresult.index = indexAttribute ? indexAttribute.array : null;\n\t\t\tresult.indirectBuffer = indirectBuffer;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tstatic deserialize( data, geometry, options = {} ) {\n\n\t\toptions = {\n\t\t\tsetIndex: true,\n\t\t\tindirect: Boolean( data.indirectBuffer ),\n\t\t\t...options,\n\t\t};\n\n\t\tconst { index, roots, indirectBuffer } = data;\n\n\t\t// handle backwards compatibility by fixing up the buffer roots\n\t\t// see issue gkjohnson/three-mesh-bvh#759\n\t\tif ( ! data.version ) {\n\n\t\t\tconsole.warn(\n\t\t\t\t'MeshBVH.deserialize: Serialization format has been changed and will be fixed up. ' +\n\t\t\t\t'It is recommended to regenerate any stored serialized data.'\n\t\t\t);\n\t\t\tfixupVersion0( roots );\n\n\t\t}\n\n\t\tconst bvh = new MeshBVH( geometry, { ...options, [ SKIP_GENERATION ]: true } );\n\t\tbvh._roots = roots;\n\t\tbvh._indirectBuffer = indirectBuffer || null;\n\n\t\tif ( options.setIndex ) {\n\n\t\t\tconst indexAttribute = geometry.getIndex();\n\t\t\tif ( indexAttribute === null ) {\n\n\t\t\t\tconst newIndex = new BufferAttribute( data.index, 1, false );\n\t\t\t\tgeometry.setIndex( newIndex );\n\n\t\t\t} else if ( indexAttribute.array !== index ) {\n\n\t\t\t\tindexAttribute.array.set( index );\n\t\t\t\tindexAttribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn bvh;\n\n\t\t// convert version 0 serialized data (uint32 indices) to version 1 (node indices)\n\t\tfunction fixupVersion0( roots ) {\n\n\t\t\tfor ( let rootIndex = 0; rootIndex < roots.length; rootIndex ++ ) {\n\n\t\t\t\tconst root = roots[ rootIndex ];\n\t\t\t\tconst uint32Array = new Uint32Array( root );\n\t\t\t\tconst uint16Array = new Uint16Array( root );\n\n\t\t\t\t// iterate over nodes and convert right child offsets\n\t\t\t\tfor ( let node = 0, l = root.byteLength / BYTES_PER_NODE; node < l; node ++ ) {\n\n\t\t\t\t\tconst node32Index = UINT32_PER_NODE * node;\n\t\t\t\t\tconst node16Index = 2 * node32Index;\n\t\t\t\t\tif ( ! IS_LEAF( node16Index, uint16Array ) ) {\n\n\t\t\t\t\t\t// convert absolute right child offset to relative offset\n\t\t\t\t\t\tuint32Array[ node32Index + 6 ] = uint32Array[ node32Index + 6 ] / UINT32_PER_NODE - node;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tget primitiveStride() {\n\n\t\treturn 3;\n\n\t}\n\n\tget resolveTriangleIndex() {\n\n\t\treturn this.resolvePrimitiveIndex;\n\n\t}\n\n\tconstructor( geometry, options = {} ) {\n\n\t\tif ( options.maxLeafTris ) {\n\n\t\t\tconsole.warn( 'MeshBVH: \"maxLeafTris\" option has been deprecated. Use maxLeafSize, instead.' );\n\t\t\toptions = {\n\t\t\t\t...options,\n\t\t\t\tmaxLeafSize: options.maxLeafTris,\n\t\t\t};\n\n\t\t}\n\n\t\tsuper( geometry, options );\n\n\t}\n\n\t// implement abstract methods from BVH base class\n\tshiftTriangleOffsets( offset ) {\n\n\t\treturn super.shiftPrimitiveOffsets( offset );\n\n\t}\n\n\t// write primitive bounds to the buffer - used only for validateBounds at the moment\n\twritePrimitiveBounds( i, targetBuffer, baseIndex ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst indirectBuffer = this._indirectBuffer;\n\t\tconst posAttr = geometry.attributes.position;\n\t\tconst index = geometry.index ? geometry.index.array : null;\n\n\t\tconst tri = indirectBuffer ? indirectBuffer[ i ] : i;\n\t\tconst tri3 = tri * 3;\n\n\t\tlet ai = tri3 + 0;\n\t\tlet bi = tri3 + 1;\n\t\tlet ci = tri3 + 2;\n\n\t\tif ( index ) {\n\n\t\t\tai = index[ ai ];\n\t\t\tbi = index[ bi ];\n\t\t\tci = index[ ci ];\n\n\t\t}\n\n\t\tfor ( let el = 0; el < 3; el ++ ) {\n\n\t\t\tconst a = posAttr[ _getters[ el ] ]( ai );\n\t\t\tconst b = posAttr[ _getters[ el ] ]( bi );\n\t\t\tconst c = posAttr[ _getters[ el ] ]( ci );\n\n\t\t\tlet min = a;\n\t\t\tif ( b < min ) min = b;\n\t\t\tif ( c < min ) min = c;\n\n\t\t\tlet max = a;\n\t\t\tif ( b > max ) max = b;\n\t\t\tif ( c > max ) max = c;\n\n\t\t\t// Write in min/max format [minx, miny, minz, maxx, maxy, maxz]\n\t\t\ttargetBuffer[ baseIndex + el ] = min;\n\t\t\ttargetBuffer[ baseIndex + el + 3 ] = max;\n\n\t\t}\n\n\t\treturn targetBuffer;\n\n\t}\n\n\t// precomputes the bounding box for each triangle; required for quickly calculating tree splits.\n\t// result is an array of size count * 6 where triangle i maps to a\n\t// [x_center, x_delta, y_center, y_delta, z_center, z_delta] tuple starting at index (i - offset) * 6,\n\t// representing the center and half-extent in each dimension of triangle i\n\tcomputePrimitiveBounds( offset, count, targetBuffer ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst indirectBuffer = this._indirectBuffer;\n\t\tconst posAttr = geometry.attributes.position;\n\t\tconst index = geometry.index ? geometry.index.array : null;\n\t\tconst normalized = posAttr.normalized;\n\n\t\tif ( offset < 0 || count + offset - targetBuffer.offset > targetBuffer.length / 6 ) {\n\n\t\t\tthrow new Error( 'MeshBVH: compute triangle bounds range is invalid.' );\n\n\t\t}\n\n\t\t// used for non-normalized positions\n\t\tconst posArr = posAttr.array;\n\n\t\t// support for an interleaved position buffer\n\t\tconst bufferOffset = posAttr.offset || 0;\n\t\tlet stride = 3;\n\t\tif ( posAttr.isInterleavedBufferAttribute ) {\n\n\t\t\tstride = posAttr.data.stride;\n\n\t\t}\n\n\t\t// used for normalized positions\n\t\tconst getters = [ 'getX', 'getY', 'getZ' ];\n\t\tconst writeOffset = targetBuffer.offset;\n\n\t\t// iterate over the triangle range\n\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\t\t\tconst tri = indirectBuffer ? indirectBuffer[ i ] : i;\n\t\t\tconst tri3 = tri * 3;\n\t\t\tconst boundsIndexOffset = ( i - writeOffset ) * 6;\n\n\t\t\tlet ai = tri3 + 0;\n\t\t\tlet bi = tri3 + 1;\n\t\t\tlet ci = tri3 + 2;\n\n\t\t\tif ( index ) {\n\n\t\t\t\tai = index[ ai ];\n\t\t\t\tbi = index[ bi ];\n\t\t\t\tci = index[ ci ];\n\n\t\t\t}\n\n\t\t\t// we add the stride and offset here since we access the array directly\n\t\t\t// below for the sake of performance\n\t\t\tif ( ! normalized ) {\n\n\t\t\t\tai = ai * stride + bufferOffset;\n\t\t\t\tbi = bi * stride + bufferOffset;\n\t\t\t\tci = ci * stride + bufferOffset;\n\n\t\t\t}\n\n\t\t\tfor ( let el = 0; el < 3; el ++ ) {\n\n\t\t\t\tlet a, b, c;\n\n\t\t\t\tif ( normalized ) {\n\n\t\t\t\t\ta = posAttr[ getters[ el ] ]( ai );\n\t\t\t\t\tb = posAttr[ getters[ el ] ]( bi );\n\t\t\t\t\tc = posAttr[ getters[ el ] ]( ci );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ta = posArr[ ai + el ];\n\t\t\t\t\tb = posArr[ bi + el ];\n\t\t\t\t\tc = posArr[ ci + el ];\n\n\t\t\t\t}\n\n\t\t\t\tlet min = a;\n\t\t\t\tif ( b < min ) min = b;\n\t\t\t\tif ( c < min ) min = c;\n\n\t\t\t\tlet max = a;\n\t\t\t\tif ( b > max ) max = b;\n\t\t\t\tif ( c > max ) max = c;\n\n\t\t\t\t// Increase the bounds size by float32 epsilon to avoid precision errors when\n\t\t\t\t// converting to 32 bit float. Scale the epsilon by the size of the numbers being\n\t\t\t\t// worked with.\n\t\t\t\tconst halfExtents = ( max - min ) / 2;\n\t\t\t\tconst el2 = el * 2;\n\t\t\t\ttargetBuffer[ boundsIndexOffset + el2 + 0 ] = min + halfExtents;\n\t\t\t\ttargetBuffer[ boundsIndexOffset + el2 + 1 ] = halfExtents + ( Math.abs( min ) + halfExtents ) * FLOAT32_EPSILON;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn targetBuffer;\n\n\t}\n\n\traycastObject3D( object, raycaster, intersects = [] ) {\n\n\t\tconst { material } = object;\n\t\tif ( material === undefined ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t_inverseMatrix.copy( object.matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\t_worldScale.setFromMatrixScale( object.matrixWorld );\n\t\t_direction.copy( _ray.direction ).multiply( _worldScale );\n\n\t\tconst scaleFactor = _direction.length();\n\t\tconst near = raycaster.near / scaleFactor;\n\t\tconst far = raycaster.far / scaleFactor;\n\n\t\tif ( raycaster.firstHitOnly === true ) {\n\n\t\t\tlet hit = this.raycastFirst( _ray, material, near, far );\n\t\t\thit = convertRaycastIntersect( hit, object, raycaster );\n\t\t\tif ( hit ) {\n\n\t\t\t\tintersects.push( hit );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst hits = this.raycast( _ray, material, near, far );\n\t\t\tfor ( let i = 0, l = hits.length; i < l; i ++ ) {\n\n\t\t\t\tconst hit = convertRaycastIntersect( hits[ i ], object, raycaster );\n\t\t\t\tif ( hit ) {\n\n\t\t\t\t\tintersects.push( hit );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn intersects;\n\n\t}\n\n\trefit( nodeIndices = null ) {\n\n\t\tconst refitFunc = this.indirect ? refit_indirect : refit;\n\t\treturn refitFunc( this, nodeIndices );\n\n\t}\n\n\t/* Core Cast Functions */\n\traycast( ray, materialOrSide = FrontSide, near = 0, far = Infinity ) {\n\n\t\tconst roots = this._roots;\n\t\tconst intersects = [];\n\t\tconst raycastFunc = this.indirect ? raycast_indirect : raycast;\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\t\traycastFunc( this, i, materialOrSide, ray, intersects, near, far );\n\n\t\t}\n\n\t\treturn intersects;\n\n\t}\n\n\traycastFirst( ray, materialOrSide = FrontSide, near = 0, far = Infinity ) {\n\n\t\tconst roots = this._roots;\n\t\tlet closestResult = null;\n\n\t\tconst raycastFirstFunc = this.indirect ? raycastFirst_indirect : raycastFirst;\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\t\tconst result = raycastFirstFunc( this, i, materialOrSide, ray, near, far );\n\t\t\tif ( result != null && ( closestResult == null || result.distance < closestResult.distance ) ) {\n\n\t\t\t\tclosestResult = result;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn closestResult;\n\n\t}\n\n\tintersectsGeometry( otherGeometry, geomToMesh ) {\n\n\t\tlet result = false;\n\t\tconst roots = this._roots;\n\t\tconst intersectsGeometryFunc = this.indirect ? intersectsGeometry_indirect : intersectsGeometry;\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\t\tresult = intersectsGeometryFunc( this, i, otherGeometry, geomToMesh );\n\n\t\t\tif ( result ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tshapecast( callbacks ) {\n\n\t\tconst triangle = ExtendedTrianglePool.getPrimitive();\n\t\tconst result = super.shapecast(\n\t\t\t{\n\t\t\t\t...callbacks,\n\t\t\t\tintersectsPrimitive: callbacks.intersectsTriangle,\n\t\t\t\tscratchPrimitive: triangle,\n\n\t\t\t\t// TODO: is the performance significant enough for the added complexity here?\n\t\t\t\t// can we just use one function?\n\t\t\t\titerate: this.indirect ? iterateOverTriangles_indirect : iterateOverTriangles,\n\t\t\t}\n\t\t);\n\t\tExtendedTrianglePool.releasePrimitive( triangle );\n\n\t\treturn result;\n\n\t}\n\n\tbvhcast( otherBvh, matrixToLocal, callbacks ) {\n\n\t\tlet {\n\t\t\tintersectsRanges,\n\t\t\tintersectsTriangles,\n\t\t} = callbacks;\n\n\t\tconst triangle1 = ExtendedTrianglePool.getPrimitive();\n\t\tconst indexAttr1 = this.geometry.index;\n\t\tconst positionAttr1 = this.geometry.attributes.position;\n\t\tconst assignTriangle1 = this.indirect ?\n\t\t\ti1 => {\n\n\n\t\t\t\tconst ti = this.resolveTriangleIndex( i1 );\n\t\t\t\tsetTriangle( triangle1, ti * 3, indexAttr1, positionAttr1 );\n\n\t\t\t} :\n\t\t\ti1 => {\n\n\t\t\t\tsetTriangle( triangle1, i1 * 3, indexAttr1, positionAttr1 );\n\n\t\t\t};\n\n\t\tconst triangle2 = ExtendedTrianglePool.getPrimitive();\n\t\tconst indexAttr2 = otherBvh.geometry.index;\n\t\tconst positionAttr2 = otherBvh.geometry.attributes.position;\n\t\tconst assignTriangle2 = otherBvh.indirect ?\n\t\t\ti2 => {\n\n\t\t\t\tconst ti2 = otherBvh.resolveTriangleIndex( i2 );\n\t\t\t\tsetTriangle( triangle2, ti2 * 3, indexAttr2, positionAttr2 );\n\n\t\t\t} :\n\t\t\ti2 => {\n\n\t\t\t\tsetTriangle( triangle2, i2 * 3, indexAttr2, positionAttr2 );\n\n\t\t\t};\n\n\t\t// generate triangle callback if needed\n\t\tif ( intersectsTriangles ) {\n\n\t\t\tif ( ! ( otherBvh instanceof MeshBVH ) ) {\n\n\t\t\t\tthrow new Error( 'MeshBVH: \"intersectsTriangles\" callback can only be used with another MeshBVH.' );\n\n\t\t\t}\n\n\t\t\tconst iterateOverDoubleTriangles = ( offset1, count1, offset2, count2, depth1, nodeIndex1, depth2, nodeIndex2 ) => {\n\n\t\t\t\tfor ( let i2 = offset2, l2 = offset2 + count2; i2 < l2; i2 ++ ) {\n\n\t\t\t\t\tassignTriangle2( i2 );\n\n\t\t\t\t\ttriangle2.a.applyMatrix4( matrixToLocal );\n\t\t\t\t\ttriangle2.b.applyMatrix4( matrixToLocal );\n\t\t\t\t\ttriangle2.c.applyMatrix4( matrixToLocal );\n\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\tfor ( let i1 = offset1, l1 = offset1 + count1; i1 < l1; i1 ++ ) {\n\n\t\t\t\t\t\tassignTriangle1( i1 );\n\n\t\t\t\t\t\ttriangle1.needsUpdate = true;\n\n\t\t\t\t\t\tif ( intersectsTriangles( triangle1, triangle2, i1, i2, depth1, nodeIndex1, depth2, nodeIndex2 ) ) {\n\n\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t};\n\n\t\t\tif ( intersectsRanges ) {\n\n\t\t\t\tconst originalIntersectsRanges = intersectsRanges;\n\t\t\t\tintersectsRanges = function ( offset1, count1, offset2, count2, depth1, nodeIndex1, depth2, nodeIndex2 ) {\n\n\t\t\t\t\tif ( ! originalIntersectsRanges( offset1, count1, offset2, count2, depth1, nodeIndex1, depth2, nodeIndex2 ) ) {\n\n\t\t\t\t\t\treturn iterateOverDoubleTriangles( offset1, count1, offset2, count2, depth1, nodeIndex1, depth2, nodeIndex2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tintersectsRanges = iterateOverDoubleTriangles;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn super.bvhcast( otherBvh, matrixToLocal, { intersectsRanges } );\n\n\t}\n\n\n\t/* Derived Cast Functions */\n\tintersectsBox( box, boxToMesh ) {\n\n\t\t_obb.set( box.min, box.max, boxToMesh );\n\t\t_obb.needsUpdate = true;\n\n\t\treturn this.shapecast(\n\t\t\t{\n\t\t\t\tintersectsBounds: box => _obb.intersectsBox( box ),\n\t\t\t\tintersectsTriangle: tri => _obb.intersectsTriangle( tri )\n\t\t\t}\n\t\t);\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn this.shapecast(\n\t\t\t{\n\t\t\t\tintersectsBounds: box => sphere.intersectsBox( box ),\n\t\t\t\tintersectsTriangle: tri => tri.intersectsSphere( sphere )\n\t\t\t}\n\t\t);\n\n\t}\n\n\tclosestPointToGeometry( otherGeometry, geometryToBvh, target1 = { }, target2 = { }, minThreshold = 0, maxThreshold = Infinity ) {\n\n\t\tconst closestPointToGeometryFunc = this.indirect ? closestPointToGeometry_indirect : closestPointToGeometry;\n\t\treturn closestPointToGeometryFunc(\n\t\t\tthis,\n\t\t\totherGeometry,\n\t\t\tgeometryToBvh,\n\t\t\ttarget1,\n\t\t\ttarget2,\n\t\t\tminThreshold,\n\t\t\tmaxThreshold,\n\t\t);\n\n\t}\n\n\tclosestPointToPoint( point, target = { }, minThreshold = 0, maxThreshold = Infinity ) {\n\n\t\treturn closestPointToPoint(\n\t\t\tthis,\n\t\t\tpoint,\n\t\t\ttarget,\n\t\t\tminThreshold,\n\t\t\tmaxThreshold,\n\t\t);\n\n\t}\n\n}\n","import { Mesh, Points, Line, LineLoop, LineSegments, Sphere, BatchedMesh, REVISION } from 'three';\nimport { MeshBVH } from '../core/MeshBVH.js';\n\nconst IS_REVISION_166 = parseInt( REVISION ) >= 166;\n\n// TODO: how can we expand these raycast functions?\nconst _raycastFunctions = {\n\t'Mesh': Mesh.prototype.raycast,\n\t'Line': Line.prototype.raycast,\n\t'LineSegments': LineSegments.prototype.raycast,\n\t'LineLoop': LineLoop.prototype.raycast,\n\t'Points': Points.prototype.raycast,\n\t'BatchedMesh': BatchedMesh.prototype.raycast,\n};\n\nconst _mesh = /* @__PURE__ */ new Mesh();\nconst _batchIntersects = [];\n\nexport function acceleratedRaycast( raycaster, intersects ) {\n\n\tif ( this.isBatchedMesh ) {\n\n\t\tacceleratedBatchedMeshRaycast.call( this, raycaster, intersects );\n\n\t} else {\n\n\t\tconst { geometry } = this;\n\t\tif ( geometry.boundsTree ) {\n\n\t\t\tgeometry.boundsTree.raycastObject3D( this, raycaster, intersects );\n\n\t\t} else {\n\n\t\t\tlet raycastFunction;\n\t\t\tif ( this instanceof Mesh ) {\n\n\t\t\t\traycastFunction = _raycastFunctions.Mesh;\n\n\t\t\t} else if ( this instanceof LineSegments ) {\n\n\t\t\t\traycastFunction = _raycastFunctions.LineSegments;\n\n\t\t\t} else if ( this instanceof LineLoop ) {\n\n\t\t\t\traycastFunction = _raycastFunctions.LineLoop;\n\n\t\t\t} else if ( this instanceof Line ) {\n\n\t\t\t\traycastFunction = _raycastFunctions.Line;\n\n\t\t\t} else if ( this instanceof Points ) {\n\n\t\t\t\traycastFunction = _raycastFunctions.Points;\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'BVH: Fallback raycast function not found.' );\n\n\t\t\t}\n\n\t\t\traycastFunction.call( this, raycaster, intersects );\n\n\t\t}\n\n\t}\n\n}\n\nfunction acceleratedBatchedMeshRaycast( raycaster, intersects ) {\n\n\tif ( this.boundsTrees ) {\n\n\t\t// TODO: remove use of geometry info, instance info when r170 is minimum version\n\t\tconst boundsTrees = this.boundsTrees;\n\t\tconst drawInfo = this._drawInfo || this._instanceInfo;\n\t\tconst drawRanges = this._drawRanges || this._geometryInfo;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\t_mesh.material = this.material;\n\t\t_mesh.geometry = this.geometry;\n\n\t\tconst oldBoundsTree = _mesh.geometry.boundsTree;\n\t\tconst oldDrawRange = _mesh.geometry.drawRange;\n\n\t\tif ( _mesh.geometry.boundingSphere === null ) {\n\n\t\t\t_mesh.geometry.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\t// TODO: provide new method to get instances count instead of 'drawInfo.length'\n\t\tfor ( let i = 0, l = drawInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( ! this.getVisibleAt( i ) ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// TODO: use getGeometryIndex\n\t\t\tconst geometryId = drawInfo[ i ].geometryIndex;\n\n\t\t\t_mesh.geometry.boundsTree = boundsTrees[ geometryId ];\n\n\t\t\tthis.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );\n\n\t\t\tif ( ! _mesh.geometry.boundsTree ) {\n\n\t\t\t\tthis.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );\n\t\t\t\tthis.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );\n\n\t\t\t\tconst drawRange = drawRanges[ geometryId ];\n\t\t\t\t_mesh.geometry.setDrawRange( drawRange.start, drawRange.count );\n\n\t\t\t}\n\n\t\t\t_mesh.raycast( raycaster, _batchIntersects );\n\n\t\t\tfor ( let j = 0, l = _batchIntersects.length; j < l; j ++ ) {\n\n\t\t\t\tconst intersect = _batchIntersects[ j ];\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersect.batchId = i;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_batchIntersects.length = 0;\n\n\t\t}\n\n\t\t_mesh.geometry.boundsTree = oldBoundsTree;\n\t\t_mesh.geometry.drawRange = oldDrawRange;\n\t\t_mesh.material = null;\n\t\t_mesh.geometry = null;\n\n\t} else {\n\n\t\t_raycastFunctions.BatchedMesh.call( this, raycaster, intersects );\n\n\t}\n\n}\n\nexport function computeBoundsTree( options = {} ) {\n\n\tconst { type = MeshBVH } = options;\n\tthis.boundsTree = new type( this, options );\n\treturn this.boundsTree;\n\n}\n\nexport function disposeBoundsTree() {\n\n\tthis.boundsTree = null;\n\n}\n\nexport function computeBatchedBoundsTree( index = - 1, options = {} ) {\n\n\tif ( ! IS_REVISION_166 ) {\n\n\t\tthrow new Error( 'BatchedMesh: Three r166+ is required to compute bounds trees.' );\n\n\t}\n\n\toptions = {\n\t\t...options,\n\t\trange: null\n\t};\n\n\tconst drawRanges = this._drawRanges || this._geometryInfo;\n\tconst geometryCount = this._geometryCount;\n\tif ( ! this.boundsTrees ) {\n\n\t\tthis.boundsTrees = new Array( geometryCount ).fill( null );\n\n\t}\n\n\tconst boundsTrees = this.boundsTrees;\n\twhile ( boundsTrees.length < geometryCount ) {\n\n\t\tboundsTrees.push( null );\n\n\t}\n\n\tif ( index < 0 ) {\n\n\t\tfor ( let i = 0; i < geometryCount; i ++ ) {\n\n\t\t\toptions.range = drawRanges[ i ];\n\t\t\tboundsTrees[ i ] = new MeshBVH( this.geometry, options );\n\n\t\t}\n\n\t\treturn boundsTrees;\n\n\t} else {\n\n\t\tif ( index < drawRanges.length ) {\n\n\t\t\toptions.range = drawRanges[ index ];\n\t\t\tboundsTrees[ index ] = new MeshBVH( this.geometry, options );\n\n\t\t}\n\n\t\treturn boundsTrees[ index ] || null;\n\n\t}\n\n}\n\nexport function disposeBatchedBoundsTree( index = - 1 ) {\n\n\tif ( index < 0 ) {\n\n\t\tthis.boundsTrees.fill( null );\n\n\t} else {\n\n\t\tif ( index < this.boundsTrees.length ) {\n\n\t\t\tthis.boundsTrees[ index ] = null;\n\n\t\t}\n\n\t}\n\n}\n","import * as THREE from \"three\";\r\nimport { ObjectClass, CurrentLod } from \"../../model/model-types\";\r\nimport { CRC, MiscHelper } from \"../../utils\";\r\nimport { Meshes, RepresentationClass } from \"../../../../Schema\";\r\nimport { LodClass, AnyTileData, AnyTileBasicData } from \"./types\";\r\nimport {\r\n  VirtualMemoryController,\r\n  VirtualTemplateController,\r\n} from \"../virtual-controllers\";\r\n\r\nexport abstract class VirtualMeshManager {\r\n  protected readonly meshes: Meshes;\r\n\r\n  private readonly _templateController = new VirtualTemplateController();\r\n  private readonly _meshIds = new Set<number>();\r\n  private readonly _idGenerator = new CRC();\r\n  private readonly _modelCode: number;\r\n\r\n  constructor(modelId: string, meshes: Meshes) {\r\n    this.meshes = meshes;\r\n    this._modelCode = this.getModelCode(modelId);\r\n  }\r\n\r\n  abstract setupTemplates(): void;\r\n\r\n  abstract fetchMeshes(meshId: number, evenVoid: boolean): AnyTileData;\r\n\r\n  abstract lineRaycast(\r\n    id: number,\r\n    ray: THREE.Ray,\r\n    frustum: THREE.Frustum,\r\n  ): any[];\r\n\r\n  abstract pointRaycast(\r\n    id: number,\r\n    ray: THREE.Ray,\r\n    frustum: THREE.Frustum,\r\n  ): any[];\r\n\r\n  abstract raycast(id: number, ray: THREE.Ray, frustum: THREE.Frustum): any[];\r\n\r\n  abstract faceRaycast(\r\n    id: number,\r\n    ray: THREE.Ray,\r\n    frustum: THREE.Frustum,\r\n  ): any[];\r\n\r\n  abstract getRepresentation(): RepresentationClass;\r\n\r\n  abstract getObjectClass(): ObjectClass;\r\n\r\n  abstract getLodClass(): LodClass;\r\n\r\n  dispose() {\r\n    VirtualMemoryController.delete(this._meshIds);\r\n  }\r\n\r\n  protected useMesh(id: number, mesh: AnyTileBasicData, lod: CurrentLod) {\r\n    const code = this.meshCode(id, lod);\r\n    VirtualMemoryController.lockIn(mesh);\r\n    this._templateController.add(code, mesh);\r\n  }\r\n\r\n  protected getMesh(id: number, lod: CurrentLod) {\r\n    const code = this.meshCode(id, lod);\r\n    const geometry = VirtualMemoryController.get(code);\r\n    return geometry ?? this._templateController.get(code);\r\n  }\r\n\r\n  protected saveMesh(id: number, mesh: AnyTileData, lod: CurrentLod) {\r\n    MiscHelper.forEach(mesh, VirtualMemoryController.updateMeshMemory);\r\n    const code = this.meshCode(id, lod);\r\n    VirtualMemoryController.add(code, mesh);\r\n    this._meshIds.add(code);\r\n  }\r\n\r\n  private meshCode(index: number, lod: CurrentLod): number {\r\n    const code = this._modelCode;\r\n    const repr = this.getRepresentation();\r\n    const data = [code, repr, lod, index];\r\n    return this._idGenerator.generate(data);\r\n  }\r\n\r\n  private getModelCode(modelId: string) {\r\n    return this._idGenerator.generate([modelId]);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { ObjectClass, CurrentLod, DataBuffer } from \"../../model/model-types\";\r\nimport { MultiBufferData } from \"../../utils\";\r\n\r\nexport const normalizationValue = 2 ** 15 - 1;\r\n\r\nexport const enum LodClass {\r\n  NONE = 0,\r\n  AABB = 1,\r\n  CUSTOM = 2,\r\n}\r\n\r\nexport interface TileBasicData {\r\n  objectClass: ObjectClass;\r\n  indexCount?: number;\r\n  positionCount?: number;\r\n  normalCount?: number;\r\n  lodThickness?: number;\r\n  lod?: CurrentLod;\r\n}\r\n\r\nexport type AnyTileBasicData = TileBasicData | TileBasicData[];\r\n\r\nexport interface TileData extends TileBasicData {\r\n  box: THREE.Box3;\r\n  indexLocation: number[];\r\n  vertexLocation: number[];\r\n  sampleLocation: Map<number, number>;\r\n  geometriesLocation: number[];\r\n  size: number;\r\n  notVirtual: boolean;\r\n  usedMemory?: number;\r\n  materialId?: number;\r\n  location?: THREE.Vector3;\r\n  ids?: DataBuffer;\r\n  indexBuffer?: DataBuffer;\r\n  positionBuffer?: DataBuffer;\r\n  faceIdBuffer?: DataBuffer;\r\n  normalBuffer?: DataBuffer;\r\n  visibilities?: MultiBufferData<boolean>;\r\n  highlights?: MultiBufferData<number>;\r\n}\r\n\r\nexport type AnyTileData = TileData | TileData[];\r\n\r\nexport type VirtualTemplates = Map<number, AnyTileBasicData>;\r\n","import * as THREE from \"three\";\r\nimport { normalizationValue } from \"../types\";\r\nimport {\r\n  ShellProfile,\r\n  Shell,\r\n  FloatVector,\r\n  ShellHole,\r\n  Meshes,\r\n  ShellType,\r\n  BigShellProfile,\r\n  BigShellHole,\r\n} from \"../../../../../Schema\";\r\n\r\nexport class ShellUtils {\r\n  private static _faceThreshold = Math.cos(Math.PI / 8);\r\n  private static _shell = new Shell();\r\n  private static _normalBuffer = new Int16Array();\r\n  private static _tempNormal = new THREE.Vector3();\r\n  private static _tempPoint = new FloatVector();\r\n  private static _shellProfile = new ShellProfile();\r\n  private static _bigShellProfile = new BigShellProfile();\r\n  private static _shellHole = new ShellHole();\r\n  private static _bigShellHole = new BigShellHole();\r\n  private static _pointsByProfile = new Map<number, number[]>();\r\n  private static _v1 = new THREE.Vector3();\r\n  private static _v2 = new THREE.Vector3();\r\n  private static _v3 = new THREE.Vector3();\r\n\r\n  static getProfile(\r\n    shell: Shell,\r\n    id: number,\r\n    input?: ShellProfile | BigShellProfile,\r\n  ) {\r\n    const isBigShell = shell.type() === ShellType.BIG;\r\n    if (isBigShell) {\r\n      return shell.bigProfiles(id, input as BigShellProfile)!;\r\n    }\r\n    return shell.profiles(id, input as ShellProfile)!;\r\n  }\r\n\r\n  static getPoints(shell: Shell) {\r\n    const points = new Float32Array(shell.pointsLength() * 3);\r\n    for (let i = 0; i < shell.pointsLength(); i++) {\r\n      shell.points(i, this._tempPoint);\r\n      points[i * 3] = this._tempPoint.x();\r\n      points[i * 3 + 1] = this._tempPoint.y();\r\n      points[i * 3 + 2] = this._tempPoint.z();\r\n    }\r\n    return points;\r\n  }\r\n\r\n  static getProfileIndices(shell: Shell, profileId: number) {\r\n    const isBigShell = shell.type() === ShellType.BIG;\r\n    const indices = {\r\n      outer: [] as number[],\r\n      inners: [] as number[][],\r\n    };\r\n\r\n    const length = isBigShell ? shell.bigHolesLength() : shell.holesLength();\r\n    const holeId = isBigShell ? \"bigHoles\" : \"holes\";\r\n\r\n    const profile = ShellUtils.getProfile(shell, profileId);\r\n    indices.outer = Array.from(profile.indicesArray()!);\r\n\r\n    for (let i = 0; i < length; i++) {\r\n      const hole = shell[holeId](i)!;\r\n      if (hole.profileId() === profileId) {\r\n        const currentIndices = Array.from(hole.indicesArray()!);\r\n        indices.inners.push(currentIndices);\r\n      }\r\n    }\r\n\r\n    return indices;\r\n  }\r\n\r\n  static getHole(shell: Shell, id: number, input?: ShellHole | BigShellHole) {\r\n    const isBigShell = shell.type() === ShellType.BIG;\r\n    if (isBigShell) {\r\n      return shell.bigHoles(id, input as BigShellHole)!;\r\n    }\r\n    return shell.holes(id, input as ShellHole)!;\r\n  }\r\n\r\n  static getProfilesLength(shell: Shell) {\r\n    if (shell.type() === ShellType.BIG) {\r\n      return shell.bigProfilesLength();\r\n    }\r\n    return shell.profilesLength();\r\n  }\r\n\r\n  static getHolesLength(shell: Shell) {\r\n    if (shell.type() === ShellType.BIG) {\r\n      return shell.bigHolesLength();\r\n    }\r\n    return shell.holesLength();\r\n  }\r\n\r\n  static getShell(meshes: Meshes, id: number) {\r\n    return meshes.shells(id, this._shell) as Shell;\r\n  }\r\n\r\n  static point(shell: Shell, id: number, result: THREE.Vector3) {\r\n    if (shell instanceof Shell) {\r\n      shell.points(id, this._tempPoint);\r\n    }\r\n    const x = this._tempPoint.x();\r\n    const y = this._tempPoint.y();\r\n    const z = this._tempPoint.z();\r\n    result.set(x, y, z);\r\n  }\r\n\r\n  static getNormalsOfShellProfile(shell: Shell, result: THREE.Vector3[]) {\r\n    const count = ShellUtils.getProfilesLength(shell);\r\n    for (let id = 0; id < count; id++) {\r\n      const profile = ShellUtils.getProfile(shell, id);\r\n      const normals = this.fetchNormalsOfProfile(shell, profile);\r\n      result.push(normals);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  static computeNormalsAvg(\r\n    indices: Uint16Array | Uint32Array,\r\n    faceId: number,\r\n    faceNormals: THREE.Vector3[],\r\n    pointsFaces: Map<number, number[]>,\r\n  ) {\r\n    this.setupNormalBuffer(indices);\r\n    const profileNormal = faceNormals[faceId];\r\n    for (let id = 0; id < indices.length; id++) {\r\n      const current = indices[id];\r\n      const pointsByProfile = pointsFaces.get(current);\r\n      this.aggregateNormals(pointsByProfile, faceNormals, profileNormal);\r\n      this.computeAvgNormal(id);\r\n    }\r\n    return this._normalBuffer;\r\n  }\r\n\r\n  static getBuffer(shell: Shell) {\r\n    const data = shell.bb!;\r\n    const distance = 8;\r\n    const shellOffset = data.__offset(shell.bb_pos, distance);\r\n    const length = shell.pointsLength() * 3;\r\n    const offset = data.__vector(shell.bb_pos + shellOffset);\r\n    const rawBytes = data.bytes();\r\n    const rawBuffer = rawBytes.buffer;\r\n    return new Float32Array(rawBuffer, offset, length);\r\n  }\r\n\r\n  static getPointsShell(shell: Shell) {\r\n    this._pointsByProfile.clear();\r\n    this.fetchAllPointsByProfile(shell);\r\n    ShellUtils.fetchAllPointsByHole(shell);\r\n    return this._pointsByProfile;\r\n  }\r\n\r\n  private static addNormals(\r\n    pointsByProfile: number[],\r\n    faceNormals: THREE.Vector3[],\r\n    profileNormal: THREE.Vector3,\r\n  ) {\r\n    for (const id of pointsByProfile) {\r\n      const normal = faceNormals[id];\r\n      const dot = profileNormal.dot(normal);\r\n      const isValid = dot > this._faceThreshold;\r\n      if (!isValid) continue;\r\n      this._tempNormal.add(normal);\r\n    }\r\n  }\r\n\r\n  private static setupNormalBuffer(indices: Uint16Array | Uint32Array) {\r\n    const neededSize = indices.length * 3;\r\n    const currentSize = this._normalBuffer.length;\r\n    const insufficientSize = currentSize < neededSize;\r\n    if (insufficientSize) {\r\n      this._normalBuffer = new Int16Array(neededSize);\r\n    }\r\n  }\r\n\r\n  private static fetchNormalsOfProfile(\r\n    shell: Shell,\r\n    profile: ShellProfile | BigShellProfile,\r\n  ) {\r\n    const length = profile.indicesLength();\r\n    const tooSmall = this.isTooSmall(shell, length);\r\n    if (tooSmall) {\r\n      return new THREE.Vector3(1, 0, 0);\r\n    }\r\n    return this.computeProfileNormal(length, profile, shell);\r\n  }\r\n\r\n  private static fetchAllPointsByHole(shell: Shell) {\r\n    const holesCount = ShellUtils.getHolesLength(shell);\r\n    const hole = this.getTempHole(shell);\r\n    for (let holeId = 0; holeId < holesCount; holeId++) {\r\n      ShellUtils.getHole(shell, holeId, hole);\r\n      const id = hole.profileId();\r\n      const indicesCount = hole.indicesLength();\r\n      for (let i = 0; i < indicesCount; i++) {\r\n        const index = hole.indices(i)!;\r\n        ShellUtils.savePointByProfile(index, id);\r\n      }\r\n    }\r\n  }\r\n\r\n  private static computeProfileNormal(\r\n    length: number,\r\n    profile: ShellProfile | BigShellProfile,\r\n    shell: Shell,\r\n  ) {\r\n    this._v3.set(0, 0, 0);\r\n    for (let id = 0; id < length; id++) {\r\n      this.fetchPointsForNormal(id, length, profile, shell);\r\n      this.computeProfilePointNormal();\r\n    }\r\n    const result = this._v3.clone();\r\n    result.normalize();\r\n    return result;\r\n  }\r\n\r\n  private static computeProfilePointNormal() {\r\n    const dx = this._v1.x - this._v2.x;\r\n    const dy = this._v1.y - this._v2.y;\r\n    const dz = this._v1.z - this._v2.z;\r\n    const sumX = this._v1.x + this._v2.x;\r\n    const sumY = this._v1.y + this._v2.y;\r\n    const sumZ = this._v1.z + this._v2.z;\r\n    this._v3.x += dy * sumZ;\r\n    this._v3.y += dz * sumX;\r\n    this._v3.z += dx * sumY;\r\n  }\r\n\r\n  private static aggregateNormals(\r\n    pointsByProfile: number[] | undefined,\r\n    faceNormals: THREE.Vector3[],\r\n    profileNormal: THREE.Vector3,\r\n  ) {\r\n    this._tempNormal.set(0, 0, 0);\r\n\r\n    const isZero = !pointsByProfile || !pointsByProfile.length;\r\n    if (isZero) {\r\n      this._tempNormal.set(1, 0, 0);\r\n      return;\r\n    }\r\n\r\n    const isJustOne = pointsByProfile.length === 1;\r\n    if (isJustOne) {\r\n      const first = pointsByProfile[0];\r\n      this._tempNormal = faceNormals[first].clone();\r\n      return;\r\n    }\r\n\r\n    ShellUtils.addNormals(pointsByProfile, faceNormals, profileNormal);\r\n  }\r\n\r\n  private static fetchPointsForNormal(\r\n    id: number,\r\n    length: number,\r\n    profile: ShellProfile | BigShellProfile,\r\n    shell: Shell,\r\n  ) {\r\n    const next = id + 1;\r\n    const id2 = next % length;\r\n\r\n    const profile1 = profile.indices(id)!;\r\n    const profile2 = profile.indices(id2)!;\r\n    this.point(shell, profile1, this._v1);\r\n    this.point(shell, profile2, this._v2);\r\n  }\r\n\r\n  private static savePointByProfile(index: number, id: number) {\r\n    if (!this._pointsByProfile.has(index)) {\r\n      this._pointsByProfile.set(index, []);\r\n    }\r\n    this._pointsByProfile.get(index)!.push(id);\r\n  }\r\n\r\n  private static isTooSmall(shell: Shell, length: number) {\r\n    const notEnoughPoints = shell.pointsLength() <= 2;\r\n    const notEnoughIndices = length <= 2;\r\n    return notEnoughPoints || notEnoughIndices;\r\n  }\r\n\r\n  private static fetchAllPointsByProfile(shell: Shell) {\r\n    const count = this.getProfilesLength(shell);\r\n    const profile = this.getTempProfile(shell);\r\n    for (let id = 0; id < count; id++) {\r\n      ShellUtils.getProfile(shell, id, profile);\r\n      const indicesCount = profile.indicesLength();\r\n      for (let i = 0; i < indicesCount; i++) {\r\n        const index = profile.indices(i)!;\r\n        ShellUtils.savePointByProfile(index, id);\r\n      }\r\n    }\r\n  }\r\n\r\n  private static computeAvgNormal(id: number) {\r\n    this._tempNormal.normalize();\r\n    this._tempNormal.multiplyScalar(normalizationValue);\r\n    this._tempNormal.toArray(this._normalBuffer, id * 3);\r\n  }\r\n\r\n  private static getTempProfile(shell: Shell) {\r\n    if (shell.type() === ShellType.BIG) {\r\n      return this._bigShellProfile;\r\n    }\r\n    return this._shellProfile;\r\n  }\r\n\r\n  private static getTempHole(shell: Shell) {\r\n    if (shell.type() === ShellType.BIG) {\r\n      return this._bigShellHole;\r\n    }\r\n    return this._shellHole;\r\n  }\r\n}\r\n","import { AnyTileBasicData, TileBasicData } from \"../types\";\r\nimport { limitOf2Bytes, ObjectClass } from \"../../../model/model-types\";\r\n// @ts-ignore\r\nimport { earcut } from \"../../../utils/geometry/earcut\";\r\nimport {\r\n  BigShellHole,\r\n  BigShellProfile,\r\n  Shell,\r\n  ShellHole,\r\n  ShellProfile,\r\n  ShellType,\r\n} from \"../../../../../Schema\";\r\nimport { ShellUtils } from \"./shell-utils\";\r\n\r\nexport class ShellTemplateConstructor {\r\n  private _shellHole = new ShellHole();\r\n  private _bigShellHole = new BigShellHole();\r\n  holePoints = 0;\r\n  profilePoints = 0;\r\n  triangleAmount = 0;\r\n  indexCount = 0;\r\n  meshes: AnyTileBasicData = [];\r\n  private _shellProfile = new ShellProfile();\r\n  private _bigShellProfile = new BigShellProfile();\r\n\r\n  newMeshTemplate(shell: Shell) {\r\n    const isEmpty = this.getIsEmpty(shell);\r\n    if (isEmpty) {\r\n      return { objectClass: ObjectClass.SHELL };\r\n    }\r\n    this.reset(true);\r\n    this.processShell(shell);\r\n    return this.getResult();\r\n  }\r\n\r\n  private manageDataLeft() {\r\n    const isDataLeft = this.getIsDataLeft();\r\n    if (isDataLeft) {\r\n      this.setMesh();\r\n    }\r\n  }\r\n\r\n  private getIsEmpty(shell: Shell) {\r\n    const length = ShellUtils.getProfilesLength(shell);\r\n    return length === 0;\r\n  }\r\n\r\n  private processShellHoles(shell: Shell, id: number) {\r\n    let shellHolesExist = false;\r\n    const count = ShellUtils.getHolesLength(shell);\r\n    const hole = this.getTempHole(shell);\r\n    for (let i = 0; i < count; i++) {\r\n      ShellUtils.getHole(shell, i, hole);\r\n      const profileId = hole.profileId();\r\n      if (profileId !== id) continue;\r\n      this.updateBuffers(shell, shellHolesExist);\r\n      shellHolesExist = true;\r\n    }\r\n\r\n    this.manageFoundHoles(shell, shellHolesExist);\r\n  }\r\n\r\n  private newMesh() {\r\n    return {\r\n      objectClass: ObjectClass.SHELL,\r\n      indexCount: this.triangleAmount * 3,\r\n      positionCount: (this.holePoints + this.profilePoints) * 3,\r\n      normalCount: (this.holePoints + this.profilePoints) * 3,\r\n    } as TileBasicData;\r\n  }\r\n\r\n  private reset(evenMeshes: boolean) {\r\n    this.holePoints = 0;\r\n    this.profilePoints = 0;\r\n    this.triangleAmount = 0;\r\n    if (evenMeshes) {\r\n      this.meshes = undefined as any;\r\n    }\r\n  }\r\n\r\n  private getIsDataLeft() {\r\n    const areTriangles = this.triangleAmount > 0;\r\n    const areHoles = this.holePoints > 0;\r\n    const areProfiles = this.profilePoints > 0;\r\n    return areTriangles || areHoles || areProfiles;\r\n  }\r\n\r\n  private processShell(shell: Shell) {\r\n    const count = ShellUtils.getProfilesLength(shell);\r\n    const profile = this.getTempProfile(shell);\r\n    for (let id = 0; id < count; id++) {\r\n      ShellUtils.getProfile(shell, id, profile);\r\n      this.indexCount = profile.indicesLength();\r\n      this.profilePoints += this.indexCount;\r\n      this.processShellHoles(shell, id);\r\n      this.manageMemory();\r\n    }\r\n    this.manageDataLeft();\r\n  }\r\n\r\n  private manageFoundHoles(shell: Shell, shellHolesExist: boolean) {\r\n    const profile = this.getTempProfile(shell);\r\n    const indicesAmount = profile.indicesLength();\r\n\r\n    if (shellHolesExist) {\r\n      this.triangleAmount += indicesAmount;\r\n      return;\r\n    }\r\n\r\n    if (indicesAmount > 2) {\r\n      this.triangleAmount += indicesAmount - 2;\r\n    }\r\n  }\r\n\r\n  private getResult() {\r\n    const meshes = this.meshes as TileBasicData;\r\n    this.meshes = undefined as any;\r\n    return meshes;\r\n  }\r\n\r\n  private manageMemory() {\r\n    const memory = this.holePoints + this.profilePoints + this.indexCount;\r\n    const memoryOverflow = memory > limitOf2Bytes;\r\n    if (memoryOverflow) {\r\n      this.setMesh();\r\n    }\r\n  }\r\n\r\n  private updateBuffers(shell: Shell, shellHolesExist: boolean) {\r\n    const hole = this.getTempHole(shell);\r\n    this.holePoints += hole.indicesLength();\r\n    this.triangleAmount += hole.indicesLength();\r\n    if (shellHolesExist) {\r\n      this.triangleAmount += 2;\r\n    }\r\n  }\r\n\r\n  private setMesh() {\r\n    const mesh = this.newMesh();\r\n    if (!this.meshes) {\r\n      this.meshes = mesh;\r\n    } else if (Array.isArray(this.meshes)) {\r\n      this.meshes.push(mesh);\r\n    } else {\r\n      this.meshes = [this.meshes, mesh];\r\n    }\r\n    this.reset(false);\r\n  }\r\n\r\n  private getTempProfile(shell: Shell) {\r\n    if (shell.type() === ShellType.BIG) {\r\n      return this._bigShellProfile;\r\n    }\r\n    return this._shellProfile;\r\n  }\r\n\r\n  private getTempHole(shell: Shell) {\r\n    if (shell.type() === ShellType.BIG) {\r\n      return this._bigShellHole;\r\n    }\r\n    return this._shellHole;\r\n  }\r\n}\r\n","export enum PolygonSize {\r\n  four = 4,\r\n  three = 3,\r\n}\r\n\r\nexport interface ShellHoleData {\r\n  indices: number[];\r\n  points: number[];\r\n  normals?: number[];\r\n}\r\n\r\nexport interface DataSizes {\r\n  indices: number;\r\n  vertices: number;\r\n  verticesAmount: number;\r\n  normals: number;\r\n  normalsAmount: number;\r\n}\r\n","/* eslint-disable no-multi-assign */\r\n/* eslint-disable no-use-before-define */\r\n/* eslint-disable no-nested-ternary */\r\n/* eslint-disable no-bitwise */\r\n\r\n// src: https://github.com/mapbox/earcut/\r\n\r\nexport function earcut(\r\n  data: any,\r\n  holeIndices: any,\r\n  dim: any,\r\n  a: any,\r\n  b: any,\r\n  createGeometry: any,\r\n) {\r\n  const hasHoles = holeIndices && holeIndices.length;\r\n  const outerLen = hasHoles ? holeIndices[0] * dim : data.length;\r\n  let outerNode = linkedList(data, 0, outerLen, dim, true, a, b);\r\n\r\n  if (!outerNode || outerNode.next === outerNode.prev) return;\r\n\r\n  let minX;\r\n  let minY;\r\n  let invSize;\r\n\r\n  if (hasHoles)\r\n    outerNode = eliminateHoles(data, holeIndices, outerNode, dim, a, b);\r\n\r\n  // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\r\n  if (data.length > 80 * dim) {\r\n    let maxX = data[a];\r\n    let maxY = data[b];\r\n    minX = maxX;\r\n    minY = maxY;\r\n\r\n    for (let i = dim; i < outerLen; i += dim) {\r\n      const x = data[i + a];\r\n      const y = data[i + b];\r\n      if (x < minX) minX = x;\r\n      if (y < minY) minY = y;\r\n      if (x > maxX) maxX = x;\r\n      if (y > maxY) maxY = y;\r\n    }\r\n\r\n    // minX, minY and invSize are later used to transform coords into integers for z-order calculation\r\n    invSize = Math.max(maxX - minX, maxY - minY);\r\n    invSize = invSize !== 0 ? 1 / invSize : 0;\r\n  }\r\n\r\n  earcutLinked(outerNode, createGeometry, dim, minX, minY, invSize);\r\n}\r\n\r\n// create a circular doubly linked list from polygon points in the specified winding order\r\nfunction linkedList(\r\n  data: any,\r\n  start: any,\r\n  end: any,\r\n  dim: any,\r\n  clockwise: any,\r\n  a: any,\r\n  b: any,\r\n) {\r\n  let finish;\r\n  let current;\r\n  let counter;\r\n\r\n  if (clockwise === signedArea(data, start, end, dim, a, b) > 0) {\r\n    for (counter = start; counter < end; counter += dim)\r\n      finish = insertNode(\r\n        counter,\r\n        data[counter + a],\r\n        data[counter + b],\r\n        finish,\r\n      );\r\n  } else {\r\n    for (counter = end - dim; counter >= start; counter -= dim)\r\n      finish = insertNode(\r\n        counter,\r\n        data[counter + a],\r\n        data[counter + b],\r\n        finish,\r\n      );\r\n  }\r\n\r\n  if (finish && equals(finish, finish.next)) {\r\n    current = finish.next;\r\n    removeNode(finish);\r\n    finish = current;\r\n  }\r\n\r\n  return finish;\r\n}\r\n\r\n// eliminate colinear or duplicate points\r\nfunction filterPoints(start: any, end?: any) {\r\n  if (!start) return start;\r\n  if (!end) end = start;\r\n\r\n  let p = start;\r\n  let again;\r\n  let past;\r\n  do {\r\n    again = false;\r\n\r\n    if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\r\n      past = p.prev;\r\n      removeNode(p);\r\n      p = end = past;\r\n      if (p === p.next) break;\r\n      again = true;\r\n    } else {\r\n      p = p.next;\r\n    }\r\n  } while (again || p !== end);\r\n\r\n  return end;\r\n}\r\n\r\n// main ear slicing loop which triangulates a polygon (given as a linked list)\r\nfunction earcutLinked(\r\n  ear: any,\r\n  createGeometry: any,\r\n  dim: any,\r\n  minX: any,\r\n  minY: any,\r\n  invSize: any,\r\n  pass?: any,\r\n) {\r\n  // interlink polygon nodes in z-order\r\n  if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\r\n\r\n  let stop = ear;\r\n\r\n  // iterate through ears, slicing them one by one\r\n  while (ear.prev !== ear.next) {\r\n    const prev = ear.prev;\r\n    const next = ear.next;\r\n\r\n    if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\r\n      // cut off the triangle\r\n      createGeometry(prev.i / dim, ear.i / dim, next.i / dim);\r\n\r\n      removeNode(ear);\r\n\r\n      // skipping the next vertex leads to less sliver triangles\r\n      ear = next.next;\r\n      stop = next.next;\r\n\r\n      continue;\r\n    }\r\n\r\n    ear = next;\r\n\r\n    // if we looped through the whole remaining polygon and can't find any more ears\r\n    if (ear === stop) {\r\n      // try filtering points and slicing again\r\n      if (!pass) {\r\n        earcutLinked(\r\n          filterPoints(ear),\r\n          createGeometry,\r\n          dim,\r\n          minX,\r\n          minY,\r\n          invSize,\r\n          1,\r\n        );\r\n\r\n        // if this didn't work, try curing all small self-intersections locally\r\n      } else if (pass === 1) {\r\n        ear = cureLocalIntersections(filterPoints(ear), createGeometry, dim);\r\n        earcutLinked(ear, createGeometry, dim, minX, minY, invSize, 2);\r\n\r\n        // as a last resort, try splitting the remaining polygon into two\r\n      } else if (pass === 2) {\r\n        splitEarcut(ear, createGeometry, dim, minX, minY, invSize);\r\n      }\r\n\r\n      break;\r\n    }\r\n  }\r\n}\r\n\r\n// check whether a polygon node forms a valid ear with adjacent nodes\r\nfunction isEar(ear: any) {\r\n  const a = ear.prev;\r\n  const b = ear;\r\n  const c = ear.next;\r\n\r\n  // reflex, can't be an ear\r\n  if (area(a, b, c) >= 0) return false;\r\n\r\n  // now make sure we don't have other points inside the potential ear\r\n  let p = ear.next.next;\r\n\r\n  while (p !== ear.prev) {\r\n    if (\r\n      pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\r\n      area(p.prev, p, p.next) >= 0\r\n    )\r\n      return false;\r\n    p = p.next;\r\n  }\r\n\r\n  return true;\r\n}\r\n\r\nfunction isEarHashed(ear: any, minX: any, minY: any, invSize: any) {\r\n  const a = ear.prev;\r\n  const b = ear;\r\n  const c = ear.next;\r\n\r\n  // reflex, can't be an ear\r\n  if (area(a, b, c) >= 0) return false;\r\n\r\n  // triangle bbox\r\n  const x0 = Math.min(a.x, b.x, c.x);\r\n  const y0 = Math.min(a.y, b.y, c.y);\r\n  const x1 = Math.max(a.x, b.x, c.x);\r\n  const y1 = Math.max(a.y, b.y, c.y);\r\n\r\n  // z-order range for the current triangle bbox\r\n  const minZ = zOrder(x0, y0, minX, minY, invSize);\r\n  const maxZ = zOrder(x1, y1, minX, minY, invSize);\r\n\r\n  let p = ear.prevZ;\r\n  let n = ear.nextZ;\r\n\r\n  // look for points inside the triangle in both directions\r\n  while (p && p.z >= minZ && n && n.z <= maxZ) {\r\n    if (\r\n      p !== ear.prev &&\r\n      p !== ear.next &&\r\n      pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\r\n      area(p.prev, p, p.next) >= 0\r\n    )\r\n      return false;\r\n    p = p.prevZ;\r\n\r\n    if (\r\n      n !== ear.prev &&\r\n      n !== ear.next &&\r\n      pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\r\n      area(n.prev, n, n.next) >= 0\r\n    )\r\n      return false;\r\n    n = n.nextZ;\r\n  }\r\n\r\n  // look for remaining points in decreasing z-order\r\n  while (p && p.z >= minZ) {\r\n    if (\r\n      p !== ear.prev &&\r\n      p !== ear.next &&\r\n      pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\r\n      area(p.prev, p, p.next) >= 0\r\n    )\r\n      return false;\r\n    p = p.prevZ;\r\n  }\r\n\r\n  // look for remaining points in increasing z-order\r\n  while (n && n.z <= maxZ) {\r\n    if (\r\n      n !== ear.prev &&\r\n      n !== ear.next &&\r\n      pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\r\n      area(n.prev, n, n.next) >= 0\r\n    )\r\n      return false;\r\n    n = n.nextZ;\r\n  }\r\n\r\n  return true;\r\n}\r\n\r\n// go through all polygon nodes and cure small local self-intersections\r\nfunction cureLocalIntersections(start: any, createGeometry: any, dim: any) {\r\n  let p = start;\r\n  do {\r\n    const a = p.prev;\r\n    const b = p.next.next;\r\n\r\n    if (\r\n      !equals(a, b) &&\r\n      intersects(a, p, p.next, b) &&\r\n      locallyInside(a, b) &&\r\n      locallyInside(b, a)\r\n    ) {\r\n      createGeometry(a.i / dim, p.i / dim, b.i / dim);\r\n\r\n      // remove two nodes involved\r\n      removeNode(p.next);\r\n      removeNode(p);\r\n\r\n      p = start = b;\r\n    }\r\n    p = p.next;\r\n  } while (p !== start);\r\n\r\n  return filterPoints(p);\r\n}\r\n\r\n// try splitting polygon into two and triangulate them independently\r\nfunction splitEarcut(\r\n  start: any,\r\n  createGeometry: any,\r\n  dim: any,\r\n  minX: any,\r\n  minY: any,\r\n  invSize: any,\r\n) {\r\n  // look for a valid diagonal that divides the polygon into two\r\n  let a = start;\r\n  do {\r\n    let b = a.next.next;\r\n    while (b !== a.prev) {\r\n      if (a.i !== b.i && isValidDiagonal(a, b)) {\r\n        // split the polygon in two by the diagonal\r\n        let c = splitPolygon(a, b);\r\n\r\n        // filter colinear points around the cuts\r\n        a = filterPoints(a, a.next);\r\n        c = filterPoints(c, c.next);\r\n\r\n        // run earcut on each half\r\n        earcutLinked(a, createGeometry, dim, minX, minY, invSize);\r\n        earcutLinked(c, createGeometry, dim, minX, minY, invSize);\r\n        return;\r\n      }\r\n      b = b.next;\r\n    }\r\n    a = a.next;\r\n  } while (a !== start);\r\n}\r\n\r\n// link every hole into the outer loop, producing a single-ring polygon without holes\r\nfunction eliminateHoles(\r\n  data: any,\r\n  holeIndices: any,\r\n  outerNode: any,\r\n  dim: any,\r\n  a: any,\r\n  b: any,\r\n) {\r\n  const queue = [];\r\n\r\n  for (let i = 0, len = holeIndices.length; i < len; i++) {\r\n    const start = holeIndices[i] * dim;\r\n    const end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\r\n    const list = linkedList(data, start, end, dim, false, a, b);\r\n    if (list === list.next) list.steiner = true;\r\n    queue.push(getLeftmost(list));\r\n  }\r\n\r\n  queue.sort(xDifference);\r\n\r\n  // process holes from left to right\r\n  for (let i = 0; i < queue.length; i++) {\r\n    outerNode = eliminateHole(queue[i], outerNode);\r\n    outerNode = filterPoints(outerNode, outerNode.next);\r\n  }\r\n\r\n  return outerNode;\r\n}\r\n\r\nfunction xDifference(a: any, b: any) {\r\n  return a.x - b.x;\r\n}\r\n\r\n// find a bridge between vertices that connects hole with an outer ring and and link it\r\nfunction eliminateHole(hole: any, outerNode: any) {\r\n  const bridge = findHoleBridge(hole, outerNode);\r\n  if (!bridge) {\r\n    return outerNode;\r\n  }\r\n\r\n  const bridgeReverse = splitPolygon(bridge, hole);\r\n\r\n  // filter collinear points around the cuts\r\n  const filtered = filterPoints(bridge, bridge.next);\r\n  filterPoints(bridgeReverse, bridgeReverse.next);\r\n  if (outerNode === outerNode.next || bridge === outerNode) {\r\n    return filtered;\r\n  }\r\n\r\n  return outerNode;\r\n}\r\n\r\n// david eberly's algorithm for finding a bridge between hole and outer polygon\r\nfunction findHoleBridge(hole: any, outerNode: any) {\r\n  let p = outerNode;\r\n  const hx = hole.x;\r\n  const hy = hole.y;\r\n  let qx = -Infinity;\r\n  let m;\r\n\r\n  // find a segment intersected by a ray from the hole's leftmost point to the left\r\n  // segment's endpoint with lesser x will be potential connection point\r\n  do {\r\n    if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\r\n      const x = p.x + ((hy - p.y) * (p.next.x - p.x)) / (p.next.y - p.y);\r\n      if (x <= hx && x > qx) {\r\n        qx = x;\r\n        if (x === hx) {\r\n          if (hy === p.y) return p;\r\n          if (hy === p.next.y) return p.next;\r\n        }\r\n        m = p.x < p.next.x ? p : p.next;\r\n      }\r\n    }\r\n    p = p.next;\r\n  } while (p !== outerNode);\r\n\r\n  if (!m) return null;\r\n\r\n  // hole touches outer segment; pick leftmost endpoint\r\n  if (hx === qx) return m;\r\n\r\n  // look for points inside the triangle of hole point, segment intersection and endpoint\r\n  // if there are no points found, we have a valid connection\r\n  // otherwise choose the point of the minimum angle with the ray as connection point\r\n\r\n  const stop = m;\r\n  const mx = m.x;\r\n  const my = m.y;\r\n  let tanMin = Infinity;\r\n\r\n  p = m;\r\n\r\n  do {\r\n    if (\r\n      hx >= p.x &&\r\n      p.x >= mx &&\r\n      hx !== p.x &&\r\n      pointInTriangle(\r\n        hy < my ? hx : qx,\r\n        hy,\r\n        mx,\r\n        my,\r\n        hy < my ? qx : hx,\r\n        hy,\r\n        p.x,\r\n        p.y,\r\n      )\r\n    ) {\r\n      // tangential\r\n      const tan = Math.abs(hy - p.y) / (hx - p.x);\r\n\r\n      if (\r\n        locallyInside(p, hole) &&\r\n        (tan < tanMin ||\r\n          (tan === tanMin &&\r\n            (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))\r\n      ) {\r\n        m = p;\r\n        tanMin = tan;\r\n      }\r\n    }\r\n    p = p.next;\r\n  } while (p !== stop);\r\n\r\n  return m;\r\n}\r\n\r\n// whether sector in vertex m contains sector in vertex p in the same coordinates\r\nfunction sectorContainsSector(m: any, p: any) {\r\n  return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\r\n}\r\n\r\n// interlink polygon nodes in z-order\r\nfunction indexCurve(start: any, minX: any, minY: any, invSize: any) {\r\n  let p = start;\r\n  do {\r\n    if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);\r\n    p.prevZ = p.prev;\r\n    p.nextZ = p.next;\r\n    p = p.next;\r\n  } while (p !== start);\r\n\r\n  p.prevZ.nextZ = null;\r\n  p.prevZ = null;\r\n\r\n  sortLinked(p);\r\n}\r\n\r\n// simon tatham's linked list merge sort algorithm\r\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\r\nfunction sortLinked(list: any) {\r\n  let inSize = 1;\r\n  let numMerges;\r\n\r\n  do {\r\n    let p = list;\r\n    let e;\r\n    list = null;\r\n    let tail = null;\r\n    numMerges = 0;\r\n\r\n    while (p) {\r\n      numMerges++;\r\n      let q = p;\r\n      let pSize = 0;\r\n      for (let i = 0; i < inSize; i++) {\r\n        pSize++;\r\n        q = q.nextZ;\r\n        if (!q) break;\r\n      }\r\n      let qSize = inSize;\r\n\r\n      while (pSize > 0 || (qSize > 0 && q)) {\r\n        if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\r\n          e = p;\r\n          p = p.nextZ;\r\n          pSize--;\r\n        } else {\r\n          e = q;\r\n          q = q.nextZ;\r\n          qSize--;\r\n        }\r\n\r\n        if (tail) tail.nextZ = e;\r\n        else list = e;\r\n\r\n        e.prevZ = tail;\r\n        tail = e;\r\n      }\r\n\r\n      p = q;\r\n    }\r\n\r\n    tail.nextZ = null;\r\n    inSize *= 2;\r\n  } while (numMerges > 1);\r\n\r\n  return list;\r\n}\r\n\r\n// z-order of a point given coords and inverse of the longer side of data bbox\r\nfunction zOrder(x: any, y: any, minX: any, minY: any, invSize: any) {\r\n  // coords are transformed into non-negative 15-bit integer range\r\n  x = 32767 * (x - minX) * invSize;\r\n  y = 32767 * (y - minY) * invSize;\r\n\r\n  x = (x | (x << 8)) & 0x00ff00ff;\r\n  x = (x | (x << 4)) & 0x0f0f0f0f;\r\n  x = (x | (x << 2)) & 0x33333333;\r\n  x = (x | (x << 1)) & 0x55555555;\r\n\r\n  y = (y | (y << 8)) & 0x00ff00ff;\r\n  y = (y | (y << 4)) & 0x0f0f0f0f;\r\n  y = (y | (y << 2)) & 0x33333333;\r\n  y = (y | (y << 1)) & 0x55555555;\r\n\r\n  return x | (y << 1);\r\n}\r\n\r\n// find the leftmost node of a polygon ring\r\nfunction getLeftmost(start: any) {\r\n  let p = start;\r\n  let leftmost = start;\r\n  do {\r\n    if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y))\r\n      leftmost = p;\r\n    p = p.next;\r\n  } while (p !== start);\r\n\r\n  return leftmost;\r\n}\r\n\r\n// check if a point lies within a convex triangle\r\nfunction pointInTriangle(\r\n  ax: any,\r\n  ay: any,\r\n  bx: any,\r\n  by: any,\r\n  cx: any,\r\n  cy: any,\r\n  px: any,\r\n  py: any,\r\n) {\r\n  return (\r\n    (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\r\n    (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\r\n    (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0\r\n  );\r\n}\r\n\r\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\r\nfunction isValidDiagonal(a: any, b: any) {\r\n  return (\r\n    a.next.i !== b.i &&\r\n    a.prev.i !== b.i &&\r\n    !intersectsPolygon(a, b) && // dones't intersect other edges\r\n    ((locallyInside(a, b) &&\r\n      locallyInside(b, a) &&\r\n      middleInside(a, b) && // locally visible\r\n      (area(a.prev, a, b.prev) || area(a, b.prev, b))) || // does not create opposite-facing sectors\r\n      (equals(a, b) &&\r\n        area(a.prev, a, a.next) > 0 &&\r\n        area(b.prev, b, b.next) > 0))\r\n  ); // special zero-length case\r\n}\r\n\r\n// signed area of a triangle\r\nfunction area(p: any, q: any, r: any) {\r\n  return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\r\n}\r\n\r\n// check if two points are equal\r\nfunction equals(p1: any, p2: any) {\r\n  return p1.x === p2.x && p1.y === p2.y;\r\n}\r\n\r\n// check if two segments intersect\r\nfunction intersects(p1: any, q1: any, p2: any, q2: any) {\r\n  const o1 = sign(area(p1, q1, p2));\r\n  const o2 = sign(area(p1, q1, q2));\r\n  const o3 = sign(area(p2, q2, p1));\r\n  const o4 = sign(area(p2, q2, q1));\r\n\r\n  if (o1 !== o2 && o3 !== o4) return true; // general case\r\n\r\n  if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\r\n  if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\r\n  if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\r\n  if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\r\n\r\n  return false;\r\n}\r\n\r\n// for collinear points p, q, r, check if point q lies on segment pr\r\nfunction onSegment(p: any, q: any, r: any) {\r\n  return (\r\n    q.x <= Math.max(p.x, r.x) &&\r\n    q.x >= Math.min(p.x, r.x) &&\r\n    q.y <= Math.max(p.y, r.y) &&\r\n    q.y >= Math.min(p.y, r.y)\r\n  );\r\n}\r\n\r\nfunction sign(num: any) {\r\n  return num > 0 ? 1 : num < 0 ? -1 : 0;\r\n}\r\n\r\n// check if a polygon diagonal intersects any polygon segments\r\nfunction intersectsPolygon(a: any, b: any) {\r\n  let p = a;\r\n  do {\r\n    if (\r\n      p.i !== a.i &&\r\n      p.next.i !== a.i &&\r\n      p.i !== b.i &&\r\n      p.next.i !== b.i &&\r\n      intersects(p, p.next, a, b)\r\n    )\r\n      return true;\r\n    p = p.next;\r\n  } while (p !== a);\r\n\r\n  return false;\r\n}\r\n\r\n// check if a polygon diagonal is locally inside the polygon\r\nfunction locallyInside(a: any, b: any) {\r\n  return area(a.prev, a, a.next) < 0\r\n    ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0\r\n    : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\r\n}\r\n\r\n// check if the middle point of a polygon diagonal is inside the polygon\r\nfunction middleInside(a: any, b: any) {\r\n  let p = a;\r\n  let inside = false;\r\n  const px = (a.x + b.x) / 2;\r\n  const py = (a.y + b.y) / 2;\r\n  do {\r\n    if (\r\n      p.y > py !== p.next.y > py &&\r\n      p.next.y !== p.y &&\r\n      px < ((p.next.x - p.x) * (py - p.y)) / (p.next.y - p.y) + p.x\r\n    )\r\n      inside = !inside;\r\n    p = p.next;\r\n  } while (p !== a);\r\n\r\n  return inside;\r\n}\r\n\r\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two\r\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\r\nfunction splitPolygon(a: any, b: any) {\r\n  // @ts-ignore\r\n  const a2 = createNode(a.i, a.x, a.y);\r\n  // @ts-ignore\r\n  const b2 = createNode(b.i, b.x, b.y);\r\n\r\n  const an = a.next;\r\n  const bp = b.prev;\r\n\r\n  a.next = b;\r\n  b.prev = a;\r\n\r\n  a2.next = an;\r\n  an.prev = a2;\r\n\r\n  b2.next = a2;\r\n  a2.prev = b2;\r\n\r\n  bp.next = b2;\r\n  b2.prev = bp;\r\n\r\n  return b2;\r\n}\r\n\r\n// create a node and optionally link it with previous one (in a circular doubly linked list)\r\nfunction insertNode(i: any, x: any, y: any, last: any) {\r\n  // @ts-ignore\r\n  const p = createNode(i, x, y);\r\n\r\n  if (!last) {\r\n    p.prev = p;\r\n    p.next = p;\r\n  } else {\r\n    p.next = last.next;\r\n    p.prev = last;\r\n    last.next.prev = p;\r\n    last.next = p;\r\n  }\r\n  return p;\r\n}\r\n\r\nfunction removeNode(p: any) {\r\n  p.next.prev = p.prev;\r\n  p.prev.next = p.next;\r\n  if (p.prevZ) p.prevZ.nextZ = p.nextZ;\r\n  if (p.nextZ) p.nextZ.prevZ = p.prevZ;\r\n  p.next = p;\r\n  p.prev = p;\r\n}\r\n\r\nfunction createNode(i: any, x: any, y: any) {\r\n  return {\r\n    i, // vertex index in coordinates array\r\n    x,\r\n    y, // vertex coordinates\r\n    prev: null as any, // previous and next vertex nodes in a polygon ring\r\n    next: null as any,\r\n    z: null as any, // z-order curve value\r\n    prevZ: null as any, // previous and next nodes in z-order\r\n    nextZ: null as any,\r\n    steiner: false as any, // indicates whether this is a steiner point\r\n  };\r\n}\r\n\r\nfunction signedArea(data: any, start: any, end: any, dim: any, a: any, b: any) {\r\n  let sum = 0;\r\n  for (let i = start, j = end - dim; i < end; i += dim) {\r\n    sum += (data[j + a] - data[i + a]) * (data[i + b] + data[j + b]);\r\n    j = i;\r\n  }\r\n  return sum;\r\n}\r\n","import * as THREE from \"three\";\r\nimport { TileData } from \"../types\";\r\nimport { DataSizes, ShellHoleData } from \"./types\";\r\nimport { earcut } from \"../../../utils/geometry/earcut\";\r\nimport { DataBuffer } from \"../../../model/model-types\";\r\nimport { FaceUtils } from \"../../../utils\";\r\n\r\nexport class ShellFaceX {\r\n  private static _tempVec = new THREE.Vector3();\r\n\r\n  static create(\r\n    indices: Uint16Array | Uint32Array,\r\n    data: Float32Array,\r\n    normals: Int16Array,\r\n    current: number,\r\n    mesh: TileData,\r\n    holes: Map<number, ShellHoleData>,\r\n    sizes: DataSizes,\r\n    faceId: number,\r\n  ) {\r\n    const size = indices.length;\r\n    const amount = sizes.verticesAmount;\r\n    ShellFaceX.processBuffers(size, indices, mesh, sizes, data, normals);\r\n    const position = mesh.positionBuffer!;\r\n    const pointsDiff = sizes.verticesAmount - amount;\r\n    const normalDims = pointsDiff / 3;\r\n    this.processNormals(position, this._tempVec, normalDims, amount);\r\n    this.triangulate(holes, current, size, mesh, sizes, amount);\r\n    this.setFaceId(amount, sizes, mesh, faceId);\r\n  }\r\n\r\n  private static setFaceId(\r\n    amount: number,\r\n    sizes: DataSizes,\r\n    mesh: TileData,\r\n    faceId: number,\r\n  ) {\r\n    const firstFace = amount / 3;\r\n    const lastFace = sizes.verticesAmount / 3;\r\n    for (let i = firstFace; i < lastFace; i++) {\r\n      mesh.faceIdBuffer![i] = faceId;\r\n    }\r\n  }\r\n\r\n  private static getVertices(mesh: TileData, amount: number, sizes: DataSizes) {\r\n    const points = mesh.positionBuffer!;\r\n    const buffer = points.buffer;\r\n    const position = amount * 4;\r\n    const size = sizes.verticesAmount - amount;\r\n    return new Float32Array(buffer, position, size);\r\n  }\r\n\r\n  private static getEvent(mesh: TileData, sizes: DataSizes, amount: number) {\r\n    return (first: number, second: number, third: number) => {\r\n      const position = mesh.indexBuffer!;\r\n      position[sizes.indices++] = first + amount / 3;\r\n      position[sizes.indices++] = second + amount / 3;\r\n      position[sizes.indices++] = third + amount / 3;\r\n    };\r\n  }\r\n\r\n  private static processBuffers(\r\n    size: number,\r\n    indices: Uint16Array | Uint32Array,\r\n    mesh: TileData,\r\n    sizes: DataSizes,\r\n    data: Float32Array,\r\n    normals: Int16Array,\r\n  ) {\r\n    for (let id = 0; id < size; id++) {\r\n      this.processPositionBuffer(mesh, indices, id, sizes, data);\r\n      this.processNormalbuffer(mesh, normals, id, sizes);\r\n      this.updateBufferData(sizes);\r\n    }\r\n  }\r\n\r\n  private static getHoles(\r\n    shellHoles: Map<number, ShellHoleData>,\r\n    index: number,\r\n    size: number,\r\n    mesh: TileData,\r\n    sizes: DataSizes,\r\n  ) {\r\n    if (!shellHoles) {\r\n      return undefined;\r\n    }\r\n    const isHole = shellHoles.has(index);\r\n    if (isHole) {\r\n      const currentHole = shellHoles.get(index)!;\r\n      const holesData: number[] = [];\r\n      for (const index of currentHole.indices) {\r\n        holesData.push(index + size);\r\n      }\r\n      this.setHolesBuffers(mesh, currentHole, sizes);\r\n      return holesData;\r\n    }\r\n    return undefined;\r\n  }\r\n\r\n  private static setHolesBuffers(\r\n    mesh: TileData,\r\n    shellHole: ShellHoleData,\r\n    sizes: DataSizes,\r\n  ) {\r\n    const position = mesh.positionBuffer!;\r\n    const normal = mesh.normalBuffer!;\r\n    position.set(shellHole.points, sizes.verticesAmount);\r\n    const holePoints = shellHole.points.length;\r\n    sizes.verticesAmount += holePoints;\r\n    sizes.vertices += holePoints / 3;\r\n    normal.set(shellHole.normals!, sizes.normalsAmount);\r\n    sizes.normalsAmount += holePoints;\r\n  }\r\n\r\n  private static updateBufferData(sizes: DataSizes) {\r\n    sizes.vertices += 1;\r\n    sizes.verticesAmount += 3;\r\n    sizes.normalsAmount += 3;\r\n  }\r\n\r\n  private static processPositionBuffer(\r\n    mesh: TileData,\r\n    indices: Uint16Array | Uint32Array,\r\n    id: number,\r\n    sizes: DataSizes,\r\n    data: Float32Array,\r\n  ) {\r\n    const position = mesh.positionBuffer!;\r\n    for (let j = 0; j < 3; j++) {\r\n      const current = indices[id] * 3;\r\n      position[sizes.verticesAmount + j] = data[current + j];\r\n    }\r\n  }\r\n\r\n  private static triangulate(\r\n    holes: Map<number, ShellHoleData>,\r\n    current: number,\r\n    size: number,\r\n    mesh: TileData,\r\n    sizes: DataSizes,\r\n    amount: number,\r\n  ) {\r\n    const tri = 3;\r\n    const holesData = this.getHoles(holes, current, size, mesh, sizes);\r\n    const vertices = ShellFaceX.getVertices(mesh, amount, sizes);\r\n    const dims = FaceUtils.getEarcutDimensions(this._tempVec);\r\n    const onCreateGeometry = this.getEvent(mesh, sizes, amount);\r\n    const firstDim = dims[0];\r\n    const secondDim = dims[1];\r\n    earcut(vertices, holesData!, tri, firstDim, secondDim, onCreateGeometry);\r\n  }\r\n\r\n  private static processNormals(\r\n    input: DataBuffer,\r\n    result: THREE.Vector3,\r\n    size: number,\r\n    position = 0,\r\n  ) {\r\n    result.set(0, 0, 0);\r\n    for (let i = 0; i < size; i++) {\r\n      const counter = (i + 1) % size;\r\n      const i1 = position + i * 3;\r\n      const i2 = position + counter * 3;\r\n      const x1 = input[i1 + 0];\r\n      const x2 = input[i2 + 0];\r\n      const y1 = input[i1 + 1];\r\n      const y2 = input[i2 + 1];\r\n      const z1 = input[i1 + 2];\r\n      const z2 = input[i2 + 2];\r\n      result.x += (y1 - y2) * (z1 + z2);\r\n      result.y += (z1 - z2) * (x1 + x2);\r\n      result.z += (x1 - x2) * (y1 + y2);\r\n    }\r\n    result.normalize();\r\n  }\r\n\r\n  private static processNormalbuffer(\r\n    mesh: TileData,\r\n    normals: Int16Array,\r\n    id: number,\r\n    sizes: DataSizes,\r\n  ) {\r\n    const normal = mesh.normalBuffer!;\r\n    const current = id * 3;\r\n    const nx = normals[current];\r\n    const ny = normals[current + 1];\r\n    const nz = normals[current + 2];\r\n    normal.set([nx, ny, nz], sizes.normalsAmount);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { TileData } from \"../types\";\r\nimport { DataSizes } from \"./types\";\r\nimport { ShellFaceX } from \"./shell-face-x\";\r\n\r\nexport class ShellFace4 {\r\n  private static a = new THREE.Vector3();\r\n  private static b = new THREE.Vector3();\r\n  private static c = new THREE.Vector3();\r\n  private static d = new THREE.Vector3();\r\n  private static e = new THREE.Vector3();\r\n  private static f = new THREE.Vector3();\r\n  private static g = new THREE.Vector3();\r\n  private static h = new THREE.Vector3();\r\n  private static i = new THREE.Vector3();\r\n\r\n  private static _vecs = [this.a, this.b, this.c, this.d];\r\n  private static _convexIndices = [0, 1, 3, 3, 1, 2];\r\n  private static readonly totalIncrease = 12;\r\n  private static readonly indexIncrease = 6;\r\n  private static readonly vertexIncrease = 4;\r\n\r\n  static create(\r\n    indices: Uint16Array | Uint32Array,\r\n    data: Float32Array,\r\n    normals: Int16Array,\r\n    id: number,\r\n    mesh: TileData,\r\n    sizes: DataSizes,\r\n    faceId: number,\r\n  ) {\r\n    this.setAllVectors(indices, data);\r\n    const isConvex = this.getIsConvex();\r\n    if (isConvex) {\r\n      this.processConvexFace4(mesh, sizes, normals, faceId);\r\n      return;\r\n    }\r\n    ShellFaceX.create(\r\n      indices,\r\n      data,\r\n      normals,\r\n      id,\r\n      mesh,\r\n      undefined as any,\r\n      sizes,\r\n      faceId,\r\n    );\r\n  }\r\n\r\n  private static setAllVectors(\r\n    indices: Uint16Array | Uint32Array,\r\n    data: Float32Array,\r\n  ) {\r\n    this.setVector(indices, data, this.a, 0);\r\n    this.setVector(indices, data, this.b, 1);\r\n    this.setVector(indices, data, this.c, 2);\r\n    this.setVector(indices, data, this.d, 3);\r\n    this.getCrossVectors();\r\n  }\r\n\r\n  private static processConvexFace4(\r\n    mesh: TileData,\r\n    sizes: DataSizes,\r\n    normals: Int16Array,\r\n    faceId: number,\r\n  ) {\r\n    this.processIndices(mesh, sizes);\r\n    this.processPoints(mesh, sizes);\r\n    this.processNormal(mesh, sizes, normals);\r\n    this.setFaceId(mesh, sizes, faceId);\r\n    this.updateData(sizes);\r\n  }\r\n\r\n  private static setFaceId(mesh: TileData, sizes: DataSizes, faceId: number) {\r\n    // Add face id to next 4 vertices\r\n    const faceIds = mesh.faceIdBuffer!;\r\n    for (let i = sizes.vertices; i < sizes.vertices + 4; i++) {\r\n      faceIds[i] = faceId;\r\n    }\r\n  }\r\n\r\n  private static getIsConvex() {\r\n    return this.h.dot(this.i) > 0;\r\n  }\r\n\r\n  private static getCrossVectors() {\r\n    this.e.copy(this.b);\r\n    this.f.copy(this.c);\r\n    this.g.copy(this.d);\r\n    this.e.sub(this.a);\r\n    this.f.sub(this.a);\r\n    this.g.sub(this.a);\r\n    this.h.crossVectors(this.e, this.f);\r\n    this.i.crossVectors(this.f, this.g);\r\n  }\r\n\r\n  private static updateData(sizes: DataSizes) {\r\n    sizes.normalsAmount += this.totalIncrease;\r\n    sizes.vertices += this.vertexIncrease;\r\n    sizes.verticesAmount += this.totalIncrease;\r\n  }\r\n\r\n  private static processPoints(mesh: TileData, sizes: DataSizes) {\r\n    let counter = 0;\r\n    const position = mesh.positionBuffer!;\r\n    const amount = sizes.verticesAmount;\r\n    for (let i = 0; i < this.vertexIncrease; i++) {\r\n      const vec = this._vecs[i];\r\n      position[amount + counter++] = vec.x;\r\n      position[amount + counter++] = vec.y;\r\n      position[amount + counter++] = vec.z;\r\n    }\r\n  }\r\n\r\n  private static setVector(\r\n    indices: Uint16Array | Uint32Array,\r\n    data: Float32Array,\r\n    vector: THREE.Vector3,\r\n    offset: number,\r\n  ) {\r\n    const index = indices[offset] * 3;\r\n    const x = data[index];\r\n    const y = data[index + 1];\r\n    const z = data[index + 2];\r\n    vector.set(x, y, z);\r\n  }\r\n\r\n  private static processNormal(\r\n    mesh: TileData,\r\n    sizes: DataSizes,\r\n    normals: Int16Array,\r\n  ) {\r\n    const normal = mesh.normalBuffer!;\r\n    const amount = sizes.normalsAmount;\r\n    for (let i = 0; i < this.totalIncrease; i++) {\r\n      normal[amount + i] = normals[i];\r\n    }\r\n  }\r\n\r\n  private static processIndices(mesh: TileData, sizes: DataSizes) {\r\n    const indices = mesh.indexBuffer!;\r\n    for (let i = 0; i < this.indexIncrease; i++) {\r\n      const offset = this._convexIndices[i];\r\n      indices[sizes.indices + i] = sizes.vertices + offset;\r\n    }\r\n    sizes.indices += this.indexIncrease;\r\n  }\r\n}\r\n","import { TileData } from \"../types\";\r\nimport { DataSizes } from \"./types\";\r\n\r\nexport class ShellFace3 {\r\n  private static readonly vertexIncrease = 3;\r\n  private static readonly totalIncrease = 9;\r\n\r\n  static create(\r\n    indices: Uint16Array | Uint32Array,\r\n    data: Float32Array,\r\n    normals: Int16Array,\r\n    mesh: TileData,\r\n    sizes: DataSizes,\r\n    faceId: number,\r\n  ) {\r\n    this.setFaceIds(sizes, mesh, faceId);\r\n    this.setIndices(mesh, sizes);\r\n    this.setPoints(indices, mesh, sizes, data);\r\n    this.setNormals(mesh, sizes, normals);\r\n    this.updateData(sizes);\r\n  }\r\n\r\n  private static setFaceIds(sizes: DataSizes, mesh: TileData, faceId: number) {\r\n    const amount = sizes.verticesAmount;\r\n    const firstFace = amount / 3;\r\n    const lastFace = firstFace + 3;\r\n    for (let i = firstFace; i < lastFace; i++) {\r\n      mesh.faceIdBuffer![i] = faceId;\r\n    }\r\n  }\r\n\r\n  private static setNormals(\r\n    mesh: TileData,\r\n    sizes: DataSizes,\r\n    normals: Int16Array,\r\n  ) {\r\n    const normal = mesh.normalBuffer!;\r\n    for (let i = 0; i < this.totalIncrease; i++) {\r\n      normal[sizes.normalsAmount + i] = normals[i];\r\n    }\r\n  }\r\n\r\n  private static setPoints(\r\n    indices: Uint16Array | Uint32Array,\r\n    mesh: TileData,\r\n    sizes: DataSizes,\r\n    data: Float32Array,\r\n  ) {\r\n    let counter = 0;\r\n    const points = mesh.positionBuffer!;\r\n    for (let i = 0; i < this.vertexIncrease; i++) {\r\n      const index = indices[i] * this.vertexIncrease;\r\n      for (let j = 0; j < this.vertexIncrease; j++) {\r\n        points[sizes.verticesAmount + counter] = data[index + j];\r\n        counter++;\r\n      }\r\n    }\r\n  }\r\n\r\n  private static setIndices(mesh: TileData, sizes: DataSizes) {\r\n    const index = mesh.indexBuffer!;\r\n    for (let i = 0; i < this.vertexIncrease; i++) {\r\n      index[sizes.indices + i] = sizes.vertices + i;\r\n    }\r\n    sizes.indices += this.vertexIncrease;\r\n  }\r\n\r\n  private static updateData(sizes: DataSizes) {\r\n    sizes.normalsAmount += ShellFace3.totalIncrease;\r\n    sizes.vertices += ShellFace3.vertexIncrease;\r\n    sizes.verticesAmount += ShellFace3.totalIncrease;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport {\r\n  Shell,\r\n  ShellHole,\r\n  ShellProfile,\r\n  FloatVector,\r\n  BigShellProfile,\r\n  ShellType,\r\n  BigShellHole,\r\n} from \"../../../../../Schema\";\r\nimport { AnyTileData, TileData } from \"../types\";\r\nimport { DataSizes, PolygonSize, ShellHoleData } from \"./types\";\r\nimport { ShellUtils } from \"./shell-utils\";\r\nimport { limitOf2Bytes } from \"../../../model/model-types\";\r\nimport { ShellFaceX } from \"./shell-face-x\";\r\nimport { ShellFace4 } from \"./shell-face-4\";\r\nimport { ShellFace3 } from \"./shell-face-3\";\r\n\r\nexport class ShellConstructor {\r\n  private point = new FloatVector();\r\n  private _shellHole = new ShellHole();\r\n  private _bigShellHole = new BigShellHole();\r\n  private interiorProfiles = new Map<number, ShellHoleData>();\r\n  private normalsAvgInterior = new Int16Array();\r\n  private _pointsPerProfile = new Map<number, number[]>();\r\n  private _shellProfile = new ShellProfile();\r\n  private _bigShellProfile = new BigShellProfile();\r\n  private _normalsAvg = new Int16Array();\r\n  private _normals: THREE.Vector3[] = [];\r\n  private _indices = 0;\r\n  private _sizes: DataSizes = {\r\n    vertices: 0,\r\n    indices: 0,\r\n    verticesAmount: 0,\r\n    normalsAmount: 0,\r\n    normals: 0,\r\n  };\r\n\r\n  private _tileData!: TileData;\r\n  private _faceIdPerProfile = new Map<number, number>();\r\n\r\n  construct(shell: Shell, meshData: TileData | TileData[]) {\r\n    this.resetConstructData(meshData);\r\n    this.getPointsPerWire(shell);\r\n    const data = ShellUtils.getBuffer(shell);\r\n    this.newShellInteriorProfiles(shell);\r\n    this.constructShell(shell, data, meshData);\r\n    this._tileData = undefined as any;\r\n  }\r\n\r\n  private getIntProfileNormalsAvg(shell: Shell, id: number) {\r\n    const hole = this.getTempHole(shell);\r\n    const indices = hole.indicesArray()!;\r\n    this.normalsAvgInterior = ShellUtils.computeNormalsAvg(\r\n      indices,\r\n      id,\r\n      this._normals,\r\n      this._pointsPerProfile,\r\n    );\r\n  }\r\n\r\n  private saveInteriorProfile(shell: Shell) {\r\n    const hole = this.getTempHole(shell);\r\n    const id = hole.profileId();\r\n    if (this.interiorProfiles.has(id)) {\r\n      this.saveExistingInteriorProfile(id);\r\n      return id;\r\n    }\r\n    const data = this.getNewIntProfileData();\r\n    this.interiorProfiles.set(id, data);\r\n    return id;\r\n  }\r\n\r\n  private computeNormalsAvg(\r\n    shell: Shell,\r\n    indices: Uint16Array | Uint32Array,\r\n    id: number,\r\n  ) {\r\n    const isShell = this.isShell(shell);\r\n    if (!isShell) return;\r\n    const n = this._normals;\r\n    const ppp = this._pointsPerProfile;\r\n    this._normalsAvg = ShellUtils.computeNormalsAvg(indices, id, n, ppp);\r\n  }\r\n\r\n  private isShell(shell: Shell) {\r\n    return shell instanceof Shell;\r\n  }\r\n\r\n  private getPointsPerWire(shell: Shell) {\r\n    const isShell = this.isShell(shell);\r\n    if (!isShell) return;\r\n    ShellUtils.getNormalsOfShellProfile(shell, this._normals);\r\n    this._pointsPerProfile = ShellUtils.getPointsShell(shell);\r\n  }\r\n\r\n  private getIndices(shell: Shell, id: number) {\r\n    const profile = this.getTempProfile(shell);\r\n    ShellUtils.getProfile(shell, id, profile);\r\n    return profile.indicesArray()!;\r\n  }\r\n\r\n  private resetConstructData(meshData: AnyTileData) {\r\n    this._indices = 0;\r\n    this._tileData = undefined as any;\r\n    this.nextBuffer(meshData);\r\n    this._normals.length = 0;\r\n  }\r\n\r\n  private initializeIndices() {\r\n    const size = this._tileData.indexCount!;\r\n    this._tileData.indexBuffer = new Uint16Array(size);\r\n  }\r\n\r\n  private constructFace4(\r\n    indices: Uint16Array | Uint32Array,\r\n    data: Float32Array,\r\n    id: number,\r\n  ) {\r\n    const faceId = this._faceIdPerProfile.get(id)!;\r\n    ShellFace4.create(\r\n      indices,\r\n      data,\r\n      this._normalsAvg,\r\n      id,\r\n      this._tileData,\r\n      this._sizes,\r\n      faceId,\r\n    );\r\n  }\r\n\r\n  private initializeSizes() {\r\n    this._sizes.vertices = 0;\r\n    this._sizes.indices = 0;\r\n    this._sizes.verticesAmount = 0;\r\n    this._sizes.normalsAmount = 0;\r\n    this._sizes.normals = 0;\r\n  }\r\n\r\n  private getInteriorProfileBuffer(shell: Shell, intProfile: ShellHoleData) {\r\n    const hole = this.getTempHole(shell);\r\n    const count = hole.indicesLength();\r\n    const isShell = this.isShell(shell);\r\n    if (!isShell) return;\r\n    for (let id = 0; id < count; id++) {\r\n      this.getIntProfilePoints(id, shell, intProfile);\r\n      this.getIntProfileNormals(intProfile, id);\r\n    }\r\n  }\r\n\r\n  private constructProfile(\r\n    id: number,\r\n    shell: Shell,\r\n    indices: Uint16Array | Uint32Array,\r\n    data: Float32Array,\r\n  ) {\r\n    const profile = this.getTempProfile(shell);\r\n    const indexAmount = profile.indicesLength();\r\n    const notAHole = !this.interiorProfiles.has(id);\r\n    const isFace3 = indexAmount === PolygonSize.three;\r\n    if (isFace3 && notAHole) {\r\n      this.constructFace3(indices, data, id);\r\n      return;\r\n    }\r\n    const isFace4 = indexAmount === PolygonSize.four;\r\n    if (isFace4 && notAHole) {\r\n      this.constructFace4(indices, data, id);\r\n      return;\r\n    }\r\n    this.constructFaceX(indices, data, id);\r\n  }\r\n\r\n  private getIntProfileNormals(hole: ShellHoleData, id: number) {\r\n    const index = id * 3;\r\n    const nx = this.normalsAvgInterior[index];\r\n    const ny = this.normalsAvgInterior[index + 1];\r\n    const nz = this.normalsAvgInterior[index + 2];\r\n    hole.normals!.push(nx, ny, nz);\r\n  }\r\n\r\n  private saveExistingInteriorProfile(id: number) {\r\n    const found = this.interiorProfiles.get(id)!;\r\n    const pointCount = found.points.length;\r\n    const indexCount = pointCount / 3;\r\n    found.indices.push(indexCount);\r\n    this.interiorProfiles.set(id, found);\r\n  }\r\n\r\n  private getNewIntProfileData() {\r\n    const indices = [0];\r\n    const points = [] as number[];\r\n    const normals = [] as number[];\r\n    return { indices, points, normals };\r\n  }\r\n\r\n  private constructFace3(\r\n    indices: Uint16Array | Uint32Array,\r\n    data: Float32Array,\r\n    id: number,\r\n  ) {\r\n    const faceId = this._faceIdPerProfile.get(id)!;\r\n    ShellFace3.create(\r\n      indices,\r\n      data,\r\n      this._normalsAvg,\r\n      this._tileData,\r\n      this._sizes,\r\n      faceId,\r\n    );\r\n  }\r\n\r\n  private getIntProfilePoints(\r\n    i: number,\r\n    shell: Shell,\r\n    holeData: ShellHoleData,\r\n  ) {\r\n    const hole = this.getTempHole(shell);\r\n    const shellIndex = hole.indices(i) as number;\r\n    shell.points(shellIndex, this.point);\r\n    const px = this.point.x();\r\n    const py = this.point.y();\r\n    const pz = this.point.z();\r\n    holeData.points.push(px, py, pz);\r\n  }\r\n\r\n  private manageMemory(shell: Shell, meshData: TileData | TileData[]) {\r\n    const profile = this.getTempProfile(shell);\r\n    const indexAmount = profile.indicesLength();\r\n    const vertexAmount = this._sizes.verticesAmount / 3;\r\n    const memoryConsumed = vertexAmount + indexAmount;\r\n    const memoryOverflow = memoryConsumed > limitOf2Bytes;\r\n    if (memoryOverflow) {\r\n      this.nextBuffer(meshData);\r\n    }\r\n  }\r\n\r\n  private nextBuffer = (bufferGeometries: TileData | TileData[]) => {\r\n    this.setTileData(bufferGeometries);\r\n    this.initializeIndices();\r\n    this.initializePositions();\r\n    this.initializeNormals();\r\n    this.initializeFaceIds();\r\n    this.initializeSizes();\r\n    this._indices++;\r\n  };\r\n\r\n  private initializeFaceIds() {\r\n    const size = this._tileData.positionCount!;\r\n    this._tileData.faceIdBuffer = new Uint32Array(size / 3);\r\n  }\r\n\r\n  private getNextFaceId() {\r\n    // Random uint32 value\r\n    const maxUint32 = 4294967295;\r\n    return Math.random() * maxUint32;\r\n  }\r\n\r\n  private newShellInteriorProfiles(shell: Shell) {\r\n    this.interiorProfiles.clear();\r\n    const count = ShellUtils.getHolesLength(shell);\r\n    const hole = this.getTempHole(shell);\r\n    for (let i = 0; i < count; i++) {\r\n      ShellUtils.getHole(shell, i, hole);\r\n      const id = this.saveInteriorProfile(shell);\r\n      const intProfile = this.interiorProfiles.get(id)!;\r\n      this.getIntProfileNormalsAvg(shell, id);\r\n      this.getInteriorProfileBuffer(shell, intProfile);\r\n    }\r\n    return this.interiorProfiles;\r\n  }\r\n\r\n  private initializePositions() {\r\n    const size = this._tileData.positionCount!;\r\n    this._tileData.positionBuffer = new Float32Array(size);\r\n  }\r\n\r\n  private initializeNormals() {\r\n    const size = this._tileData.normalCount!;\r\n    this._tileData.normalBuffer = new Int16Array(size);\r\n  }\r\n\r\n  private setTileData(bufferGeometries: AnyTileData) {\r\n    if (Array.isArray(bufferGeometries)) {\r\n      this._tileData = bufferGeometries[this._indices];\r\n      return;\r\n    }\r\n    this._tileData = bufferGeometries;\r\n  }\r\n\r\n  private constructShell(\r\n    shell: Shell,\r\n    data: Float32Array,\r\n    meshData: AnyTileData,\r\n  ) {\r\n    this.getFaceIds(shell);\r\n    // this._faceIdPerProfile.delete(4); // For debugging, draws this face black\r\n    const count = ShellUtils.getProfilesLength(shell);\r\n    for (let id = 0; id < count; id++) {\r\n      const indices = this.getIndices(shell, id);\r\n      this.computeNormalsAvg(shell, indices, id);\r\n      this.constructProfile(id, shell, indices, data);\r\n      this.manageMemory(shell, meshData);\r\n    }\r\n  }\r\n\r\n  private constructFaceX(\r\n    indices: Uint16Array | Uint32Array,\r\n    data: Float32Array,\r\n    id: number,\r\n  ) {\r\n    const faceId = this._faceIdPerProfile.get(id)!;\r\n    ShellFaceX.create(\r\n      indices,\r\n      data,\r\n      this._normalsAvg,\r\n      id,\r\n      this._tileData,\r\n      this.interiorProfiles,\r\n      this._sizes,\r\n      faceId,\r\n    );\r\n  }\r\n\r\n  private getTempProfile(shell: Shell) {\r\n    if (shell.type() === ShellType.BIG) {\r\n      return this._bigShellProfile;\r\n    }\r\n    return this._shellProfile;\r\n  }\r\n\r\n  private getTempHole(shell: Shell) {\r\n    if (shell.type() === ShellType.BIG) {\r\n      return this._bigShellHole;\r\n    }\r\n    return this._shellHole;\r\n  }\r\n\r\n  private getFaceIds(shell: Shell) {\r\n    this._faceIdPerProfile.clear();\r\n\r\n    const faceIds = shell.profilesFaceIdsArray();\r\n\r\n    const colors = new Map<number, number>();\r\n\r\n    if (faceIds && faceIds.length > 0) {\r\n      for (let i = 0; i < faceIds.length; i++) {\r\n        const rawFaceId = faceIds[i]!;\r\n        if (!colors.has(rawFaceId)) {\r\n          colors.set(rawFaceId, this.getNextFaceId());\r\n        }\r\n        const faceId = colors.get(rawFaceId)!;\r\n        this._faceIdPerProfile.set(i, faceId);\r\n      }\r\n      return;\r\n    }\r\n\r\n    // Default case: assign a face per profile\r\n    for (let i = 0; i < shell.profilesLength(); i++) {\r\n      this._faceIdPerProfile.set(i, this.getNextFaceId());\r\n    }\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport earcut from \"earcut\";\r\nimport { ShellUtils } from \"./shell-utils\";\r\nimport { Meshes, Shell } from \"../../../../../Schema\";\r\nimport { DataBuffer } from \"../../../model/model-types\";\r\nimport { FaceUtils } from \"../../../utils\";\r\n\r\nexport class ShellFaceRaycaster {\r\n  private a = new THREE.Vector3();\r\n  private b = new THREE.Vector3();\r\n  private c = new THREE.Vector3();\r\n  private d = new THREE.Vector3();\r\n  private e = new THREE.Vector3();\r\n  private f = new THREE.Vector3();\r\n  private g = new THREE.Vector3();\r\n  private h = new THREE.Vector3();\r\n  private i = new THREE.Vector3();\r\n  private j = new THREE.Vector3();\r\n  private k = new THREE.Vector3();\r\n\r\n  private tempTriangle = new THREE.Triangle();\r\n\r\n  private tempPlane = new THREE.Plane();\r\n  private includedVertices = <any[]>[];\r\n  private interiorProfiles: Map<number, number[]> = new Map();\r\n\r\n  private readonly _meshes: Meshes;\r\n\r\n  constructor(meshes: Meshes) {\r\n    this._meshes = meshes;\r\n  }\r\n\r\n  faceRaycast(id: number, ray: THREE.Ray) {\r\n    const shell = ShellUtils.getShell(this._meshes, id);\r\n    this.resetData();\r\n    this.getInteriorProfiles(shell);\r\n    const buffer = ShellUtils.getBuffer(shell);\r\n    this.processAllCollisions(shell, buffer, ray);\r\n    return this.includedVertices;\r\n  }\r\n\r\n  private resetVectors() {\r\n    this.a.set(0, 0, 0);\r\n    this.b.set(0, 0, 0);\r\n    this.c.set(0, 0, 0);\r\n    this.d.set(0, 0, 0);\r\n  }\r\n\r\n  private resetData() {\r\n    this.includedVertices.length = 0;\r\n    this.interiorProfiles.clear();\r\n  }\r\n\r\n  private getInteriorProfiles(shell: Shell) {\r\n    const holesLength = ShellUtils.getHolesLength(shell);\r\n    for (let holeId = 0; holeId < holesLength; holeId++) {\r\n      const hole = ShellUtils.getHole(shell, holeId);\r\n      const profileId = hole.profileId();\r\n      if (!this.interiorProfiles.has(profileId)) {\r\n        this.interiorProfiles.set(profileId, []);\r\n      }\r\n      const profiles = this.interiorProfiles.get(profileId)!;\r\n      profiles.push(holeId);\r\n    }\r\n  }\r\n\r\n  private processTriangle(\r\n    indices: DataBuffer,\r\n    buffer: DataBuffer,\r\n    ray: THREE.Ray,\r\n  ) {\r\n    const first = indices[0] * 3;\r\n    const second = indices[1] * 3;\r\n    const third = indices[2] * 3;\r\n    this.saveTriPoint(this.e, buffer, first);\r\n    this.saveTriPoint(this.f, buffer, second);\r\n    this.saveTriPoint(this.g, buffer, third);\r\n    const found = this.triangleHit(ray);\r\n    if (found) {\r\n      const triangleBuffer = this.getTriangleBuffer(buffer, indices);\r\n      (found as any).facePoints = triangleBuffer.points;\r\n      (found as any).faceIndices = triangleBuffer.indices;\r\n      this.includedVertices.push(found);\r\n    }\r\n  }\r\n\r\n  private processAllCollisions(\r\n    shell: Shell,\r\n    buffer: DataBuffer,\r\n    ray: THREE.Ray,\r\n  ) {\r\n    const count = ShellUtils.getProfilesLength(shell);\r\n    for (let id = 0; id < count; id++) {\r\n      this.resetVectors();\r\n      const indices = this.getIndices(shell, id);\r\n      const valid = this.getValidCollision(indices, buffer, ray, id, shell);\r\n      if (valid) {\r\n        this.processCollision(shell, id, buffer, indices);\r\n      }\r\n    }\r\n  }\r\n\r\n  private saveTriPoint(\r\n    vector: THREE.Vector3,\r\n    buffer: DataBuffer,\r\n    first: number,\r\n  ) {\r\n    const x1 = buffer[first];\r\n    const y1 = buffer[first + 1];\r\n    const z1 = buffer[first + 2];\r\n    vector.set(x1, y1, z1);\r\n  }\r\n\r\n  private getIndices(shell: Shell, id: number) {\r\n    const currentProfile = ShellUtils.getProfile(shell, id);\r\n    return currentProfile.indicesArray()!;\r\n  }\r\n\r\n  private getIsTriangle(indices: DataBuffer) {\r\n    const indexAmount = indices.length;\r\n    return indexAmount === 3;\r\n  }\r\n\r\n  private getNormal() {\r\n    this.tempTriangle.a = this.e;\r\n    this.tempTriangle.b = this.f;\r\n    this.tempTriangle.c = this.g;\r\n    const result = new THREE.Vector3();\r\n    this.tempTriangle.getNormal(result);\r\n    return result;\r\n  }\r\n\r\n  private isHole(id: number, shell: Shell, buffer: DataBuffer) {\r\n    if (this.interiorProfiles.has(id)) {\r\n      const interiorProfiles = this.interiorProfiles.get(id)!;\r\n      return this.holeContains(interiorProfiles, shell, buffer);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  private computeNormal(data: DataBuffer, indices: DataBuffer) {\r\n    this.d.set(0, 0, 0);\r\n    const count = indices.length;\r\n    for (let i1 = 0; i1 < count; i1++) {\r\n      const i2 = (i1 + 1) % count;\r\n      const a = indices[i1] * 3;\r\n      const b = indices[i2] * 3;\r\n      this.processNormal(data, a, b);\r\n    }\r\n    this.d.normalize();\r\n  }\r\n\r\n  private holeContains(indices: number[], shell: Shell, data: DataBuffer) {\r\n    const count = indices.length;\r\n    for (let i = 0; i < count; i++) {\r\n      const shellHole = ShellUtils.getHole(shell, indices[i]);\r\n      const index = shellHole.indicesArray()!;\r\n      const contained = this.polygonContains(data, index);\r\n      if (contained) {\r\n        return true;\r\n      }\r\n    }\r\n    return false;\r\n  }\r\n\r\n  private triangleHit(ray: THREE.Ray) {\r\n    const e = this.e;\r\n    const f = this.f;\r\n    const g = this.g;\r\n    const hits = ray.intersectTriangle(e, f, g, false, this.h);\r\n    if (!hits) {\r\n      return undefined;\r\n    }\r\n    const normal = this.getNormal();\r\n    const point = this.h.clone();\r\n    return { point, normal };\r\n  }\r\n\r\n  private getValidCollision(\r\n    indices: DataBuffer,\r\n    buffer: DataBuffer,\r\n    ray: THREE.Ray,\r\n    id: number,\r\n    shell: Shell,\r\n  ) {\r\n    const isTriangle = this.getIsTriangle(indices);\r\n    if (isTriangle) {\r\n      this.processTriangle(indices, buffer, ray);\r\n      return false;\r\n    }\r\n\r\n    const collidesPlane = this.getCollidesPlane(indices, buffer, ray);\r\n    if (!collidesPlane) {\r\n      return false;\r\n    }\r\n\r\n    const isHole = this.isHole(id, shell, buffer);\r\n    if (isHole) {\r\n      return false;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  private processCollision(\r\n    shell: Shell,\r\n    profileId: number,\r\n    buffer: DataBuffer,\r\n    indices: DataBuffer,\r\n  ) {\r\n    const contains = this.polygonContains(buffer, indices);\r\n    if (!contains) return;\r\n    const point = this.b.clone();\r\n    const normal = this.tempPlane.normal.clone();\r\n\r\n    const faceBuffer = this.getFaceBuffer(shell, profileId, buffer);\r\n\r\n    this.includedVertices.push({\r\n      point,\r\n      normal,\r\n      facePoints: faceBuffer.points,\r\n      faceIndices: faceBuffer.indices,\r\n    });\r\n  }\r\n\r\n  private newOrthoNormalBasis() {\r\n    const a1 = this.tempPlane.normal;\r\n    const a2 = this.j;\r\n    const a3 = this.i;\r\n    const n1 = Math.abs(a1.x);\r\n    const n2 = Math.abs(a1.y);\r\n    if (n1 >= n2) {\r\n      const inverse = 1.0 / Math.sqrt(a1.x * a1.x + a1.z * a1.z);\r\n      const a2x = -a1.z * inverse;\r\n      const a2y = 0.0;\r\n      const a2z = a1.x * inverse;\r\n      a2.set(a2x, a2y, a2z);\r\n      const a3x = a1.y * a2.z;\r\n      const a3y = a1.z * a2.x - a1.x * a2.z;\r\n      const a3z = -a1.y * a2.x;\r\n      a3.set(a3x, a3y, a3z);\r\n    } else {\r\n      const inverse = 1.0 / Math.sqrt(a1.y * a1.y + a1.z * a1.z);\r\n      const a2x = 0.0;\r\n      const a2y = a1.z * inverse;\r\n      const a2z = -a1.y * inverse;\r\n      a2.set(a2x, a2y, a2z);\r\n      const a3x = a1.y * a2.z - a1.z * a2.y;\r\n      const a3y = -a1.x * a2.z;\r\n      const a3z = a1.x * a2.y;\r\n      a3.set(a3x, a3y, a3z);\r\n    }\r\n    a2.normalize();\r\n    a3.normalize();\r\n  }\r\n\r\n  private polygonContains(data: DataBuffer, indices: DataBuffer) {\r\n    let contains = false;\r\n    this.newOrthoNormalBasis();\r\n    this.setPolyContainVec(indices, data);\r\n    let a = this.k.dot(this.i);\r\n    let b = this.k.dot(this.j);\r\n    for (let i = 0; i < indices.length; i++) {\r\n      const current = indices[i] * 3;\r\n      const x = data[current];\r\n      const y = data[current + 1];\r\n      const z = data[current + 2];\r\n      this.k.set(x, y, z);\r\n      this.k.sub(this.b);\r\n      const c = this.k.dot(this.i);\r\n      const d = this.k.dot(this.j);\r\n      const n1 = d > 0;\r\n      const n2 = b > 0;\r\n      if (n1 !== n2) {\r\n        const crosses = ((a - c) * -d) / (b - d) + c > 0;\r\n        if (crosses) {\r\n          contains = !contains;\r\n        }\r\n      }\r\n      a = c;\r\n      b = d;\r\n    }\r\n    return contains;\r\n  }\r\n\r\n  private processNormal(data: DataBuffer, i1: number, i2: number) {\r\n    const x1 = data[i1 + 0];\r\n    const x2 = data[i2 + 0];\r\n    const y1 = data[i1 + 1];\r\n    const y2 = data[i2 + 1];\r\n    const z1 = data[i1 + 2];\r\n    const z2 = data[i2 + 2];\r\n    this.d.x += (y1 - y2) * (z1 + z2);\r\n    this.d.y += (z1 - z2) * (x1 + x2);\r\n    this.d.z += (x1 - x2) * (y1 + y2);\r\n  }\r\n\r\n  private getCollidesPlane(\r\n    indices: DataBuffer,\r\n    buffer: DataBuffer,\r\n    ray: THREE.Ray,\r\n  ) {\r\n    const first = indices[0] * 3;\r\n    const x = buffer[first];\r\n    const y = buffer[first + 1];\r\n    const z = buffer[first + 2];\r\n    this.a.set(x, y, z);\r\n    this.computeNormal(buffer, indices);\r\n    this.tempPlane.setFromNormalAndCoplanarPoint(this.d, this.a);\r\n    const collidesPlane = ray.intersectPlane(this.tempPlane, this.b);\r\n    return collidesPlane;\r\n  }\r\n\r\n  private setPolyContainVec(indices: DataBuffer, data: DataBuffer) {\r\n    const end = indices[indices.length - 1] * 3;\r\n    const x = data[end];\r\n    const y = data[end + 1];\r\n    const z = data[end + 2];\r\n    this.k.set(x, y, z);\r\n    this.k.sub(this.b);\r\n  }\r\n\r\n  private getTriangleBuffer(buffer: DataBuffer, indices: DataBuffer) {\r\n    const points: number[] = [];\r\n    const newIndices: number[] = [];\r\n    for (let i = 0; i < indices.length; i++) {\r\n      const index = indices[i] * 3;\r\n      points.push(buffer[index], buffer[index + 1], buffer[index + 2]);\r\n      newIndices.push(i);\r\n    }\r\n\r\n    return { points: new Float32Array(points), indices: newIndices };\r\n  }\r\n\r\n  private getFaceBuffer(shell: Shell, profileId: number, buffer: DataBuffer) {\r\n    const indices = ShellUtils.getProfileIndices(shell, profileId);\r\n    const { outer, inners } = indices;\r\n\r\n    const points: number[] = [];\r\n    for (let i = 0; i < outer.length; i++) {\r\n      const index = outer[i] * 3;\r\n      points.push(buffer[index], buffer[index + 1], buffer[index + 2]);\r\n    }\r\n\r\n    const holesIndices = [];\r\n\r\n    for (let i = 0; i < inners.length; i++) {\r\n      const currentHole = inners[i];\r\n      holesIndices.push(points.length / 3);\r\n      for (let j = 0; j < currentHole.length; j++) {\r\n        const index = currentHole[j] * 3;\r\n        points.push(buffer[index], buffer[index + 1], buffer[index + 2]);\r\n      }\r\n    }\r\n\r\n    const a = new THREE.Vector3();\r\n    const b = new THREE.Vector3();\r\n    const c = new THREE.Vector3();\r\n    a.set(points[0], points[1], points[2]);\r\n    b.set(points[3], points[4], points[5]);\r\n    c.set(points[6], points[7], points[8]);\r\n    const tri = new THREE.Triangle();\r\n    tri.set(a, b, c);\r\n    const normal = new THREE.Vector3();\r\n    tri.getNormal(normal);\r\n\r\n    const [dim1, dim2] = FaceUtils.getEarcutDimensions(normal);\r\n\r\n    const projectedPoints = [];\r\n    for (let i = 0; i < points.length; i += 3) {\r\n      const x = points[i];\r\n      const y = points[i + 1];\r\n      const z = points[i + 2];\r\n      const point = [x, y, z];\r\n      projectedPoints.push(point[dim1], point[dim2]);\r\n    }\r\n\r\n    const result = earcut(projectedPoints, holesIndices);\r\n    return { points: new Float32Array(points), indices: result };\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport {\r\n  BigShellProfile,\r\n  Meshes,\r\n  Shell,\r\n  ShellProfile,\r\n  ShellType,\r\n} from \"../../../../../Schema\";\r\n\r\nimport { ShellUtils } from \"./shell-utils\";\r\n\r\nexport class ShellLineRaycaster {\r\n  private readonly _meshes: Meshes;\r\n  private _minAngle = Math.PI / 32;\r\n  private _shellProfile = new ShellProfile();\r\n  private _bigShellProfile = new BigShellProfile();\r\n  private _tempV1 = new THREE.Vector3();\r\n  private _tempV2 = new THREE.Vector3();\r\n  private _tempPoint = new THREE.Vector3();\r\n  private _normals: THREE.Vector3[] = [];\r\n  private _pointsByProfile = new Map<number, number[]>();\r\n  private _shell = new Shell();\r\n  private _result: any[] = [];\r\n\r\n  constructor(meshes: Meshes) {\r\n    this._meshes = meshes;\r\n  }\r\n\r\n  lineRaycast(id: number, ray: THREE.Ray, frustum: THREE.Frustum) {\r\n    this.resetData(id);\r\n    this.lineRaycastItems(ray, frustum);\r\n    return this._result;\r\n  }\r\n\r\n  private lineRaycastItems(ray: THREE.Ray, frustum: THREE.Frustum) {\r\n    const profilesCount = ShellUtils.getProfilesLength(this._shell);\r\n    for (let id = 0; id < profilesCount; id++) {\r\n      const profile = this.getTempProfile(this._shell);\r\n      ShellUtils.getProfile(this._shell, id, profile);\r\n      this.lineRaycastProfile(ray, frustum, id);\r\n    }\r\n  }\r\n\r\n  private resetData(id: number) {\r\n    this._shell = ShellUtils.getShell(this._meshes, id);\r\n    this._normals.length = 0;\r\n    ShellUtils.getNormalsOfShellProfile(this._shell, this._normals);\r\n    this._pointsByProfile = ShellUtils.getPointsShell(this._shell);\r\n    this._result = [];\r\n  }\r\n\r\n  private lineRaycastProfile(\r\n    ray: THREE.Ray,\r\n    frustum: THREE.Frustum,\r\n    id: number,\r\n  ) {\r\n    const profile = this.getTempProfile(this._shell);\r\n    const indicesCount = profile.indicesLength();\r\n    for (let i = 0; i < indicesCount; i++) {\r\n      const i1 = profile.indices(i)!;\r\n      const i2 = this.getSecondIndex(i, indicesCount);\r\n      const success = this.cast(i1, i2, ray, frustum, id);\r\n      if (success) {\r\n        this.saveResult(id);\r\n      }\r\n    }\r\n  }\r\n\r\n  private isInvalidAngle(firstIndex: number, secondIndex: number, id: number) {\r\n    const profile = this.getProfile(firstIndex, secondIndex, id);\r\n    if (!profile.length) {\r\n      return true;\r\n    }\r\n    const normal1 = this._normals[profile[0]];\r\n    const normal2 = this._normals[id];\r\n    const angle = normal1.dot(normal2);\r\n    return angle > Math.cos(this._minAngle);\r\n  }\r\n\r\n  private getProfile(firstIndex: number, secondIndex: number, id: number) {\r\n    const profile1 = this._pointsByProfile.get(firstIndex)!;\r\n    const profile2 = this._pointsByProfile.get(secondIndex)!;\r\n    const result: number[] = [];\r\n    for (const index of profile1) {\r\n      if (profile2.indexOf(index) === -1) continue;\r\n      if (index === id) continue;\r\n      result.push(index);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private cast(\r\n    i1: number,\r\n    i2: number,\r\n    ray: THREE.Ray,\r\n    frustum: THREE.Frustum,\r\n    id: number,\r\n  ) {\r\n    ShellUtils.point(this._shell, i1, this._tempV1);\r\n    ShellUtils.point(this._shell, i2, this._tempV2);\r\n\r\n    this.raycastSegment(ray);\r\n\r\n    const pointFound = frustum.containsPoint(this._tempPoint);\r\n    if (!pointFound) {\r\n      return false;\r\n    }\r\n\r\n    const invalidAngle = this.isInvalidAngle(i1, i2, id);\r\n    if (invalidAngle) {\r\n      return false;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  private saveResult(id: number) {\r\n    const snappedEdgeP1 = this._tempV1.clone();\r\n    const snappedEdgeP2 = this._tempV2.clone();\r\n    const normal = this._normals[id];\r\n    const point = this._tempPoint.clone();\r\n    this._result.push({ point, normal, snappedEdgeP1, snappedEdgeP2 });\r\n  }\r\n\r\n  private getSecondIndex(id: number, count: number) {\r\n    const isLast = id === count - 1;\r\n    const profile = this.getTempProfile(this._shell);\r\n    if (isLast) {\r\n      return profile.indices(0)!;\r\n    }\r\n    return profile.indices(id + 1)!;\r\n  }\r\n\r\n  private raycastSegment(ray: THREE.Ray) {\r\n    ray.distanceSqToSegment(\r\n      this._tempV1,\r\n      this._tempV2,\r\n      undefined,\r\n      this._tempPoint,\r\n    );\r\n  }\r\n\r\n  private getTempProfile(shell: Shell) {\r\n    if (shell.type() === ShellType.BIG) {\r\n      return this._bigShellProfile;\r\n    }\r\n    return this._shellProfile;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { ShellUtils } from \"./shell-utils\";\r\nimport { Meshes, Shell } from \"../../../../../Schema\";\r\n\r\nexport class ShellPointRaycaster {\r\n  private _meshes: Meshes;\r\n  private _tempVec = new THREE.Vector3();\r\n\r\n  constructor(_meshes: Meshes) {\r\n    this._meshes = _meshes;\r\n  }\r\n\r\n  pointRaycast(id: number, frustum: THREE.Frustum) {\r\n    const shell = ShellUtils.getShell(this._meshes, id);\r\n    const points: any[] = [];\r\n    this.cast(shell, frustum, points);\r\n    return points;\r\n  }\r\n\r\n  private cast(shell: Shell, frustum: THREE.Frustum, points: any[]) {\r\n    const count = shell.pointsLength();\r\n    for (let id = 0; id < count; id++) {\r\n      ShellUtils.point(shell, id, this._tempVec);\r\n      const pointFound = frustum.containsPoint(this._tempVec);\r\n      if (!pointFound) continue;\r\n      const point = this._tempVec.clone();\r\n      points.push({ point });\r\n    }\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { VirtualMeshManager } from \"./virtual-mesh-manager\";\r\nimport { LodClass, AnyTileData } from \"./types\";\r\nimport { CurrentLod, ObjectClass } from \"../../model/model-types\";\r\n\r\nimport { Shell, RepresentationClass } from \"../../../../Schema\";\r\nimport { ShellTemplateConstructor } from \"./shell/shell-template-constructor\";\r\nimport {\r\n  ShellConstructor,\r\n  ShellFaceRaycaster,\r\n  ShellLineRaycaster,\r\n} from \"./shell\";\r\nimport { ShellUtils } from \"./shell/shell-utils\";\r\nimport { ShellPointRaycaster } from \"./shell/shell-point-raycaster\";\r\n\r\nexport class VirtualShellManager extends VirtualMeshManager {\r\n  private readonly _lodClass = LodClass.AABB;\r\n  private readonly _objectClass = ObjectClass.SHELL;\r\n  private readonly _representationClass = RepresentationClass.SHELL;\r\n\r\n  private _templates = new ShellTemplateConstructor();\r\n  private _constructor = new ShellConstructor();\r\n\r\n  private _faceRaycaster = new ShellFaceRaycaster(this.meshes);\r\n  private _lineRaycaster = new ShellLineRaycaster(this.meshes);\r\n  private _pointRaycaster = new ShellPointRaycaster(this.meshes);\r\n\r\n  fetchMeshes(meshId: number, evenVoid: boolean) {\r\n    const mesh = this.getMesh(meshId, CurrentLod.GEOMETRY);\r\n    this.constructMesh(mesh, evenVoid, meshId);\r\n    return mesh;\r\n  }\r\n\r\n  newMeshTemplate(shell: Shell) {\r\n    return this._templates.newMeshTemplate(shell);\r\n  }\r\n\r\n  lineRaycast(id: number, ray: THREE.Ray, frustum: THREE.Frustum) {\r\n    return this._lineRaycaster.lineRaycast(id, ray, frustum);\r\n  }\r\n\r\n  faceRaycast(id: number, ray: THREE.Ray) {\r\n    return this._faceRaycaster.faceRaycast(id, ray);\r\n  }\r\n\r\n  raycast(id: number, ray: THREE.Ray) {\r\n    return this._faceRaycaster.faceRaycast(id, ray);\r\n  }\r\n\r\n  pointRaycast(id: number, _ray: THREE.Ray, frustum: THREE.Frustum) {\r\n    return this._pointRaycaster.pointRaycast(id, frustum);\r\n  }\r\n\r\n  setupTemplates() {\r\n    for (let i = 0, l = this.meshes.shellsLength(); i < l; i++) {\r\n      const poly = ShellUtils.getShell(this.meshes, i);\r\n      this.useMesh(i, this.newMeshTemplate(poly), CurrentLod.GEOMETRY);\r\n    }\r\n  }\r\n\r\n  getRepresentation() {\r\n    return this._representationClass;\r\n  }\r\n\r\n  getObjectClass() {\r\n    return this._objectClass;\r\n  }\r\n\r\n  getLodClass() {\r\n    return this._lodClass;\r\n  }\r\n\r\n  private isVoidMesh(mesh: AnyTileData) {\r\n    if (!Array.isArray(mesh)) {\r\n      return mesh.positionBuffer === undefined;\r\n    }\r\n    return mesh[0].positionBuffer === undefined;\r\n  }\r\n\r\n  private constructMesh(mesh: AnyTileData, evenVoid: boolean, meshId: number) {\r\n    const isVoid = this.isVoidMesh(mesh);\r\n    if (!isVoid || !evenVoid) return;\r\n    const shell = ShellUtils.getShell(this.meshes, meshId);\r\n    this._constructor.construct(shell, mesh);\r\n    this.saveMesh(meshId, mesh, CurrentLod.GEOMETRY);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport {\r\n  CircleCurve,\r\n  Axis,\r\n  Wire,\r\n  WireSet,\r\n  FloatVector,\r\n} from \"../../../../../Schema\";\r\n\r\nexport class VceCasterUtils {\r\n  private static readonly _floats = new FloatVector();\r\n  private static readonly _wire = new Wire();\r\n  private static readonly _wireSet = new WireSet();\r\n  private static readonly _circleCurve = new CircleCurve();\r\n\r\n  private static readonly _wireP1 = new THREE.Vector3();\r\n  private static readonly _wireP2 = new THREE.Vector3();\r\n  private static readonly _circleP1 = new THREE.Vector3();\r\n  private static readonly _circleP2 = new THREE.Vector3();\r\n  private static readonly _circleOrigin = new THREE.Vector3();\r\n  private static readonly _circleOrientation = new THREE.Vector3();\r\n  private static readonly _currentWireSetPoint = new THREE.Vector3();\r\n  private static readonly _nextWireSetPoint = new THREE.Vector3();\r\n  // ce: circle extrusion\r\n  private static readonly _ceAxisZ = new THREE.Vector3();\r\n  private static readonly _ceAxisY = new THREE.Vector3();\r\n  private static readonly _ceAxisX = new THREE.Vector3();\r\n  private static readonly _ceRaycastPoint = new THREE.Vector3();\r\n\r\n  private static readonly _ceSize = new THREE.Vector3();\r\n  private static readonly _ceAbsoluteX = new THREE.Vector3(0, 0, 1);\r\n  private static readonly _ceAbsoluteZ = new THREE.Vector3(1, 0, 0);\r\n\r\n  private static readonly _circlePoints: THREE.Vector3[] = [];\r\n\r\n  private static readonly _ceTransform = new THREE.Matrix4();\r\n  private static readonly _ceInverseTransform = new THREE.Matrix4();\r\n  private static readonly _ceRay = new THREE.Ray();\r\n\r\n  private static _ceRaycastPoints: any[] = [];\r\n\r\n  static circleCurve3Divisions(input: CircleCurve) {\r\n    const factor = 4;\r\n    const min = 4;\r\n    const max = 32;\r\n    const aperture = input.aperture();\r\n    const radius = input.radius();\r\n    const rawResult = aperture * radius * factor;\r\n    const divisions = Math.round(rawResult);\r\n    return Math.min(Math.max(divisions, min), max);\r\n  }\r\n\r\n  static traverseCircleCurve(\r\n    axis: Axis,\r\n    callback: (\r\n      first: THREE.Vector3,\r\n      middle: THREE.Vector3[],\r\n      last: THREE.Vector3,\r\n    ) => void,\r\n    getDivisions: (circleCurve: CircleCurve) => number,\r\n  ) {\r\n    const count = axis.circleCurvesLength();\r\n    const startAndEnd = 2;\r\n    for (let i = 0; i < count; i++) {\r\n      this.getAllCircleCurveData(axis, i);\r\n      const divisions = getDivisions(this._circleCurve);\r\n      this._circlePoints.length = divisions - startAndEnd;\r\n      this.getCircleCurveMids(divisions);\r\n      this.getNewCircleCurveData();\r\n      callback(this._circleP1, this._circlePoints, this._circleP2);\r\n    }\r\n  }\r\n\r\n  static traverseWireSets(\r\n    axis: Axis,\r\n    callback: (current: THREE.Vector3, next: THREE.Vector3) => void,\r\n  ) {\r\n    const wireSetCount = axis.wireSetsLength();\r\n    for (let i = 0; i < wireSetCount; i++) {\r\n      axis.wireSets(i, this._wireSet);\r\n      this.traverseWireSetWires(callback);\r\n    }\r\n  }\r\n\r\n  static raycastCircleExtr(\r\n    first: THREE.Vector3,\r\n    last: THREE.Vector3,\r\n    ray: THREE.Ray,\r\n    radius: number,\r\n  ) {\r\n    const distance = last.distanceTo(first);\r\n    this.setupCircleExtrusionAxes(last, first);\r\n    this.setupCircleExtrusionTransform(first, radius);\r\n    this.setupCircleExtrusionRay(ray);\r\n    return this.computeCircleExtrusionRaycast(distance, radius);\r\n  }\r\n\r\n  static traverseWires(\r\n    axis: Axis,\r\n    callback: (p1: THREE.Vector3, p2: THREE.Vector3) => void,\r\n  ) {\r\n    const wiresCount = axis.wiresLength();\r\n    for (let i = 0; i < wiresCount; i++) {\r\n      axis.wires(i, this._wire);\r\n      this.setWire();\r\n      callback(this._wireP1, this._wireP2);\r\n    }\r\n  }\r\n\r\n  private static getNewCircleCurveData() {\r\n    this._circleP2.copy(this._circleP1);\r\n    const aperture = this._circleCurve.aperture();\r\n    const radius = this._circleCurve.radius();\r\n    this._circleP2.applyAxisAngle(this._circleOrientation, aperture);\r\n    this._circleP2.multiplyScalar(radius);\r\n    this._circleP2.add(this._circleOrigin);\r\n    this._circleP1.multiplyScalar(radius);\r\n    this._circleP1.add(this._circleOrigin);\r\n  }\r\n\r\n  private static setWire() {\r\n    this.setWirePoint(\"p1\", this._wireP1);\r\n    this.setWirePoint(\"p2\", this._wireP2);\r\n  }\r\n\r\n  private static getCircleCurveMids(divisions: number) {\r\n    const count = this._circlePoints.length;\r\n    for (let i = 0; i < count; i++) {\r\n      this._circlePoints[i] = this.newCirclePoint(i, divisions);\r\n    }\r\n  }\r\n\r\n  private static newCirclePoint(i: number, divisions: number) {\r\n    const divisionCount = divisions - 1;\r\n    const currentSegment = i + 1;\r\n    const point = new THREE.Vector3();\r\n    point.copy(this._circleP1);\r\n    const radius = this._circleCurve.radius();\r\n    const aperture = this._circleCurve.aperture();\r\n    const progress = aperture * currentSegment;\r\n    const angle = progress / divisionCount;\r\n    point.applyAxisAngle(this._circleOrientation, angle);\r\n    point.multiplyScalar(radius);\r\n    point.add(this._circleOrigin);\r\n    return point;\r\n  }\r\n\r\n  private static getAllCircleCurveData(axis: Axis, i: number) {\r\n    axis.circleCurves(i, this._circleCurve);\r\n    this.getCircleCurveData(this._circleOrigin, \"position\");\r\n    this.getCircleCurveData(this._circleOrientation, \"xDirection\");\r\n    this.getCircleCurveData(this._circleP1, \"yDirection\");\r\n  }\r\n\r\n  private static setWirePoint(point: \"p1\" | \"p2\", vector: THREE.Vector3) {\r\n    this._wire[point](this._floats);\r\n    const x = this._floats.x();\r\n    const y = this._floats.y();\r\n    const z = this._floats.z();\r\n    vector.set(x, y, z);\r\n  }\r\n\r\n  private static getCircleCurveData(\r\n    vector: THREE.Vector3,\r\n    key: \"position\" | \"xDirection\" | \"yDirection\",\r\n  ) {\r\n    const data = this._circleCurve[key]() as FloatVector;\r\n    this.getVectorData(data, vector);\r\n  }\r\n\r\n  private static getVectorData(data: FloatVector, vector: THREE.Vector3) {\r\n    const x = data.x();\r\n    const y = data.y();\r\n    const z = data.z();\r\n    vector.set(x, y, z);\r\n  }\r\n\r\n  private static traverseWireSetWires(\r\n    callback: (current: THREE.Vector3, next: THREE.Vector3) => void,\r\n  ) {\r\n    const pointsCount = this._wireSet.psLength();\r\n    const wiresCount = pointsCount - 1;\r\n    for (let i = 0; i < wiresCount; i++) {\r\n      this.getWiresetPoint(this._currentWireSetPoint, i);\r\n      this.getWiresetPoint(this._nextWireSetPoint, i + 1);\r\n      callback(this._currentWireSetPoint, this._nextWireSetPoint);\r\n    }\r\n  }\r\n\r\n  private static getWiresetPoint(point: THREE.Vector3, index: number) {\r\n    const pointData = this._wireSet.ps(index) as FloatVector;\r\n    this.getVectorData(pointData, point);\r\n  }\r\n\r\n  private static setupCircleExtrusionTransform(\r\n    first: THREE.Vector3,\r\n    radius: number,\r\n  ) {\r\n    this._ceTransform.identity();\r\n    this._ceTransform.makeBasis(this._ceAxisX, this._ceAxisY, this._ceAxisZ);\r\n    this._ceTransform.setPosition(first);\r\n    this._ceSize.set(radius, radius, radius);\r\n    this._ceTransform.scale(this._ceSize);\r\n  }\r\n\r\n  private static computeCircleExtrusionRaycastFactors() {\r\n    const c1 = 2;\r\n    const c2 = 4;\r\n    const d = this._ceRay.direction;\r\n    const o = this._ceRay.origin;\r\n    const x = d.x * d.x + d.y * d.y;\r\n    const y = c1 * o.x * d.x + c1 * o.y * d.y;\r\n    const z = o.x * o.x + o.y * o.y - 1;\r\n    const v1 = c2 * x * z;\r\n    const v2 = y * y;\r\n    const nothingFound = v1 > v2;\r\n    if (nothingFound) {\r\n      return null;\r\n    }\r\n    const v3 = c1 * x;\r\n    const v4 = Math.sqrt(v2 - v1);\r\n    const factorA = (-y + v4) / v3;\r\n    const factorB = (-y - v4) / v3;\r\n    return { factorA, factorB };\r\n  }\r\n\r\n  private static computeCircleExtrusionRaycast(\r\n    distance: number,\r\n    radius: number,\r\n  ) {\r\n    const result = this.computeCircleExtrusionRaycastFactors();\r\n    if (result === null) {\r\n      return [];\r\n    }\r\n    const { factorA, factorB } = result;\r\n    this._ceInverseTransform.transpose();\r\n    this._ceRaycastPoints = [];\r\n    this.computeCircleExtrusionRaycastPoints(factorA, distance, radius);\r\n    this.computeCircleExtrusionRaycastPoints(factorB, distance, radius);\r\n    return this._ceRaycastPoints;\r\n  }\r\n\r\n  private static setupCircleExtrusionRay(ray: THREE.Ray) {\r\n    this._ceInverseTransform.copy(this._ceTransform);\r\n    this._ceInverseTransform.invert();\r\n    this._ceRay.copy(ray);\r\n    this._ceRay.applyMatrix4(this._ceInverseTransform);\r\n  }\r\n\r\n  private static computeCircleExtrusionRaycastPoints(\r\n    factor: number,\r\n    size: number,\r\n    radius: number,\r\n  ) {\r\n    const clashes = this.checkIfCircleExtrusionClashes(factor, size, radius);\r\n    if (!clashes) return;\r\n    this._ceRaycastPoint.applyMatrix4(this._ceTransform);\r\n    const point = this._ceRaycastPoint.clone();\r\n    this._ceRaycastPoints.push({ point });\r\n  }\r\n\r\n  private static setupCircleExtrusionAxes(\r\n    last: THREE.Vector3,\r\n    first: THREE.Vector3,\r\n  ) {\r\n    this._ceAxisZ.copy(last);\r\n    this._ceAxisZ.sub(first);\r\n    this._ceAxisZ.normalize();\r\n    this.computeNormal(this._ceAxisZ, this._ceAxisX);\r\n    this._ceAxisY.crossVectors(this._ceAxisZ, this._ceAxisX);\r\n  }\r\n\r\n  private static computeNormal(source: THREE.Vector3, target: THREE.Vector3) {\r\n    const threshold = 0.9;\r\n    const dot = source.dot(this._ceAbsoluteX);\r\n    const absDot = Math.abs(dot);\r\n    const isLookingAtX = absDot > threshold;\r\n    const v = isLookingAtX ? this._ceAbsoluteZ : this._ceAbsoluteX;\r\n    target.crossVectors(source, v);\r\n    target.normalize();\r\n  }\r\n\r\n  private static setupCircleExtrusionRaycastPoint(factor: number) {\r\n    this._ceRaycastPoint.copy(this._ceRay.direction);\r\n    this._ceRaycastPoint.normalize();\r\n    this._ceRaycastPoint.multiplyScalar(factor);\r\n    this._ceRaycastPoint.add(this._ceRay.origin);\r\n  }\r\n\r\n  private static checkIfCircleExtrusionClashes(\r\n    factor: number,\r\n    size: number,\r\n    radius: number,\r\n  ) {\r\n    this.setupCircleExtrusionRaycastPoint(factor);\r\n    const rel = size / radius;\r\n    const z = this._ceRaycastPoint.z;\r\n    const clashes = z >= 0 && z <= rel;\r\n    return clashes;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\n\r\nimport {\r\n  Axis,\r\n  AxisPartClass,\r\n  WireSet,\r\n  CircleCurve,\r\n  CircleExtrusion,\r\n} from \"../../../../../Schema\";\r\nimport { VceCasterUtils } from \"./vce-caster-utils\";\r\nimport { limitOf2Bytes } from \"../../../model/model-types\";\r\n\r\ntype AxisPartData = {\r\n  indices: number;\r\n  points: number;\r\n  faces: number;\r\n  links: number;\r\n};\r\n\r\ntype PathData = {\r\n  center: THREE.Vector3;\r\n  last: THREE.Vector3;\r\n  axis: THREE.Vector3;\r\n  first: THREE.Vector3;\r\n  cuts: THREE.Vector3[];\r\n  mids: THREE.Vector3[];\r\n};\r\n\r\nexport class VceUtils {\r\n  static readonly up = new THREE.Vector3(0, 0, 1);\r\n  static circleCurves: THREE.Vector3[] = [];\r\n  static circleCurvePoints: THREE.Vector3[];\r\n\r\n  static temp = {\r\n    circleExtrusion: new CircleExtrusion(),\r\n    circleCurve: new CircleCurve(),\r\n    wireSet: new WireSet(),\r\n    axis: new Axis(),\r\n    rotation: new THREE.Quaternion(),\r\n    vector: new THREE.Vector3(),\r\n  };\r\n\r\n  private static readonly _wireSize = 6;\r\n  private static readonly _minSize = 6;\r\n  private static readonly _maxSize = 30;\r\n  private static readonly _axisPartSize = {\r\n    verticesLength: 0,\r\n    indicesLength: 0,\r\n  };\r\n\r\n  static newPaths(circleCurve: CircleCurve, size: number) {\r\n    const data: PathData = VceUtils.newPathData();\r\n    this.fetchCircleCurveData(circleCurve, data);\r\n    this.fetchCircleCurveMids(size, data, circleCurve);\r\n    this.fetchCircleCurveEnds(data, circleCurve);\r\n    this.fetchCircleCurveCuts(data);\r\n    return data.cuts;\r\n  }\r\n\r\n  static getAxisPartSize(axis: Axis, id: number, vertexSize: number) {\r\n    const part = axis.parts(id)!;\r\n    const order = axis.order(id)!;\r\n    const data = VceUtils.getAxisPartData(part, vertexSize, axis, order);\r\n    VceUtils.fetchAxisPartSize(vertexSize, data);\r\n    return this._axisPartSize;\r\n  }\r\n\r\n  static vertexLength(radius: number, factor: number = 200) {\r\n    const count = Math.round(radius * factor);\r\n    const clamped = Math.max(count, VceUtils._minSize);\r\n    return Math.min(clamped, VceUtils._maxSize);\r\n  }\r\n\r\n  static setPathVertices(vertexSize: number) {\r\n    const points = this.circleCurvePoints;\r\n    const noPoints = !points;\r\n    const pointsChanged = points && points.length !== vertexSize;\r\n    if (noPoints || pointsChanged) {\r\n      this.circleCurvePoints = [];\r\n      for (let i = 0; i < vertexSize; i++) {\r\n        const halfCircle = 2 * Math.PI;\r\n        const value = halfCircle * i;\r\n        const angle = value / vertexSize;\r\n        const sin = Math.sin(angle);\r\n        const cos = Math.cos(angle);\r\n        const result = new THREE.Vector3(sin, cos, 0);\r\n        this.circleCurvePoints.push(result);\r\n      }\r\n    }\r\n  }\r\n\r\n  private static fetchCircleCurveEnds(\r\n    data: PathData,\r\n    circleCurve: CircleCurve,\r\n  ) {\r\n    data.last.copy(data.first);\r\n    data.last.applyAxisAngle(data.axis, circleCurve.aperture());\r\n    data.last.multiplyScalar(circleCurve.radius());\r\n    data.last.add(data.center);\r\n    data.first.multiplyScalar(circleCurve.radius());\r\n    data.first.add(data.center);\r\n  }\r\n\r\n  private static getAxisPartData(\r\n    part: AxisPartClass,\r\n    vertexSize: number,\r\n    axis: Axis,\r\n    order: number,\r\n  ) {\r\n    const data = {\r\n      [AxisPartClass.WIRE]: this.getAxisPartWireData,\r\n      [AxisPartClass.WIRE_SET]: this.getAxisPartWireSetData,\r\n      [AxisPartClass.CIRCLE_CURVE]: this.getAxisPartCircleCurveData,\r\n    };\r\n    return data[part as keyof typeof data](axis, order, vertexSize);\r\n  }\r\n\r\n  private static newEmptyAxisPartData() {\r\n    return {\r\n      indices: 0,\r\n      points: 0,\r\n      faces: 0,\r\n      links: 0,\r\n    } as AxisPartData;\r\n  }\r\n\r\n  private static getAxisPartWireSetData = (\r\n    axis: Axis,\r\n    order: number,\r\n    size: number,\r\n  ) => {\r\n    const defValue = 2;\r\n    const data = this.newEmptyAxisPartData();\r\n    axis.wireSets(order, this.temp.wireSet);\r\n    const wires = this.temp.wireSet.psLength() - 1;\r\n    data.points = wires * defValue * size;\r\n    data.indices = this._wireSize * wires * size;\r\n    data.faces = wires * defValue;\r\n    return data;\r\n  };\r\n\r\n  private static fetchCircleCurveMids(\r\n    size: number,\r\n    data: PathData,\r\n    circleCurve: CircleCurve,\r\n  ) {\r\n    const count = size - 2;\r\n    for (let i = 0; i < count; i++) {\r\n      const newMid = new THREE.Vector3();\r\n      newMid.copy(data.first);\r\n      const aperture = circleCurve.aperture();\r\n      const fraction = size - 1;\r\n      const totalAngle = aperture * (i + 1);\r\n      const angle = totalAngle / fraction;\r\n      newMid.applyAxisAngle(data.axis, angle);\r\n      newMid.multiplyScalar(circleCurve.radius());\r\n      newMid.add(data.center);\r\n      data.mids[i] = newMid;\r\n    }\r\n  }\r\n\r\n  private static getAxisPartWireData = (\r\n    _axis: Axis,\r\n    _order: number,\r\n    size: number,\r\n  ) => {\r\n    const data = this.newEmptyAxisPartData();\r\n    data.points = 2 * size;\r\n    data.indices = this._wireSize * size;\r\n    data.faces = 2;\r\n    return data;\r\n  };\r\n\r\n  static validSize(\r\n    pointsSize: number,\r\n    extraPoints: number,\r\n    vertexSize: number,\r\n  ) {\r\n    const totalSize = pointsSize + extraPoints + vertexSize;\r\n    return limitOf2Bytes >= totalSize;\r\n  }\r\n\r\n  private static fetchCircleCurveCuts(data: PathData) {\r\n    data.cuts.push(data.first);\r\n    data.cuts.push(...data.mids);\r\n    data.cuts.push(data.last);\r\n  }\r\n\r\n  private static fetchCircleCurveData(\r\n    circleCurve: CircleCurve,\r\n    data: PathData,\r\n  ) {\r\n    const pos = circleCurve.position()!;\r\n    data.center.set(pos.x(), pos.y(), pos.z());\r\n    const xDir = circleCurve.xDirection()!;\r\n    data.axis.set(xDir.x(), xDir.y(), xDir.z());\r\n    const yDir = circleCurve.yDirection()!;\r\n    data.first.set(yDir.x(), yDir.y(), yDir.z());\r\n  }\r\n\r\n  private static newPathData() {\r\n    return {\r\n      axis: new THREE.Vector3(),\r\n      cuts: [],\r\n      center: new THREE.Vector3(),\r\n      last: new THREE.Vector3(),\r\n      first: new THREE.Vector3(),\r\n      mids: [],\r\n    } as PathData;\r\n  }\r\n\r\n  private static fetchAxisPartSize(vertexSize: number, data: AxisPartData) {\r\n    const indexFactor = vertexSize - 2;\r\n    const coordsCount = 3;\r\n    const indices = data.faces * indexFactor * coordsCount;\r\n    const links = data.links * vertexSize * this._wireSize;\r\n    this._axisPartSize.verticesLength = data.points;\r\n    this._axisPartSize.indicesLength = data.indices + indices + links;\r\n  }\r\n\r\n  private static getAxisPartCircleCurveData = (\r\n    axis: Axis,\r\n    order: number,\r\n    size: number,\r\n  ) => {\r\n    const data = this.newEmptyAxisPartData();\r\n    axis.circleCurves(order, this.temp.circleCurve);\r\n    const bends = VceCasterUtils.circleCurve3Divisions(this.temp.circleCurve);\r\n    const pointCount = size * bends;\r\n    data.points = pointCount;\r\n    const indexFactor = size * (bends - 1);\r\n    const indexCount = this._wireSize * indexFactor;\r\n    data.indices = indexCount;\r\n    const defValue = 2;\r\n    data.faces = defValue;\r\n    data.links = defValue;\r\n    return data;\r\n  };\r\n}\r\n","import * as THREE from \"three\";\r\nimport {\r\n  Axis,\r\n  AxisPartClass,\r\n  CircleCurve,\r\n  CircleExtrusion,\r\n  Wire,\r\n  WireSet,\r\n  FloatVector,\r\n} from \"../../../../../Schema\";\r\nimport { normalizationValue, TileBasicData, TileData } from \"../types\";\r\nimport { LinkPoint } from \"./types\";\r\nimport { VceUtils } from \"./vce-utils\";\r\nimport { VceCasterUtils } from \"./vce-caster-utils\";\r\nimport { ObjectClass } from \"../../../model/model-types\";\r\n\r\nexport class VceConstructor {\r\n  private readonly _minLinkDistance = 1 / 100000000;\r\n\r\n  private _first = new THREE.Vector3();\r\n  private _last = new THREE.Vector3();\r\n  private _currentPoint!: number;\r\n  private _currentIndex!: number;\r\n  private _v1 = new THREE.Vector3();\r\n  private _v2 = new THREE.Vector3();\r\n  private _v3 = new THREE.Vector3();\r\n  private _v4 = new THREE.Vector3();\r\n  private _tempLine = new THREE.Line3();\r\n  private _total = 0;\r\n  private _closest = 0;\r\n  private _result = 0;\r\n\r\n  newTemplate(ce: CircleExtrusion, id: number, templates: TileBasicData[]) {\r\n    const width = ce.radius(id) as number;\r\n    const axis = ce.axes(id, VceUtils.temp.axis) as Axis;\r\n    const vertexAmount = VceUtils.vertexLength(width);\r\n    const lastIndex = templates.length - 1;\r\n    let data = templates[lastIndex];\r\n    const count = axis.orderLength();\r\n    for (let i = 0; i < count; i++) {\r\n      data = this.generateTemplate(axis, i, vertexAmount, data, templates);\r\n    }\r\n  }\r\n\r\n  construct(circleExtrusion: CircleExtrusion, meshData: TileData[]) {\r\n    const linkPoint = {} as LinkPoint;\r\n    const data: TileData = undefined as any;\r\n    const position = 0;\r\n    let pointAmount = 0;\r\n    for (let i = 0, l = circleExtrusion.axesLength(); i < l; i++) {\r\n      const width = circleExtrusion.radius(i) as number;\r\n      circleExtrusion.axes(i, VceUtils.temp.axis);\r\n      const transvSize = VceUtils.vertexLength(width);\r\n      pointAmount = this.constructVce(\r\n        transvSize,\r\n        linkPoint,\r\n        data,\r\n        pointAmount,\r\n        position,\r\n        meshData,\r\n        width,\r\n      );\r\n    }\r\n  }\r\n\r\n  private getTemplateCreationData(\r\n    data: TileBasicData,\r\n    axisPartDimension: { verticesLength: number; indicesLength: number },\r\n    vertexAmount: number,\r\n  ) {\r\n    const isStart = !data;\r\n    let fits = false;\r\n    if (!isStart) {\r\n      const pointAmount = data.positionCount! / 3;\r\n      const extraPoints = axisPartDimension.verticesLength;\r\n      fits = VceUtils.validSize(pointAmount, extraPoints, vertexAmount);\r\n    }\r\n    return { isStart, fits };\r\n  }\r\n\r\n  private generateTemplate(\r\n    axis: Axis,\r\n    id: number,\r\n    vertexAmount: number,\r\n    data: TileBasicData,\r\n    templates: TileBasicData[],\r\n  ) {\r\n    const axisPartDimension = VceUtils.getAxisPartSize(axis, id, vertexAmount);\r\n\r\n    const { isStart, fits } = this.getTemplateCreationData(\r\n      data,\r\n      axisPartDimension,\r\n      vertexAmount,\r\n    );\r\n\r\n    const needsToGenerateNew = isStart || !fits;\r\n    if (needsToGenerateNew) {\r\n      data = this.newTemplateData();\r\n      templates.push(data);\r\n      this.savePrevious(isStart, id, vertexAmount, data);\r\n    }\r\n    data.positionCount! += axisPartDimension.verticesLength * 3;\r\n    data.normalCount! += axisPartDimension.verticesLength * 3;\r\n    data.indexCount! += axisPartDimension.indicesLength;\r\n    return data;\r\n  }\r\n\r\n  private savePrevious(\r\n    isStart: boolean,\r\n    id: number,\r\n    amount: number,\r\n    data: TileBasicData,\r\n  ) {\r\n    const vFactor = 3;\r\n    const vOffset = 2;\r\n    const needsSavePreviousData = !isStart && id !== 0;\r\n    if (needsSavePreviousData) {\r\n      const extraIndices = (amount - vOffset) * vFactor;\r\n      data.positionCount! += amount * vFactor;\r\n      data.normalCount! += amount * vFactor;\r\n      data.indexCount! += extraIndices;\r\n    }\r\n  }\r\n\r\n  private constructNewVce(\r\n    data: TileData,\r\n    axisPartSize: { verticesLength: number; indicesLength: number },\r\n    pointAmount: number,\r\n    transvSize: number,\r\n    meshData: TileData[],\r\n    position: number,\r\n    id: number,\r\n  ) {\r\n    const isStart = !data;\r\n    let fits = false;\r\n    if (!isStart) {\r\n      const extraPoints = axisPartSize.verticesLength;\r\n      fits = VceUtils.validSize(pointAmount, extraPoints, transvSize);\r\n    }\r\n    const needsNew = isStart || !fits;\r\n\r\n    if (needsNew) {\r\n      data = meshData[position++];\r\n      this.setupNewVceBuffers(data);\r\n      const pastOffset = this._currentPoint;\r\n      pointAmount = this.clearOffset(pointAmount);\r\n      const needsCopyPastData = !isStart && id !== 0;\r\n      if (needsCopyPastData) {\r\n        const pastData = meshData[position - 2];\r\n        this.getClone(pastData, data, pastOffset, transvSize);\r\n        pointAmount += transvSize;\r\n      }\r\n    }\r\n    return { data, pointAmount, position };\r\n  }\r\n\r\n  private constructVce(\r\n    transvSize: number,\r\n    linkPoint: LinkPoint,\r\n    data: TileData,\r\n    pointAmount: number,\r\n    position: number,\r\n    meshData: TileData[],\r\n    width: number,\r\n  ) {\r\n    const count = VceUtils.temp.axis.orderLength();\r\n    for (let i = 0; i < count; i++) {\r\n      const axis = VceUtils.temp.axis;\r\n      const axisPartSize = VceUtils.getAxisPartSize(axis, i, transvSize);\r\n\r\n      this.setupLink(i, linkPoint);\r\n      ({ data, pointAmount, position } = this.constructNewVce(\r\n        data,\r\n        axisPartSize,\r\n        pointAmount,\r\n        transvSize,\r\n        meshData,\r\n        position,\r\n        i,\r\n      ));\r\n\r\n      this.newAxisPart(\r\n        VceUtils.temp.axis,\r\n        i,\r\n        data!,\r\n        width,\r\n        transvSize,\r\n        linkPoint,\r\n      );\r\n\r\n      pointAmount += axisPartSize.verticesLength;\r\n    }\r\n    return pointAmount;\r\n  }\r\n\r\n  private newTemplateData() {\r\n    return {\r\n      objectClass: ObjectClass.SHELL,\r\n      indexCount: 0,\r\n      positionCount: 0,\r\n      normalCount: 0,\r\n    };\r\n  }\r\n\r\n  private setupNewVceBuffers(data: TileData) {\r\n    data.positionBuffer = new Float32Array(data.positionCount!);\r\n    data.normalBuffer = new Int16Array(data.normalCount!);\r\n    data.indexBuffer = new Uint16Array(data.indexCount!);\r\n  }\r\n\r\n  private clearOffset(pointAmount: number) {\r\n    this._currentPoint = 0;\r\n    this._currentIndex = 0;\r\n    pointAmount = 0;\r\n    return pointAmount;\r\n  }\r\n\r\n  private getClone(inp: TileData, out: TileData, last: number, size: number) {\r\n    const start = size * -3;\r\n    for (let i = start; i < 0; i++) {\r\n      const oPoints = out.positionBuffer!;\r\n      const iPoints = inp.positionBuffer!;\r\n      const oNorm = out.normalBuffer!;\r\n      const iNorm = inp.normalBuffer!;\r\n      oPoints[this._currentPoint] = iPoints![last + i];\r\n      oNorm[this._currentPoint] = iNorm[last + i];\r\n      this._currentPoint++;\r\n    }\r\n  }\r\n\r\n  private manageAxisPartCreation(\r\n    axisPartClass: AxisPartClass | null,\r\n    axis: Axis,\r\n    position: number,\r\n    radius: number,\r\n    virtualMesh: TileData,\r\n    vertexSize: number,\r\n    linkPoint: LinkPoint,\r\n  ) {\r\n    if (axisPartClass === AxisPartClass.CIRCLE_CURVE) {\r\n      const current = axis.circleCurves(position)!;\r\n      this.newCircleCurve(current, radius, virtualMesh, vertexSize, linkPoint);\r\n      return;\r\n    }\r\n\r\n    if (axisPartClass === AxisPartClass.WIRE_SET) {\r\n      const current = axis.wireSets(position)!;\r\n      this.newWireSet(current, radius, virtualMesh, vertexSize, linkPoint);\r\n      return;\r\n    }\r\n\r\n    if (axisPartClass === AxisPartClass.WIRE) {\r\n      const current = axis.wires(position)!;\r\n      this.newWire(current, radius, virtualMesh, vertexSize, linkPoint);\r\n    }\r\n  }\r\n\r\n  private newWireSetStart(\r\n    i: number,\r\n    virtualMesh: TileData,\r\n    vertexSize: number,\r\n    linkPoint: LinkPoint,\r\n  ) {\r\n    if (i === 1) {\r\n      this.linkStart(\r\n        virtualMesh,\r\n        vertexSize,\r\n        linkPoint,\r\n        this._first,\r\n        AxisPartClass.WIRE_SET,\r\n      );\r\n    } else {\r\n      this.newPathOrderData(virtualMesh, vertexSize);\r\n    }\r\n  }\r\n\r\n  private newWireSet(\r\n    wireSet: WireSet,\r\n    radius: number,\r\n    virtualMesh: TileData,\r\n    vertexSize: number,\r\n    linkPoint: LinkPoint,\r\n  ): void {\r\n    for (let i = 1, length = wireSet.psLength(); i < length; i++) {\r\n      const rot = VceUtils.temp.rotation;\r\n      this.getWireSetPoints(wireSet, i);\r\n      this.setWireSetVector();\r\n      this.newPath(this._first, radius, rot, virtualMesh, vertexSize);\r\n      this.newWireSetStart(i, virtualMesh, vertexSize, linkPoint);\r\n      this.newPath(this._last, radius, rot, virtualMesh, vertexSize);\r\n      this.fillWireSetData(i, length, linkPoint, virtualMesh, vertexSize);\r\n      this.linkPaths(virtualMesh, vertexSize);\r\n    }\r\n  }\r\n\r\n  private fillWireSetData(\r\n    i: number,\r\n    length: number,\r\n    linkPoint: LinkPoint,\r\n    virtualMesh: TileData,\r\n    vertexSize: number,\r\n  ) {\r\n    if (i !== length - 1 || linkPoint.last) {\r\n      this.newPathOrderData(virtualMesh, vertexSize, true);\r\n    } else {\r\n      linkPoint.placement = this._last;\r\n      linkPoint.axisClass = AxisPartClass.WIRE_SET;\r\n    }\r\n  }\r\n\r\n  private setWireSetVector() {\r\n    VceUtils.temp.vector.copy(this._last);\r\n    VceUtils.temp.vector.sub(this._first);\r\n    VceUtils.temp.vector.normalize();\r\n    VceUtils.temp.rotation.setFromUnitVectors(\r\n      VceUtils.up,\r\n      VceUtils.temp.vector,\r\n    );\r\n  }\r\n\r\n  private newCircleCurveBody(\r\n    count: number,\r\n    radius: number,\r\n    virtualMesh: TileData,\r\n    vertexSize: number,\r\n  ) {\r\n    const amount = count - 2;\r\n    for (let i = 0; i < amount; i++) {\r\n      const c1 = VceUtils.circleCurves[i];\r\n      const c2 = VceUtils.circleCurves[i + 1];\r\n      const c3 = VceUtils.circleCurves[i + 2];\r\n      const vec = VceUtils.temp.vector;\r\n      vec.copy(c3);\r\n      vec.sub(c1);\r\n      vec.normalize();\r\n      VceUtils.temp.rotation.setFromUnitVectors(VceUtils.up, vec);\r\n      this.newPath(c2, radius, VceUtils.temp.rotation, virtualMesh, vertexSize);\r\n      this.linkPaths(virtualMesh, vertexSize, true);\r\n    }\r\n  }\r\n\r\n  private newCircleCurveFinish(\r\n    count: number,\r\n    radius: number,\r\n    mesh: TileData,\r\n    vertexSize: number,\r\n    linkPoint: LinkPoint,\r\n  ) {\r\n    const pos1 = count - 2;\r\n    const pos2 = count - 1;\r\n    const c1 = VceUtils.circleCurves[pos1];\r\n    const c2 = VceUtils.circleCurves[pos2];\r\n    const vec = VceUtils.temp.vector;\r\n    vec.copy(c2);\r\n    vec.sub(c1);\r\n    vec.normalize();\r\n    VceUtils.temp.rotation.setFromUnitVectors(VceUtils.up, vec);\r\n    this.newPath(c2, radius, VceUtils.temp.rotation, mesh, vertexSize);\r\n    if (linkPoint.last) {\r\n      this.newPathOrderData(mesh, vertexSize, true);\r\n      return;\r\n    }\r\n    linkPoint.placement = VceUtils.circleCurves[pos2];\r\n    linkPoint.axisClass = AxisPartClass.CIRCLE_CURVE;\r\n  }\r\n\r\n  private setupLink(id: number, linkPoint: LinkPoint) {\r\n    if (id === 0) {\r\n      linkPoint.first = true;\r\n    }\r\n    const count = VceUtils.temp.axis.orderLength();\r\n    if (id === count - 1) {\r\n      linkPoint.last = true;\r\n    }\r\n  }\r\n\r\n  private newCircleCurveStart(\r\n    radius: number,\r\n    virtualMesh: TileData,\r\n    vertexSize: number,\r\n    linkPoint: LinkPoint,\r\n  ) {\r\n    const c1 = VceUtils.circleCurves[0];\r\n    const c2 = VceUtils.circleCurves[1];\r\n    const vec = VceUtils.temp.vector;\r\n    vec.copy(c2);\r\n    vec.sub(c1);\r\n    vec.normalize();\r\n    VceUtils.temp.rotation.setFromUnitVectors(VceUtils.up, vec);\r\n    this.newPath(c1, radius, VceUtils.temp.rotation, virtualMesh, vertexSize);\r\n    const aClass = AxisPartClass.CIRCLE_CURVE;\r\n    this.linkStart(virtualMesh, vertexSize, linkPoint, c1, aClass);\r\n  }\r\n\r\n  private getWireSetPoints(wireSet: WireSet, i: number) {\r\n    const p1 = wireSet.ps(i - 1) as FloatVector;\r\n    this._first.set(p1.x(), p1.y(), p1.z());\r\n    const p2 = wireSet.ps(i) as FloatVector;\r\n    this._last.set(p2.x(), p2.y(), p2.z());\r\n  }\r\n\r\n  private finishWire(\r\n    radius: number,\r\n    mesh: TileData,\r\n    vertexSize: number,\r\n    linkPoint: LinkPoint,\r\n  ) {\r\n    this.newPath(this._last, radius, VceUtils.temp.rotation, mesh, vertexSize);\r\n    if (linkPoint.last) {\r\n      this.newPathOrderData(mesh, vertexSize, true);\r\n    } else {\r\n      linkPoint.placement = this._last;\r\n      linkPoint.axisClass = AxisPartClass.WIRE;\r\n    }\r\n    this.linkPaths(mesh, vertexSize);\r\n  }\r\n\r\n  private linkPaths(\r\n    mesh: TileData,\r\n    vertexSize: number,\r\n    getLinked: boolean = false,\r\n  ): void {\r\n    const s = vertexSize;\r\n    const { p1, p2, p3 } = this.getPathPositions(s, getLinked, mesh);\r\n\r\n    const index = mesh.indexBuffer!;\r\n    for (let i = 0; i < s; i++) {\r\n      const i0 = (i + 1) % s;\r\n      const { i3, i4, i1, i2 } = this.getLinkPathIndices(p3, i, p1, s, i0, p2);\r\n      index[this._currentIndex++] = i3;\r\n      index[this._currentIndex++] = i4;\r\n      index[this._currentIndex++] = i1;\r\n      index[this._currentIndex++] = i1;\r\n      index[this._currentIndex++] = i4;\r\n      index[this._currentIndex++] = i2;\r\n    }\r\n  }\r\n\r\n  private startWire(\r\n    radius: number,\r\n    mesh: TileData,\r\n    vertexSize: number,\r\n    linkPoint: LinkPoint,\r\n  ) {\r\n    this.newPath(this._first, radius, VceUtils.temp.rotation, mesh, vertexSize);\r\n    const aClass = AxisPartClass.WIRE;\r\n    this.linkStart(mesh, vertexSize, linkPoint, this._first, aClass);\r\n  }\r\n\r\n  private setupWireVectors() {\r\n    const vec = VceUtils.temp.vector;\r\n    vec.copy(this._last);\r\n    vec.sub(this._first);\r\n    vec.normalize();\r\n    VceUtils.temp.rotation.setFromUnitVectors(VceUtils.up, vec);\r\n  }\r\n\r\n  private getLinkPathIndices(\r\n    p3: number,\r\n    i: number,\r\n    p1: number,\r\n    s: number,\r\n    i0: number,\r\n    p2: number,\r\n  ) {\r\n    let i1 = 0;\r\n    let i2 = 0;\r\n    let i3 = 0;\r\n    let i4 = 0;\r\n\r\n    if (p3 + i >= p1) {\r\n      i1 = p3 + i - s;\r\n    } else {\r\n      i1 = p3 + i;\r\n    }\r\n\r\n    if (p3 + i0 >= p1) {\r\n      i2 = p3 + i0 - s;\r\n    } else {\r\n      i2 = p3 + i0;\r\n    }\r\n\r\n    if (p2 + i >= p1 + s) {\r\n      i3 = p2 + i - s;\r\n    } else {\r\n      i3 = p2 + i;\r\n    }\r\n\r\n    if (p2 + i0 >= p1 + s) {\r\n      i4 = p2 + i0 - s;\r\n    } else {\r\n      i4 = p2 + i0;\r\n    }\r\n    return { i3, i4, i1, i2 };\r\n  }\r\n\r\n  private fetchWirePoints(wire: Wire) {\r\n    const p1 = wire.p1() as FloatVector;\r\n    const p2 = wire.p2() as FloatVector;\r\n    this._first.set(p1.x(), p1.y(), p1.z());\r\n    this._last.set(p2.x(), p2.y(), p2.z());\r\n  }\r\n\r\n  private findLinkedVertex(\r\n    selected: number,\r\n    limit: number,\r\n    mesh: TileData,\r\n    size: number,\r\n    offset: number,\r\n  ) {\r\n    for (let i = selected; i < limit; i++) {\r\n      this.point(i, mesh, this._v1);\r\n      const pos = i - size + offset;\r\n      const p1 = pos >= selected ? pos - size : pos;\r\n      this.point(p1, mesh, this._v2);\r\n      const p2 = pos + 1 >= selected ? pos + 1 - size : pos + 1;\r\n      this.point(p2, mesh, this._v3);\r\n      this._tempLine.set(this._v2, this._v3);\r\n      this._tempLine.closestPointToPoint(this._v1, true, this._v4);\r\n      this._total += this._v4.distanceTo(this._v1);\r\n    }\r\n  }\r\n\r\n  private newPath(\r\n    point: THREE.Vector3,\r\n    radius: number,\r\n    rotation: THREE.Quaternion,\r\n    mesh: TileData,\r\n    vertexSize: number,\r\n  ) {\r\n    VceUtils.setPathVertices(vertexSize);\r\n    const pathStep = 3;\r\n    for (let i = 0; i < vertexSize; i++) {\r\n      this.setPathPosition(i, radius, rotation, point, mesh);\r\n      this.setPathNormal(i, rotation, mesh);\r\n      this._currentPoint += pathStep;\r\n    }\r\n  }\r\n\r\n  private linkStart(\r\n    mesh: TileData,\r\n    vertexSize: number,\r\n    linkPoint: LinkPoint,\r\n    position: THREE.Vector3,\r\n    partClass: AxisPartClass,\r\n  ): void {\r\n    const isStart = linkPoint.first;\r\n    if (isStart) {\r\n      this.newPathOrderData(mesh, vertexSize);\r\n      return;\r\n    }\r\n\r\n    const curveClass = AxisPartClass.CIRCLE_CURVE;\r\n    const isCircle1 = linkPoint.axisClass === curveClass;\r\n    const isCircle2 = partClass === curveClass;\r\n    const compatible = isCircle1 || isCircle2;\r\n    const distance = linkPoint.placement.distanceToSquared(position);\r\n    const isLinked = distance < this._minLinkDistance;\r\n    if (!compatible || !isLinked) {\r\n      this.newPathOrderData(mesh, vertexSize, true, true);\r\n      this.newPathOrderData(mesh, vertexSize);\r\n      return;\r\n    }\r\n\r\n    this.linkPaths(mesh, vertexSize, true);\r\n  }\r\n\r\n  private setPathPosition(\r\n    id: number,\r\n    radius: number,\r\n    rotation: THREE.Quaternion,\r\n    point: THREE.Vector3,\r\n    mesh: TileData,\r\n  ) {\r\n    const vec = VceUtils.temp.vector;\r\n    vec.copy(VceUtils.circleCurvePoints[id]);\r\n    vec.multiplyScalar(radius);\r\n    vec.applyQuaternion(rotation);\r\n    vec.add(point);\r\n\r\n    const pos = mesh.positionBuffer!;\r\n    const location1 = this._currentPoint;\r\n    const location2 = this._currentPoint + 1;\r\n    const location3 = this._currentPoint + 2;\r\n\r\n    pos[location1] = vec.x;\r\n    pos[location2] = vec.y;\r\n    pos[location3] = vec.z;\r\n  }\r\n\r\n  private newWire(\r\n    wire: Wire,\r\n    radius: number,\r\n    mesh: TileData,\r\n    vertexSize: number,\r\n    linkPoint: LinkPoint,\r\n  ): void {\r\n    this.fetchWirePoints(wire);\r\n    this.setupWireVectors();\r\n    this.startWire(radius, mesh, vertexSize, linkPoint);\r\n    this.finishWire(radius, mesh, vertexSize, linkPoint);\r\n  }\r\n\r\n  private newCircleCurve(\r\n    circleCurve: CircleCurve,\r\n    radius: number,\r\n    mesh: TileData,\r\n    vertexSize: number,\r\n    linkPoint: LinkPoint,\r\n  ): void {\r\n    const count = VceCasterUtils.circleCurve3Divisions(circleCurve);\r\n    VceUtils.circleCurves = VceUtils.newPaths(circleCurve, count);\r\n    this.newCircleCurveStart(radius, mesh, vertexSize, linkPoint);\r\n    this.newCircleCurveBody(count, radius, mesh, vertexSize);\r\n    this.newCircleCurveFinish(count, radius, mesh, vertexSize, linkPoint);\r\n    this.linkPaths(mesh, vertexSize, true);\r\n  }\r\n\r\n  private newPathOrderData(\r\n    mesh: TileData,\r\n    vertexSize: number,\r\n    reverse: boolean = false,\r\n    past: boolean = false,\r\n  ) {\r\n    const step1 = 1;\r\n    const step2 = 2;\r\n    const count = vertexSize - 2;\r\n    const index = mesh.indexBuffer!;\r\n    for (let i = 0; i < count; i++) {\r\n      const p = this._currentPoint / 3;\r\n      const rawOffset = past ? step2 : step1;\r\n      const offset = vertexSize * rawOffset;\r\n      const indexValue1 = p - offset;\r\n      index[this._currentIndex] = indexValue1;\r\n      this._currentIndex++;\r\n      const offset2 = reverse ? step2 : step1;\r\n      const indexValue2 = p + i + offset2 - offset;\r\n      index[this._currentIndex] = indexValue2;\r\n      this._currentIndex++;\r\n      const offset3 = reverse ? step1 : step2;\r\n      const indexValue3 = p + i + offset3 - offset;\r\n      index[this._currentIndex] = indexValue3;\r\n      this._currentIndex++;\r\n    }\r\n  }\r\n\r\n  private getPathPositions(\r\n    vertexSize: number,\r\n    getLinked: boolean,\r\n    mesh: TileData,\r\n  ) {\r\n    const p1 = this._currentPoint / 3 - vertexSize;\r\n    const p2 = p1;\r\n    let p3 = p1 - vertexSize;\r\n    if (getLinked) {\r\n      p3 = this.fetchLinkedVertex(p1, mesh, vertexSize);\r\n    }\r\n    return { p3, p1, p2 };\r\n  }\r\n\r\n  private newAxisPart(\r\n    axis: Axis,\r\n    id: number,\r\n    virtualMesh: TileData,\r\n    radius: number,\r\n    vertexSize: number,\r\n    linkPoint: LinkPoint,\r\n  ): void {\r\n    const axisPartClass = axis.parts(id);\r\n    const position = axis.order(id)!;\r\n    this.manageAxisPartCreation(\r\n      axisPartClass,\r\n      axis,\r\n      position,\r\n      radius,\r\n      virtualMesh,\r\n      vertexSize,\r\n      linkPoint,\r\n    );\r\n    linkPoint.first = false;\r\n    linkPoint.last = false;\r\n  }\r\n\r\n  private fetchLinkedVertex(selected: number, mesh: TileData, size: number) {\r\n    this._closest = Number.MAX_VALUE;\r\n    for (let i = 0; i < size; i++) {\r\n      this._total = 0;\r\n      const limit = selected + size;\r\n      this.findLinkedVertex(selected, limit, mesh, size, i);\r\n      const closerFound = this._total < this._closest;\r\n      if (!closerFound) continue;\r\n      this._closest = this._total;\r\n      this._result = selected - size + i + 1;\r\n    }\r\n    return this._result;\r\n  }\r\n\r\n  private setPathNormal(\r\n    id: number,\r\n    rotation: THREE.Quaternion,\r\n    mesh: TileData,\r\n  ) {\r\n    const vec = VceUtils.temp.vector;\r\n    const currentPoint = VceUtils.circleCurvePoints[id];\r\n    vec.copy(currentPoint);\r\n    vec.applyQuaternion(rotation);\r\n    const nor = mesh.normalBuffer!;\r\n\r\n    const location1 = this._currentPoint;\r\n    const location2 = this._currentPoint + 1;\r\n    const location3 = this._currentPoint + 2;\r\n\r\n    nor[location1] = vec.x * normalizationValue;\r\n    nor[location2] = vec.y * normalizationValue;\r\n    nor[location3] = vec.z * normalizationValue;\r\n  }\r\n\r\n  private point(\r\n    selected: number,\r\n    virtualMesh: TileData,\r\n    result: THREE.Vector3,\r\n  ) {\r\n    const pos = virtualMesh.positionBuffer!;\r\n    const ix = selected * 3;\r\n    const iy = selected * 3 + 1;\r\n    const iz = selected * 3 + 2;\r\n    const x = pos[ix];\r\n    const y = pos[iy];\r\n    const z = pos[iz];\r\n    result.set(x, y, z);\r\n    return result;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { Axis, CircleExtrusion, Meshes } from \"../../../../../Schema\";\r\nimport { VceCasterUtils } from \"./vce-caster-utils\";\r\n\r\nexport class VceRaycaster {\r\n  private _meshes: Meshes;\r\n  private _results: any[] = [];\r\n  private _circleExtrusion = new CircleExtrusion();\r\n  private _axis = new Axis();\r\n\r\n  constructor(meshes: Meshes) {\r\n    this._meshes = meshes;\r\n  }\r\n\r\n  raycast(id: number, ray: THREE.Ray) {\r\n    this._results.length = 0;\r\n    this._meshes.circleExtrusions(id, this._circleExtrusion);\r\n    for (let i = 0, l = this._circleExtrusion.axesLength(); i < l; i++) {\r\n      this._circleExtrusion.axes(i, this._axis);\r\n      const radius = this._circleExtrusion.radius(i)!;\r\n      this.traverseAllCurves(ray, radius);\r\n    }\r\n    return this._results;\r\n  }\r\n\r\n  private getTraverseWiresEvent(ray: THREE.Ray, radius: number) {\r\n    return (start: THREE.Vector3, end: THREE.Vector3) => {\r\n      this.castCurveExtrusion(start, end, ray, radius);\r\n    };\r\n  }\r\n\r\n  private castCurveExtrusion(\r\n    a: THREE.Vector3,\r\n    b: THREE.Vector3,\r\n    ray: THREE.Ray,\r\n    radius: number,\r\n  ) {\r\n    const u = VceCasterUtils;\r\n    const result1 = u.raycastCircleExtr(a, b, ray, radius);\r\n    for (const result of result1) {\r\n      this._results.push(result);\r\n    }\r\n  }\r\n\r\n  private getTraverseCircleCurveEvent(ray: THREE.Ray, radius: number) {\r\n    return (\r\n      first: THREE.Vector3,\r\n      mids: THREE.Vector3[],\r\n      last: THREE.Vector3,\r\n    ) => {\r\n      const second = mids[0];\r\n      this.castCurveExtrusion(first, second, ray, radius);\r\n      for (let i = 0; i < mids.length; i++) {\r\n        if (i === 0) continue;\r\n        const first = mids[i - 1];\r\n        const second = mids[i];\r\n        this.castCurveExtrusion(first, second, ray, radius);\r\n      }\r\n      const nextToLast = mids[mids.length - 1];\r\n      this.castCurveExtrusion(nextToLast, last, ray, radius);\r\n    };\r\n  }\r\n\r\n  private traverseAllCurves(ray: THREE.Ray, radius: number) {\r\n    const wireEvent = this.getTraverseWiresEvent(ray, radius);\r\n    VceCasterUtils.traverseWires(this._axis, wireEvent);\r\n    const circleCurveEvent = this.getTraverseCircleCurveEvent(ray, radius);\r\n    const divider = VceCasterUtils.circleCurve3Divisions;\r\n    VceCasterUtils.traverseCircleCurve(this._axis, circleCurveEvent, divider);\r\n    const wireSetEvent = this.getTraverseWiresEvent(ray, radius);\r\n    VceCasterUtils.traverseWireSets(this._axis, wireSetEvent);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { Axis, CircleExtrusion, Meshes } from \"../../../../../Schema\";\r\nimport { VceCasterUtils } from \"./vce-caster-utils\";\r\n\r\nexport class VceLineRaycaster {\r\n  private _meshes: Meshes;\r\n  private _found = [] as any[];\r\n  private _circleExtrusion = new CircleExtrusion();\r\n  private _axis = new Axis();\r\n  private _wirePoint = new THREE.Vector3();\r\n\r\n  constructor(meshes: Meshes) {\r\n    this._meshes = meshes;\r\n  }\r\n\r\n  lineRaycast(id: number, ray: THREE.Ray) {\r\n    this._found.length = 0;\r\n    this._meshes.circleExtrusions(id, this._circleExtrusion);\r\n    const count = this._circleExtrusion.axesLength();\r\n    for (let index = 0; index < count; index++) {\r\n      this._circleExtrusion.axes(index, this._axis);\r\n      this.processLineRaycast(index, ray);\r\n    }\r\n    return this._found;\r\n  }\r\n\r\n  private wireSetRaycast(ray: THREE.Ray, radius?: number) {\r\n    const axis = this._axis;\r\n    VceCasterUtils.traverseWireSets(\r\n      axis,\r\n      (start: THREE.Vector3, end: THREE.Vector3) => {\r\n        this.cylinderRaycast(start, end, ray, radius as any);\r\n      },\r\n    );\r\n  }\r\n\r\n  private exclusiveCylinderRaycast(ray: THREE.Ray, radius: number) {\r\n    const axis = this._axis;\r\n    const event = this.getCylinderRaycastEvent(ray, radius);\r\n    VceCasterUtils.traverseWires(axis, event);\r\n  }\r\n\r\n  private processLineRaycast(id: number, ray: THREE.Ray) {\r\n    const width = this._circleExtrusion.radius(id) as number;\r\n    this.exclusiveCylinderRaycast(ray, width);\r\n    this.circleCurveRaycast(ray, width);\r\n    this.wireSetRaycast(ray, width);\r\n  }\r\n\r\n  private getCylinderRaycastEvent(ray: THREE.Ray, radius: number) {\r\n    return (start: THREE.Vector3, end: THREE.Vector3) => {\r\n      this.cylinderRaycast(start, end, ray, radius);\r\n    };\r\n  }\r\n\r\n  private processCircleCurveBody(\r\n    body: THREE.Vector3[],\r\n    ray: THREE.Ray,\r\n    radius: number,\r\n  ) {\r\n    for (let i = 0; i < body.length; i++) {\r\n      if (i === 0) continue;\r\n      const mid = body[i];\r\n      const past = body[i - 1];\r\n      this.cylinderRaycast(past, mid, ray, radius);\r\n    }\r\n  }\r\n\r\n  private getCircleCurveRaycastEvent(ray: THREE.Ray, radius: number) {\r\n    return (\r\n      first: THREE.Vector3,\r\n      body: THREE.Vector3[],\r\n      last: THREE.Vector3,\r\n    ) => {\r\n      this.cylinderRaycast(first, body[0], ray, radius);\r\n      this.processCircleCurveBody(body, ray, radius);\r\n      const nextToLast = body[body.length - 1];\r\n      this.cylinderRaycast(nextToLast, last, ray, radius);\r\n    };\r\n  }\r\n\r\n  private fetchCylinderRaycastResult(\r\n    ray: THREE.Ray,\r\n    first: THREE.Vector3,\r\n    last: THREE.Vector3,\r\n  ) {\r\n    ray.distanceSqToSegment(first, last, undefined, this._wirePoint);\r\n    const resultData = this.newResult(first, last);\r\n    this._found.push(resultData);\r\n  }\r\n\r\n  private circleCurveRaycast(ray: THREE.Ray, radius: number) {\r\n    const divisionLogic = VceCasterUtils.circleCurve3Divisions;\r\n    const event = this.getCircleCurveRaycastEvent(ray, radius);\r\n    VceCasterUtils.traverseCircleCurve(this._axis, event, divisionLogic);\r\n  }\r\n\r\n  private newResult(first: THREE.Vector3, last: THREE.Vector3) {\r\n    return {\r\n      point: this._wirePoint.clone(),\r\n      raySquaredDistance: undefined,\r\n      snappedEdgeP1: first.clone(),\r\n      snappedEdgeP2: last.clone(),\r\n    };\r\n  }\r\n\r\n  private cylinderRaycast(\r\n    first: THREE.Vector3,\r\n    last: THREE.Vector3,\r\n    ray: THREE.Ray,\r\n    radius: number,\r\n  ) {\r\n    const u = VceCasterUtils;\r\n    const results = u.raycastCircleExtr(first, last, ray, radius);\r\n    for (const result of results) {\r\n      if (!result.point) continue;\r\n      this.fetchCylinderRaycastResult(ray, first, last);\r\n    }\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { Axis, CircleExtrusion, Meshes } from \"../../../../../Schema\";\r\nimport { VceUtils } from \"./vce-utils\";\r\nimport { VceCasterUtils } from \"./vce-caster-utils\";\r\n\r\nexport class VcePointRaycaster {\r\n  private _meshes: Meshes;\r\n  private _results: any[] = [];\r\n  private _circleExtrusion = new CircleExtrusion();\r\n  private _axis = new Axis();\r\n  private readonly _normal = new THREE.Vector3();\r\n  private readonly _point = new THREE.Vector3();\r\n  private readonly _plane = new THREE.Plane();\r\n\r\n  constructor(meshes: Meshes) {\r\n    this._meshes = meshes;\r\n  }\r\n\r\n  pointRaycast(id: number, ray: THREE.Ray) {\r\n    this._results.length = 0;\r\n    this._meshes.circleExtrusions(id, this._circleExtrusion);\r\n    this.traverseAllCircleExtrusions(ray);\r\n    return this.getCleanResults();\r\n  }\r\n\r\n  private fetchOrientation(p1: THREE.Vector3, p2: THREE.Vector3) {\r\n    VceUtils.temp.vector.copy(p1);\r\n    VceUtils.temp.vector.sub(p2);\r\n    VceUtils.temp.vector.normalize();\r\n    const rot = VceUtils.temp.rotation;\r\n    rot.setFromUnitVectors(VceUtils.up, VceUtils.temp.vector);\r\n  }\r\n\r\n  private getTraverseWiresEvent(ray: THREE.Ray, radius: number) {\r\n    return (first: THREE.Vector3, last: THREE.Vector3) => {\r\n      this.fetchOrientation(first, last);\r\n      const result1 = this.raycastCutCircleExtrusion(first, ray, radius);\r\n      const result2 = this.raycastCutCircleExtrusion(last, ray, radius);\r\n      this._results.push(result1, result2);\r\n    };\r\n  }\r\n\r\n  private traverseAllCircleExtrusions(ray: THREE.Ray) {\r\n    const count = this._circleExtrusion.axesLength();\r\n    for (let i = 0; i < count; i++) {\r\n      this._circleExtrusion.axes(i, this._axis);\r\n      const radius = this._circleExtrusion.radius(i)!;\r\n      const count = VceUtils.vertexLength(radius);\r\n      VceUtils.setPathVertices(count);\r\n      this.traverseAllCurves(ray, radius);\r\n    }\r\n  }\r\n\r\n  private setupCuttedCircleExtrusion(origin: THREE.Vector3) {\r\n    this._normal.set(0, 0, 1);\r\n    this._normal.applyQuaternion(VceUtils.temp.rotation);\r\n    this._plane.setFromNormalAndCoplanarPoint(this._normal, origin);\r\n  }\r\n\r\n  private getTraverseCircleCurveEvent(ray: THREE.Ray, radius: number) {\r\n    return (\r\n      first: THREE.Vector3,\r\n      mids: THREE.Vector3[],\r\n      last: THREE.Vector3,\r\n    ) => {\r\n      this.fetchOrientation(first, mids[0]);\r\n      const result1 = this.raycastCutCircleExtrusion(first, ray, radius);\r\n      const nextToLast = mids[mids.length - 1];\r\n      this.fetchOrientation(nextToLast, last);\r\n      const result2 = this.raycastCutCircleExtrusion(last, ray, radius);\r\n      this._results.push(result1, result2);\r\n    };\r\n  }\r\n\r\n  private computeCutCircleExtrCast(\r\n    origin: THREE.Vector3,\r\n    radius: number,\r\n    ray: THREE.Ray,\r\n  ) {\r\n    ray.intersectPlane(this._plane, this._point);\r\n    const distance = this._point.distanceTo(origin);\r\n    if (distance <= radius) {\r\n      const point = origin.clone();\r\n      return { point };\r\n    }\r\n    return undefined;\r\n  }\r\n\r\n  private raycastCutCircleExtrusion(\r\n    origin: THREE.Vector3,\r\n    ray: THREE.Ray,\r\n    radius: number,\r\n  ) {\r\n    this.setupCuttedCircleExtrusion(origin);\r\n    const collides = ray.intersectsPlane(this._plane);\r\n    if (collides) {\r\n      return this.computeCutCircleExtrCast(origin, radius, ray);\r\n    }\r\n    return undefined;\r\n  }\r\n\r\n  private getCleanResults() {\r\n    const filtered: any[] = [];\r\n    for (const result of this._results) {\r\n      if (result) {\r\n        filtered.push(result);\r\n      }\r\n    }\r\n    return filtered;\r\n  }\r\n\r\n  private traverseAllCurves(ray: THREE.Ray, radius: number) {\r\n    const wiresEvent = this.getTraverseWiresEvent(ray, radius);\r\n    VceCasterUtils.traverseWires(this._axis, wiresEvent);\r\n    const circleEvent = this.getTraverseCircleCurveEvent(ray, radius);\r\n    const divider = VceCasterUtils.circleCurve3Divisions;\r\n    VceCasterUtils.traverseCircleCurve(this._axis, circleEvent, divider);\r\n    const wireSetsEvent = this.getTraverseWiresEvent(ray, radius);\r\n    VceCasterUtils.traverseWireSets(this._axis, wireSetsEvent);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport {\r\n  AxisPartClass,\r\n  Axis,\r\n  CircleExtrusion,\r\n  FloatVector,\r\n} from \"../../../../../Schema\";\r\nimport {\r\n  CurrentLod,\r\n  DataBuffer,\r\n  ObjectClass,\r\n} from \"../../../model/model-types\";\r\nimport { TileBasicData, TileData } from \"../types\";\r\nimport { VceCasterUtils } from \"./vce-caster-utils\";\r\nimport { VceUtils } from \"./vce-utils\";\r\n\r\nexport class VceLodConstructor {\r\n  private _currentElement = 0;\r\n  private readonly _wireSize = 6;\r\n\r\n  construct(circleExtrusion: CircleExtrusion, mesh: TileData) {\r\n    this._currentElement = 0;\r\n    mesh.positionBuffer = new Float32Array(mesh.positionCount!);\r\n    for (let i = 0, l = circleExtrusion.axesLength(); i < l; i++) {\r\n      circleExtrusion.axes(i, VceUtils.temp.axis);\r\n      this.constructLod(mesh);\r\n    }\r\n    return mesh;\r\n  }\r\n\r\n  private constructCircleExtrusionLod(id: number, mesh: TileData) {\r\n    const axis = VceUtils.temp.axis;\r\n    const type = axis.parts(id) as AxisPartClass;\r\n    const index = axis.order(id)!;\r\n    const lodConstructor = this.getLodConstructor(type);\r\n    lodConstructor(axis, index, mesh);\r\n  }\r\n\r\n  private newCircleCurveLod = (axis: Axis, index: number, mesh: TileData) => {\r\n    const count = this.newCircleCurveLodPath(axis, index);\r\n    const points = mesh.positionBuffer!;\r\n    for (let i = 1; i < count; i++) {\r\n      const first = VceUtils.circleCurves[i - 1];\r\n      const last = VceUtils.circleCurves[i];\r\n      this.newWire(points, first, last);\r\n    }\r\n  };\r\n\r\n  private newWireSetLod = (axis: Axis, index: number, mesh: TileData) => {\r\n    const wireSetSegment = axis.wireSets(index)!;\r\n    const count = wireSetSegment.psLength();\r\n    const points = mesh.positionBuffer!;\r\n    for (let i = 1; i < count; i++) {\r\n      const first = wireSetSegment.ps(i - 1)!;\r\n      const last = wireSetSegment.ps(i)!;\r\n      this.newWire(points, first, last);\r\n    }\r\n  };\r\n\r\n  private newWireTemplate = (_index: number, template: TileBasicData) => {\r\n    template.positionCount! += this._wireSize;\r\n  };\r\n\r\n  private newCircleCurveLodPath(axis: Axis, index: number) {\r\n    const curve = axis.circleCurves(index)!;\r\n    const count = VceCasterUtils.circleCurve3Divisions(curve);\r\n    VceUtils.circleCurves = VceUtils.newPaths(curve, count);\r\n    return count;\r\n  }\r\n\r\n  private selectNextWire() {\r\n    this._currentElement += this._wireSize;\r\n  }\r\n\r\n  private getAxisPartVertexSize(id: number, template: TileBasicData): void {\r\n    const axis = VceUtils.temp.axis;\r\n    const partClass = axis.parts(id) as AxisPartClass;\r\n    const order = axis.order(id)!;\r\n    const templateConstructor = this.getTemplateConstructor(partClass);\r\n    templateConstructor(order, template);\r\n  }\r\n\r\n  private getIndices() {\r\n    const i1 = this._currentElement;\r\n    const i2 = this._currentElement + 1;\r\n    const i3 = this._currentElement + 2;\r\n    const i4 = this._currentElement + 3;\r\n    const i5 = this._currentElement + 4;\r\n    const i6 = this._currentElement + 5;\r\n    return { i1, i2, i3, i4, i5, i6 };\r\n  }\r\n\r\n  private setAxisTemplate(id: number, template: TileBasicData) {\r\n    VceUtils.temp.circleExtrusion.axes(id, VceUtils.temp.axis);\r\n    const count = VceUtils.temp.axis.partsLength();\r\n    for (let id = 0; id < count; id++) {\r\n      this.getAxisPartVertexSize(id, template);\r\n    }\r\n    this.setAxisThickness(template, id);\r\n  }\r\n\r\n  private constructLod(mesh: TileData) {\r\n    const count = VceUtils.temp.axis.orderLength();\r\n    for (let id = 0; id < count; id++) {\r\n      this.constructCircleExtrusionLod(id, mesh);\r\n    }\r\n  }\r\n\r\n  private getLodConstructor(type: AxisPartClass) {\r\n    const constructors = {\r\n      [AxisPartClass.WIRE]: this.newWireLod,\r\n      [AxisPartClass.WIRE_SET]: this.newWireSetLod,\r\n      [AxisPartClass.CIRCLE_CURVE]: this.newCircleCurveLod,\r\n    };\r\n    return constructors[type as keyof typeof constructors];\r\n  }\r\n\r\n  private newWireSetTemplate = (index: number, template: TileBasicData) => {\r\n    const axis = VceUtils.temp.axis;\r\n    const wireSet = axis.wireSets(index, VceUtils.temp.wireSet)!;\r\n    const wires = wireSet.psLength() - 1;\r\n    template.positionCount! += this._wireSize * wires;\r\n  };\r\n\r\n  newTemplate() {\r\n    const circularExtrusion = VceUtils.temp.circleExtrusion;\r\n    const template = this.newTemplateData();\r\n    const count = circularExtrusion.axesLength();\r\n    for (let id = 0; id < count; id++) {\r\n      this.setAxisTemplate(id, template);\r\n    }\r\n    return template;\r\n  }\r\n\r\n  private setAxisThickness(template: TileBasicData, id: number) {\r\n    const l1 = template.lodThickness!;\r\n    const l2 = VceUtils.temp.circleExtrusion.radius(id)!;\r\n    template.lodThickness = Math.max(l1, l2);\r\n  }\r\n\r\n  private newTemplateData() {\r\n    return {\r\n      objectClass: ObjectClass.LINE,\r\n      lod: CurrentLod.WIRES,\r\n      lodThickness: 0,\r\n      positionCount: 0,\r\n    } as TileBasicData;\r\n  }\r\n\r\n  private newWireLod = (axis: Axis, index: number, mesh: TileData) => {\r\n    const wire = axis.wires(index)!;\r\n    const first = wire.p1()!;\r\n    const last = wire.p2()!;\r\n    const points = mesh.positionBuffer!;\r\n    this.newWire(points, first, last);\r\n  };\r\n\r\n  private getTemplateConstructor(type: AxisPartClass) {\r\n    const constructors = {\r\n      [AxisPartClass.WIRE]: this.newWireTemplate,\r\n      [AxisPartClass.WIRE_SET]: this.newWireSetTemplate,\r\n      [AxisPartClass.CIRCLE_CURVE]: this.newCircleCurveTemplate,\r\n    };\r\n    return constructors[type as keyof typeof constructors];\r\n  }\r\n\r\n  private newWire(\r\n    points: DataBuffer,\r\n    first: FloatVector | THREE.Vector3,\r\n    last: FloatVector | THREE.Vector3,\r\n  ) {\r\n    const x1 = first instanceof THREE.Vector3 ? first.x : first.x();\r\n    const y1 = first instanceof THREE.Vector3 ? first.y : first.y();\r\n    const z1 = first instanceof THREE.Vector3 ? first.z : first.z();\r\n\r\n    const x2 = last instanceof THREE.Vector3 ? last.x : last.x();\r\n    const y2 = last instanceof THREE.Vector3 ? last.y : last.y();\r\n    const z2 = last instanceof THREE.Vector3 ? last.z : last.z();\r\n\r\n    const { i1, i2, i3, i4, i5, i6 } = this.getIndices();\r\n\r\n    points[i1] = x1;\r\n    points[i2] = y1;\r\n    points[i3] = z1;\r\n    points[i4] = x2;\r\n    points[i5] = y2;\r\n    points[i6] = z2;\r\n\r\n    this.selectNextWire();\r\n  }\r\n\r\n  private newCircleCurveTemplate = (index: number, template: TileBasicData) => {\r\n    const axis = VceUtils.temp.axis;\r\n    const circleCurve = axis.circleCurves(index, VceUtils.temp.circleCurve)!;\r\n    const count = VceCasterUtils.circleCurve3Divisions(circleCurve);\r\n    template.positionCount! += this._wireSize * (count - 1);\r\n  };\r\n}\r\n","import * as THREE from \"three\";\r\nimport { TileData, TileBasicData, LodClass } from \"./types\";\r\nimport { ObjectClass, CurrentLod } from \"../../model/model-types\";\r\n\r\nimport { RepresentationClass } from \"../../../../Schema\";\r\n\r\nimport { VirtualMeshManager } from \"./virtual-mesh-manager\";\r\n\r\nimport {\r\n  VceConstructor,\r\n  VceLineRaycaster,\r\n  VceLodConstructor,\r\n  VcePointRaycaster,\r\n  VceRaycaster,\r\n  VceUtils,\r\n} from \"./circle-extrusion\";\r\n\r\nexport class VirtualCircleExtrusionManager extends VirtualMeshManager {\r\n  private _vceConstructor = new VceConstructor();\r\n  private _lodConstructor = new VceLodConstructor();\r\n  private _vceRaycaster = new VceRaycaster(this.meshes);\r\n  private _vceLineRaycaster = new VceLineRaycaster(this.meshes);\r\n  private _vcePointRaycaster = new VcePointRaycaster(this.meshes);\r\n  private _representationClass = RepresentationClass.CIRCLE_EXTRUSION;\r\n  private _objectClass = ObjectClass.LINE;\r\n  private lodClass = LodClass.CUSTOM;\r\n\r\n  setupTemplates() {\r\n    const count = this.meshes.circleExtrusionsLength();\r\n    for (let id = 0; id < count; id++) {\r\n      this.newCircleExtrusionTemplate(id);\r\n    }\r\n  }\r\n\r\n  fetchLod(meshId: number, evenVoid: boolean) {\r\n    const lod = this.getMesh(meshId, CurrentLod.WIRES) as TileData;\r\n    this.generateLodIfNeeded(meshId, evenVoid, lod);\r\n    return lod;\r\n  }\r\n\r\n  fetchMeshes(meshId: number, evenVoid: boolean) {\r\n    const meshes = this.getMesh(meshId, CurrentLod.GEOMETRY) as TileData[];\r\n    this.generateMeshesIfNeeded(meshId, evenVoid, meshes);\r\n    return meshes;\r\n  }\r\n\r\n  raycast(id: number, ray: THREE.Ray) {\r\n    return this._vceRaycaster.raycast(id, ray);\r\n  }\r\n\r\n  faceRaycast() {\r\n    // Rebars don't have face snap\r\n    return [];\r\n  }\r\n\r\n  pointRaycast(id: number, ray: THREE.Ray) {\r\n    return this._vcePointRaycaster.pointRaycast(id, ray);\r\n  }\r\n\r\n  lineRaycast(id: number, ray: THREE.Ray) {\r\n    return this._vceLineRaycaster.lineRaycast(id, ray);\r\n  }\r\n\r\n  getObjectClass() {\r\n    return this._objectClass;\r\n  }\r\n\r\n  getRepresentation() {\r\n    return this._representationClass;\r\n  }\r\n\r\n  getLodClass() {\r\n    return this.lodClass;\r\n  }\r\n\r\n  private newMeshes(meshId: number, meshes: TileData[]) {\r\n    this.meshes.circleExtrusions(meshId, VceUtils.temp.circleExtrusion);\r\n    const circleExtrusion = VceUtils.temp.circleExtrusion;\r\n    this._vceConstructor.construct(circleExtrusion, meshes);\r\n    this.saveMesh(meshId, meshes, CurrentLod.GEOMETRY);\r\n  }\r\n\r\n  private generateMeshesIfNeeded(\r\n    meshId: number,\r\n    createIfVoid: boolean,\r\n    meshes: TileData[],\r\n  ) {\r\n    if (meshes.length === 0) {\r\n      return;\r\n    }\r\n    const meshesExist = Boolean(meshes.length);\r\n    const isVoid = !meshes[0].positionBuffer;\r\n    const shouldCreate = createIfVoid && isVoid && meshesExist;\r\n    if (shouldCreate) {\r\n      this.newMeshes(meshId, meshes);\r\n    }\r\n  }\r\n\r\n  private newCircleExtrusionTemplate(id: number) {\r\n    const meshTemplate = [] as TileBasicData[];\r\n    this.meshes.circleExtrusions(id, VceUtils.temp.circleExtrusion);\r\n    const circleExtrusion = VceUtils.temp.circleExtrusion;\r\n    const count = circleExtrusion.axesLength();\r\n    for (let i = 0; i < count; i++) {\r\n      this._vceConstructor.newTemplate(circleExtrusion, i, meshTemplate);\r\n    }\r\n    const lodTemplate = this._lodConstructor.newTemplate();\r\n    this.useMesh(id, meshTemplate, CurrentLod.GEOMETRY);\r\n    this.useMesh(id, lodTemplate, CurrentLod.WIRES);\r\n  }\r\n\r\n  private generateLodIfNeeded(\r\n    meshId: number,\r\n    evenVoid: boolean,\r\n    mesh: TileData,\r\n  ) {\r\n    const isVoid = !mesh.positionBuffer;\r\n    if (!isVoid || !evenVoid) return;\r\n    this.meshes.circleExtrusions(meshId, VceUtils.temp.circleExtrusion);\r\n    this._lodConstructor.construct(VceUtils.temp.circleExtrusion, mesh);\r\n    this.saveMesh(meshId, mesh, CurrentLod.WIRES);\r\n  }\r\n}\r\n","import { DataBuffer, ItemConfigClass } from \"../../model/model-types\";\r\nimport { BitUtils } from \"../../utils\";\r\n\r\nexport class ItemConfigController {\r\n  readonly size: number;\r\n\r\n  private _data: DataBuffer;\r\n  private _highlightData: DataBuffer;\r\n\r\n  constructor(size: number) {\r\n    this.size = size;\r\n    this._data = new Uint8Array(size);\r\n    this._highlightData = new Uint16Array(size);\r\n    this._data.fill(1);\r\n  }\r\n\r\n  getHighlight(id: number): number {\r\n    return this._highlightData[id];\r\n  }\r\n\r\n  setHighlight(id: number, highlightId: number) {\r\n    BitUtils.checkMemory(highlightId);\r\n    this._highlightData[id] = highlightId;\r\n  }\r\n\r\n  clearHighlight() {\r\n    this._highlightData.fill(0);\r\n  }\r\n\r\n  visible(id: number): boolean {\r\n    return BitUtils.check(this._data, id, ItemConfigClass.VISIBLE);\r\n  }\r\n\r\n  setVisible(id: number, visible: boolean) {\r\n    BitUtils.apply(this._data, id, ItemConfigClass.VISIBLE, visible);\r\n  }\r\n\r\n  clearVisible() {\r\n    this._data.fill(1);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\n\r\nimport {\r\n  MultiThreadingRequestClass,\r\n  TileRequestClass,\r\n} from \"../model/model-types\";\r\n\r\nexport type Thread = Worker;\r\n\r\nexport class MultithreadingHelper {\r\n  static newThread(url: string, classic?: boolean) {\r\n    return classic ? new Worker(url) : new Worker(url, { type: \"module\" });\r\n  }\r\n\r\n  static newUpdater(effect: any, rate: number) {\r\n    return setInterval(effect, rate);\r\n  }\r\n\r\n  static getMeshComputeRequest(modelId: string, list: any[]) {\r\n    const className = MultiThreadingRequestClass.RECOMPUTE_MESHES;\r\n    return { class: className, modelId, list };\r\n  }\r\n\r\n  static planeSet(planes: THREE.Plane[]) {\r\n    const planeSet: THREE.Plane[] = [];\r\n    for (const plane of planes) {\r\n      const newNormal = this.array(plane.normal);\r\n      const newConstant = plane.constant;\r\n      const newPlane = new THREE.Plane(newNormal, newConstant);\r\n      planeSet.push(newPlane);\r\n    }\r\n    return planeSet;\r\n  }\r\n\r\n  static data(data: any) {\r\n    const isTransform = data?.elements !== undefined;\r\n    if (isTransform) {\r\n      return MultithreadingHelper.transform(data);\r\n    }\r\n\r\n    const isBeam = data?.origin !== undefined && data?.direction !== undefined;\r\n    if (isBeam) {\r\n      return MultithreadingHelper.beam(data);\r\n    }\r\n\r\n    const isFrustum = data?.planes !== undefined;\r\n    if (isFrustum) {\r\n      return MultithreadingHelper.frustum(data);\r\n    }\r\n\r\n    const hasNormal = data?.normal !== undefined;\r\n    const hasConstant = data?.constant !== undefined;\r\n    const isPlane = hasNormal && hasConstant;\r\n    if (isPlane) {\r\n      return MultithreadingHelper.plane(data);\r\n    }\r\n\r\n    const hasNormalSet = data[0]?.normal !== undefined;\r\n    const hasConstantSet = data[0]?.constant !== undefined;\r\n    const isPlaneSet = hasNormalSet && hasConstantSet;\r\n    if (isPlaneSet) {\r\n      return MultithreadingHelper.planeSet(data);\r\n    }\r\n\r\n    const hasX = data?.x !== undefined;\r\n    const hasY = data?.y !== undefined;\r\n    const hasZ = data?.z !== undefined;\r\n    const isArray = hasX && hasY && hasZ;\r\n    if (isArray) {\r\n      return MultithreadingHelper.array(data);\r\n    }\r\n\r\n    return data;\r\n  }\r\n\r\n  static getExecuteRequest(modelId: string, method: string, args: any) {\r\n    const parameters = Array.from(args);\r\n    const className = MultiThreadingRequestClass.EXECUTE;\r\n    return { class: className, modelId, function: method, parameters };\r\n  }\r\n\r\n  static plane(plane: THREE.Plane) {\r\n    const newNormal = this.array(plane.normal);\r\n    const newConstant = plane.constant;\r\n    const newPlane = new THREE.Plane(newNormal, newConstant);\r\n    return newPlane;\r\n  }\r\n\r\n  static getRequestContent(input: any): any[] {\r\n    const content: any[] = [];\r\n    for (const request of input.list) {\r\n      MultithreadingHelper.setupCreateRequest(request, content);\r\n      MultithreadingHelper.setupUpdateRequest(request, content);\r\n    }\r\n    return content;\r\n  }\r\n\r\n  static array(vector: THREE.Vector3) {\r\n    const array = new THREE.Vector3();\r\n    array.set(vector.x, vector.y, vector.z);\r\n    return array;\r\n  }\r\n\r\n  static cleanRequests(list: any[]) {\r\n    const tasks: any[] = [];\r\n    const helper = MultithreadingHelper;\r\n    for (const request of list) {\r\n      const isFinish = helper.isFinishRequest(request);\r\n      if (!isFinish) {\r\n        tasks.push(request);\r\n      }\r\n    }\r\n    return tasks;\r\n  }\r\n\r\n  static frustum(frustum: THREE.Frustum) {\r\n    const newPlane = this.planeSet(frustum.planes);\r\n    const [a, b, c, d, e, f] = newPlane;\r\n    return new THREE.Frustum(a, b, c, d, e, f);\r\n  }\r\n\r\n  static beam(ray: THREE.Ray) {\r\n    const newOrigin = this.array(ray.origin);\r\n    const newDirection = this.array(ray.direction);\r\n    return new THREE.Ray(newOrigin, newDirection);\r\n  }\r\n\r\n  static transform(matrix: THREE.Matrix4) {\r\n    const newMatrix = new THREE.Matrix4();\r\n    newMatrix.copy(matrix);\r\n    return newMatrix;\r\n  }\r\n\r\n  static deleteUpdater(updater: any) {\r\n    clearInterval(updater);\r\n  }\r\n\r\n  static areCoresAvailable(currentThreads: number) {\r\n    const capacity = MultithreadingHelper.getCpuCapacity();\r\n    const availableThreads = Math.max(capacity, 2);\r\n    return currentThreads < availableThreads;\r\n  }\r\n\r\n  static isFinishRequest(request: any) {\r\n    return request.tileRequestClass === TileRequestClass.FINISH;\r\n  }\r\n\r\n  private static setupUpdateRequest(request: any, content: any[]) {\r\n    if (request.tileRequestClass === TileRequestClass.UPDATE) {\r\n      this.addAllTileData(request, content);\r\n    }\r\n  }\r\n\r\n  private static getCpuCapacity() {\r\n    const freeCores = 3;\r\n    if (globalThis.navigator?.hardwareConcurrency) {\r\n      return navigator.hardwareConcurrency - freeCores;\r\n    }\r\n    return 0;\r\n  }\r\n\r\n  private static addAllTileData(request: any, content: any[]) {\r\n    this.addRequestTileData(request, content, \"visibilityData\");\r\n    const extras = [\"highlightIds\"];\r\n    this.addRequestTileData(request, content, \"highlightData\", extras);\r\n  }\r\n\r\n  private static addRequestContent(id: string, request: any, content: any[]) {\r\n    if (!request[id]) return;\r\n    const buffer = request[id].buffer;\r\n    content.push(buffer);\r\n  }\r\n\r\n  private static addRequestTileData(\r\n    request: any,\r\n    content: any[],\r\n    name: string,\r\n    extras: string[] = [],\r\n  ) {\r\n    const data = request.tileData[name];\r\n    if (data) {\r\n      content.push(data.position.buffer);\r\n      content.push(data.size.buffer);\r\n      for (const extra of extras) {\r\n        content.push(request.tileData[extra].buffer);\r\n      }\r\n    }\r\n  }\r\n\r\n  private static setupCreateRequest(request: any, content: any[]) {\r\n    if (request.tileRequestClass !== TileRequestClass.CREATE) {\r\n      return;\r\n    }\r\n    const ids = this.getCreateRequestIds();\r\n    for (const id of ids) {\r\n      this.addRequestContent(id, request, content);\r\n    }\r\n    this.addAllTileData(request, content);\r\n  }\r\n\r\n  private static getCreateRequestIds() {\r\n    return [\"positions\", \"indices\", \"normals\", \"itemIds\"];\r\n  }\r\n}\r\n","import { Connection } from \"./connection\";\r\nimport { MultithreadingHelper } from \"./multithreading-helper\";\r\n\r\nexport class MeshConnection {\r\n  private _rate = 64;\r\n  private _updater: any;\r\n  private _modelId: string;\r\n  private _threshold = 16;\r\n  private _connection: Connection;\r\n  private _list: any[] = [];\r\n\r\n  private get needsRefresh() {\r\n    return this._list.length > this._threshold;\r\n  }\r\n\r\n  constructor(modelId: string, connection: Connection) {\r\n    this._modelId = modelId;\r\n    this._connection = connection;\r\n    this._updater = MultithreadingHelper.newUpdater(this.refresh, this._rate);\r\n  }\r\n\r\n  dispose(): void {\r\n    MultithreadingHelper.deleteUpdater(this._updater);\r\n  }\r\n\r\n  clean() {\r\n    this._list = MultithreadingHelper.cleanRequests(this._list);\r\n  }\r\n\r\n  process(request: any): void {\r\n    this._list.push(request);\r\n    if (this.needsRefresh) {\r\n      this.refresh();\r\n    }\r\n  }\r\n\r\n  private refresh = () => {\r\n    if (this._list.length) {\r\n      const current = this._list;\r\n      this._connection.fetchMeshCompute(this._modelId, current);\r\n      this._list = [];\r\n    }\r\n  };\r\n}\r\n","import * as THREE from \"three\";\r\nimport { SnappingClass } from \"../../model/model-types\";\r\nimport { VirtualBoxController } from \"../../bounding-boxes\";\r\nimport { VirtualTilesController, VirtualMeshManager } from \"..\";\r\nimport { TransformHelper, CameraUtils, PlanesUtils } from \"../../utils\";\r\nimport { Representation, Sample, Model, Meshes } from \"../../../../Schema\";\r\nimport { ItemConfigController } from \"./item-config-controller\";\r\n\r\ntype CastData = {\r\n  ray: THREE.Ray;\r\n  frustum: THREE.Frustum;\r\n  planes: THREE.Plane[];\r\n  snap?: SnappingClass;\r\n  returnAll?: boolean;\r\n};\r\n\r\ntype Snap = SnappingClass;\r\n\r\nexport class RaycastController {\r\n  private readonly _meshes: Meshes;\r\n  private readonly _model: Model;\r\n  private readonly _boxes: VirtualBoxController;\r\n  private readonly _tiles: VirtualTilesController;\r\n  private readonly _items: ItemConfigController;\r\n  private readonly _edgeThreshold = 8;\r\n  private readonly _raycastMultiplier = 32;\r\n  private readonly _maxDuration = 512;\r\n  private readonly _precission = 0.001;\r\n  private readonly _temp = {\r\n    sample: new Sample(),\r\n    representation: new Representation(),\r\n    tempPlane: new THREE.Plane(),\r\n    ray: new THREE.Ray(),\r\n    frustum: new THREE.Frustum(),\r\n    m1: new THREE.Matrix4(),\r\n    m2: new THREE.Matrix4(),\r\n    m3: new THREE.Matrix4(),\r\n    v1: new THREE.Vector3(),\r\n    planes: [] as THREE.Plane[],\r\n  };\r\n\r\n  constructor(\r\n    model: Model,\r\n    boxes: VirtualBoxController,\r\n    tiles: VirtualTilesController,\r\n    items: ItemConfigController,\r\n  ) {\r\n    this._model = model;\r\n    this._boxes = boxes;\r\n    this._tiles = tiles;\r\n    this._items = items;\r\n    this._meshes = model.meshes() as Meshes;\r\n  }\r\n\r\n  static cast(\r\n    mesh: VirtualMeshManager,\r\n    representation: Representation,\r\n    ray: THREE.Ray,\r\n    frustum: THREE.Frustum,\r\n    snap?: SnappingClass,\r\n  ) {\r\n    const reprId = representation.id();\r\n\r\n    if (snap === SnappingClass.FACE) {\r\n      return mesh.faceRaycast(reprId, ray, frustum);\r\n    }\r\n\r\n    if (snap === SnappingClass.LINE) {\r\n      return mesh.lineRaycast(reprId, ray, frustum);\r\n    }\r\n\r\n    if (snap === SnappingClass.POINT) {\r\n      return mesh.pointRaycast(reprId, ray, frustum);\r\n    }\r\n\r\n    if (snap === undefined) {\r\n      return mesh.raycast(reprId, ray, frustum);\r\n    }\r\n\r\n    return undefined;\r\n  }\r\n\r\n  raycast(\r\n    ray: THREE.Ray,\r\n    frustum: THREE.Frustum,\r\n    planes: THREE.Plane[],\r\n    returnAll?: boolean,\r\n  ) {\r\n    const data: CastData = { ray, frustum, planes, returnAll };\r\n    const ids = this.castBox(frustum, planes);\r\n    if (ids.length) {\r\n      return this.computeRaycastList(ids, data);\r\n    }\r\n    return null;\r\n  }\r\n\r\n  snapRaycast(\r\n    ray: THREE.Ray,\r\n    frustum: THREE.Frustum,\r\n    snaps: Snap[],\r\n    planes: THREE.Plane[],\r\n  ) {\r\n    const results: any[] = [];\r\n    const data: CastData = { ray, frustum, planes };\r\n    const first = this.raycast(ray, frustum, planes);\r\n    if (!first) {\r\n      return this.snapCastEdges(data, snaps);\r\n    }\r\n\r\n    this.getSnaps(first, data, snaps, results);\r\n    if (!first.normal) {\r\n      return results;\r\n    }\r\n\r\n    return this.filterOnFront(results);\r\n  }\r\n\r\n  rectangleRaycast(\r\n    frustum: THREE.Frustum,\r\n    planes: THREE.Plane[],\r\n    fullyInside: boolean,\r\n  ) {\r\n    const lookup = this._boxes.lookup;\r\n    if (!lookup) {\r\n      return [];\r\n    }\r\n    const itemIds = lookup.collideFrustum(planes, frustum, fullyInside);\r\n    const raycastedItemIds = this.filterVisible(itemIds);\r\n    return this.localIdsFromItemIds(raycastedItemIds);\r\n  }\r\n\r\n  private snapCastEdges(data: CastData, snaps: Snap[]) {\r\n    const results: any[] = [];\r\n    const pointSnap = snaps.includes(SnappingClass.POINT);\r\n    const lineSnap = snaps.includes(SnappingClass.LINE);\r\n    if (pointSnap || lineSnap) {\r\n      this.computeEdgesCast(data, snaps, results);\r\n    }\r\n    this.addDistanceToEdgeResult(results, data.ray);\r\n    return results;\r\n  }\r\n\r\n  private filterVisible(ids: number[]) {\r\n    const result: number[] = [];\r\n    for (const id of ids) {\r\n      this._meshes.samples(id, this._temp.sample);\r\n      const itemId = this._temp.sample.item();\r\n      const sampleVisible = this._items.visible(itemId);\r\n      if (sampleVisible) {\r\n        result.push(id);\r\n      }\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private computeSnaps(\r\n    snaps: Snap[],\r\n    data: CastData,\r\n    id: number,\r\n    results: any[],\r\n  ) {\r\n    for (const snapClass of snaps) {\r\n      const isValidSnap = this.isValidSnap(snapClass);\r\n      if (isValidSnap) {\r\n        const castData = { snap: snapClass, ...data };\r\n        const founds = this.castSample(id, castData);\r\n        for (const found of founds) {\r\n          results.push(found);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  private computeEdgesCast(data: CastData, snaps: Snap[], results: any[]) {\r\n    const raw = this.getRawEdges(data);\r\n    const start = performance.now();\r\n    for (const sample of raw) {\r\n      this.fetchSampleData(sample);\r\n      this.computeSnaps(snaps, data, sample, results);\r\n      const tooMuchTime = this.isTimeExceeded(start);\r\n      if (tooMuchTime) {\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  private addDistanceToEdgeResult(input: any[], ray: THREE.Ray) {\r\n    for (const result of input) {\r\n      const point = result.point;\r\n      result.raySquaredDistance = ray.distanceSqToPoint(point);\r\n    }\r\n  }\r\n\r\n  private getRawEdges(data: CastData) {\r\n    const result = this.castBox(data.frustum, data.planes);\r\n    if (result.length <= this._edgeThreshold) {\r\n      return result;\r\n    }\r\n    return this.sortBoxes(data.ray, result, this._edgeThreshold);\r\n  }\r\n\r\n  private sortBoxes(ray: THREE.Ray, boxes: number[], limit?: number): number[] {\r\n    const result: number[] = [];\r\n    const tempVector = new THREE.Vector3();\r\n    const origin = ray.origin;\r\n\r\n    for (let i = 0; i < boxes.length; i++) {\r\n      const boxId = boxes[i];\r\n      const box = this._boxes.get(boxId);\r\n      ray.intersectBox(box, tempVector);\r\n      const distance = tempVector.distanceToSquared(origin);\r\n      result.push(distance);\r\n    }\r\n\r\n    const sortedResult = this.dataSort(boxes, result);\r\n    const limitExceeded = limit && sortedResult.length > limit;\r\n    if (limitExceeded) {\r\n      sortedResult.splice(limit);\r\n    }\r\n    return sortedResult;\r\n  }\r\n\r\n  private castBox(input: THREE.Ray | THREE.Frustum, planes: THREE.Plane[]) {\r\n    const lookup = this._boxes.lookup;\r\n    if (!lookup) {\r\n      return [];\r\n    }\r\n    if (input instanceof THREE.Ray) {\r\n      const result = lookup.collideRay(planes, input);\r\n      return this.filterVisible(result);\r\n    }\r\n    const result = lookup.collideFrustum(planes, input);\r\n    return this.filterVisible(result);\r\n  }\r\n\r\n  private dataSort(ids: number[], data: number[]) {\r\n    const keys = Array.from(ids.keys());\r\n    const sortedKeys = keys.sort((a, b) => data[a] - data[b]);\r\n    const result: number[] = [];\r\n    for (const key of sortedKeys) {\r\n      const found = ids[key];\r\n      result.push(found);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private localIdsFromItemIds(raycastedItemIds: number[]) {\r\n    const localIds = new Set<number>();\r\n    for (const id of raycastedItemIds) {\r\n      this._meshes.samples(id, this._temp.sample);\r\n      const itemId = this._temp.sample.item();\r\n      const localIdIndex = this._meshes.meshesItems(itemId);\r\n      if (localIdIndex === null) continue;\r\n      const localId = this._model.localIds(localIdIndex);\r\n      if (localId === null) continue;\r\n      localIds.add(localId);\r\n    }\r\n    return Array.from(localIds);\r\n  }\r\n\r\n  private getNearest(hits: any[]) {\r\n    let nearest = hits[0];\r\n    for (let i = 1; i < hits.length; i++) {\r\n      const current = hits[i];\r\n      if (nearest.raySquaredDistance && current.raySquaredDistance) {\r\n        const nearestScore = this.getNearScore(nearest);\r\n        const currentScore = this.getNearScore(current);\r\n        if (currentScore < nearestScore) {\r\n          nearest = current;\r\n        }\r\n      } else if (\r\n        current.cameraSquaredDistance < nearest.cameraSquaredDistance\r\n      ) {\r\n        nearest = current;\r\n      }\r\n    }\r\n    return nearest;\r\n  }\r\n\r\n  private getEdges(data: CastData, snaps: Snap[], results: any[]) {\r\n    const founds = this.snapCastEdges(data, snaps);\r\n    if (founds) {\r\n      for (const found of founds) {\r\n        results.push(found);\r\n      }\r\n    }\r\n  }\r\n\r\n  private getNearScore(input: any) {\r\n    const factor = this._raycastMultiplier;\r\n    const nearestRay = input.raySquaredDistance * factor;\r\n    const nearScore = nearestRay + input.cameraSquaredDistance;\r\n    return nearScore;\r\n  }\r\n\r\n  private setupSampleCastData(data: CastData) {\r\n    TransformHelper.get(this._temp.sample, this._meshes, this._temp.m1);\r\n    this._temp.m2.copy(this._temp.m1).invert();\r\n    this._temp.ray.copy(data.ray).applyMatrix4(this._temp.m2);\r\n    CameraUtils.transform(data.frustum, this._temp.m2, this._temp.frustum);\r\n  }\r\n\r\n  private addLocalId(raycast: any) {\r\n    if (!raycast) {\r\n      return;\r\n    }\r\n    const localIdIndex = this._meshes.meshesItems(raycast.itemId);\r\n    if (localIdIndex === null) {\r\n      return;\r\n    }\r\n    raycast.localId = this._model.localIds(localIdIndex);\r\n  }\r\n\r\n  private fetchSampleData(sampleId: number) {\r\n    this._meshes.samples(sampleId, this._temp.sample);\r\n    const reprId = this._temp.sample.representation();\r\n    this._meshes.representations(reprId, this._temp.representation);\r\n  }\r\n\r\n  private computeRaycastList(ids: number[], data: CastData) {\r\n    const uniqueIds = Array.from(new Set(ids));\r\n    const sorted = this.sortBoxes(data.ray, uniqueIds);\r\n    const byRay = this.castBox(data.ray, data.planes);\r\n    const results = this.findAll(sorted, byRay, data);\r\n    if (results.length) {\r\n      if (data.returnAll) {\r\n        for (const result of results) {\r\n          this.addLocalId(result);\r\n        }\r\n        return results;\r\n      }\r\n      const result = this.getNearest(results);\r\n      this.addLocalId(result);\r\n      return result;\r\n    }\r\n    return null;\r\n  }\r\n\r\n  private formatRaycastResult(results: any[], id: number, data: CastData) {\r\n    for (const result of results) {\r\n      result.point.applyMatrix4(this._temp.m1);\r\n\r\n      if (result.normal) {\r\n        result.normal.transformDirection(this._temp.m1);\r\n      }\r\n\r\n      if (\"facePoints\" in result) {\r\n        const sample = this._meshes.samples(id, this._temp.sample)!;\r\n        TransformHelper.get(sample, this._meshes, this._temp.m3);\r\n        for (let i = 0; i < result.facePoints.length; i += 3) {\r\n          const x = result.facePoints[i];\r\n          const y = result.facePoints[i + 1];\r\n          const z = result.facePoints[i + 2];\r\n          this._temp.v1.set(x, y, z);\r\n          this._temp.v1.applyMatrix4(this._temp.m3);\r\n          result.facePoints[i] = this._temp.v1.x;\r\n          result.facePoints[i + 1] = this._temp.v1.y;\r\n          result.facePoints[i + 2] = this._temp.v1.z;\r\n        }\r\n      }\r\n\r\n      result.sampleId = id;\r\n      result.itemId = this._temp.sample.item();\r\n      const distance = data.ray.origin.distanceToSquared(result.point);\r\n      result.cameraSquaredDistance = distance;\r\n\r\n      if (!result.snappingClass) {\r\n        result.snappingClass = data.snap;\r\n      }\r\n\r\n      if (result.snappedEdgeP1) {\r\n        result.snappedEdgeP1.applyMatrix4(this._temp.m1);\r\n      }\r\n\r\n      if (result.snappedEdgeP2) {\r\n        result.snappedEdgeP2.applyMatrix4(this._temp.m1);\r\n      }\r\n    }\r\n  }\r\n\r\n  private findAll(sortedIds: number[], byRay: number[], data: CastData) {\r\n    const allResults: any[] = [];\r\n    const start = performance.now();\r\n    for (const sample of sortedIds) {\r\n      this.fetchSampleData(sample);\r\n      if (!byRay.includes(sample)) {\r\n        continue;\r\n      }\r\n\r\n      const results = this.castSample(sample, data);\r\n      for (const raycasted of results) {\r\n        allResults.push(raycasted);\r\n      }\r\n\r\n      const tooMuchTime = this.isTimeExceeded(start);\r\n      if (tooMuchTime) {\r\n        break;\r\n      }\r\n    }\r\n    return allResults;\r\n  }\r\n\r\n  private isTimeExceeded(start: number) {\r\n    const finish = performance.now();\r\n    const duration = finish - start;\r\n    return duration > this._maxDuration;\r\n  }\r\n\r\n  private getFilteredSampleCast(data: CastData) {\r\n    const rawResult = this._tiles.raycast(\r\n      this._temp.representation,\r\n      this._temp.ray,\r\n      this._temp.frustum,\r\n      data.snap,\r\n    );\r\n\r\n    if (this._temp.planes.length === 0) {\r\n      return rawResult;\r\n    }\r\n\r\n    const filteredResult: any[] = [];\r\n    if (rawResult) {\r\n      for (const result of rawResult) {\r\n        const planes = this._temp.planes;\r\n        const point = result.point;\r\n        const contained = PlanesUtils.containedInParallelPlanes(planes, point);\r\n        if (contained) {\r\n          filteredResult.push(result);\r\n        }\r\n      }\r\n    }\r\n\r\n    return filteredResult;\r\n  }\r\n\r\n  private getSnaps(first: any, data: CastData, snaps: Snap[], results: any[]) {\r\n    this.fetchSampleData(first.sampleId);\r\n    if (first.normal) {\r\n      this.setCastSide(first, data.ray);\r\n      this.setCastPlane(first);\r\n    }\r\n    this.getFaces(snaps, data, first, results);\r\n    this.getEdges(data, snaps, results);\r\n    for (const found of results) {\r\n      this.addLocalId(found);\r\n    }\r\n  }\r\n\r\n  private filterOnFront(results: any[]) {\r\n    const resultsOnFront: any[] = [];\r\n    for (const result of results) {\r\n      const plane = this._temp.tempPlane;\r\n      const distance = plane.distanceToPoint(result.point);\r\n      const isInFront = distance >= 0;\r\n      if (isInFront) {\r\n        resultsOnFront.push(result);\r\n      }\r\n    }\r\n    return resultsOnFront;\r\n  }\r\n\r\n  private setCastSide(input: any, ray: THREE.Ray) {\r\n    const p1 = input.point.clone();\r\n    const vec = p1.sub(ray.origin);\r\n    const sameSide = input.normal.dot(vec) > 0;\r\n    if (sameSide) {\r\n      input.normal.negate();\r\n    }\r\n  }\r\n\r\n  private getFaces(snaps: Snap[], data: CastData, first: any, results: any[]) {\r\n    for (const snap of snaps) {\r\n      const snapData: CastData = { snap, ...data };\r\n      const founds = this.castSample(first.sampleId, snapData);\r\n      for (const found of founds) {\r\n        results.push(found);\r\n      }\r\n    }\r\n  }\r\n\r\n  private setCastPlane(input: any) {\r\n    const plane = this._temp.tempPlane;\r\n    const point = input.point.clone();\r\n    const normal = input.normal.clone();\r\n    normal.multiplyScalar(this._precission);\r\n    point.sub(normal);\r\n    plane.setFromNormalAndCoplanarPoint(input.normal, point);\r\n  }\r\n\r\n  private castSample(id: number, data: CastData) {\r\n    this.setupSampleCastData(data);\r\n    this.setupPlanesForSampleCast(data);\r\n    const results = this.getFilteredSampleCast(data);\r\n    if (results) {\r\n      this.formatRaycastResult(results, id, data);\r\n    }\r\n    return results;\r\n  }\r\n\r\n  private isValidSnap(snapClass: SnappingClass) {\r\n    const isLine = snapClass === SnappingClass.LINE;\r\n    const isPoint = snapClass === SnappingClass.POINT;\r\n    return isLine || isPoint;\r\n  }\r\n\r\n  private transform(planes: THREE.Plane[], transform: THREE.Matrix4) {\r\n    const result: THREE.Plane[] = [];\r\n    if (planes) {\r\n      for (const plane of planes) {\r\n        const clone = new THREE.Plane().copy(plane);\r\n        clone.applyMatrix4(transform);\r\n        result.push(clone);\r\n      }\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private setupPlanesForSampleCast(data: CastData) {\r\n    this._temp.planes.length = 0;\r\n    if (data.planes && data.planes.length > 0) {\r\n      const tranformedPlanes = this.transform(data.planes, this._temp.m2);\r\n      for (const plane of tranformedPlanes) {\r\n        this._temp.planes.push(plane);\r\n      }\r\n    }\r\n  }\r\n}\r\n","/**\n * @module LRUCache\n */\nconst perf = typeof performance === 'object' &&\n    performance &&\n    typeof performance.now === 'function'\n    ? performance\n    : Date;\nconst warned = new Set();\n/* c8 ignore start */\nconst PROCESS = (typeof process === 'object' && !!process ? process : {});\n/* c8 ignore start */\nconst emitWarning = (msg, type, code, fn) => {\n    typeof PROCESS.emitWarning === 'function'\n        ? PROCESS.emitWarning(msg, type, code, fn)\n        : console.error(`[${code}] ${type}: ${msg}`);\n};\nlet AC = globalThis.AbortController;\nlet AS = globalThis.AbortSignal;\n/* c8 ignore start */\nif (typeof AC === 'undefined') {\n    //@ts-ignore\n    AS = class AbortSignal {\n        onabort;\n        _onabort = [];\n        reason;\n        aborted = false;\n        addEventListener(_, fn) {\n            this._onabort.push(fn);\n        }\n    };\n    //@ts-ignore\n    AC = class AbortController {\n        constructor() {\n            warnACPolyfill();\n        }\n        signal = new AS();\n        abort(reason) {\n            if (this.signal.aborted)\n                return;\n            //@ts-ignore\n            this.signal.reason = reason;\n            //@ts-ignore\n            this.signal.aborted = true;\n            //@ts-ignore\n            for (const fn of this.signal._onabort) {\n                fn(reason);\n            }\n            this.signal.onabort?.(reason);\n        }\n    };\n    let printACPolyfillWarning = PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1';\n    const warnACPolyfill = () => {\n        if (!printACPolyfillWarning)\n            return;\n        printACPolyfillWarning = false;\n        emitWarning('AbortController is not defined. If using lru-cache in ' +\n            'node 14, load an AbortController polyfill from the ' +\n            '`node-abort-controller` package. A minimal polyfill is ' +\n            'provided for use by LRUCache.fetch(), but it should not be ' +\n            'relied upon in other contexts (eg, passing it to other APIs that ' +\n            'use AbortController/AbortSignal might have undesirable effects). ' +\n            'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.', 'NO_ABORT_CONTROLLER', 'ENOTSUP', warnACPolyfill);\n    };\n}\n/* c8 ignore stop */\nconst shouldWarn = (code) => !warned.has(code);\nconst TYPE = Symbol('type');\nconst isPosInt = (n) => n && n === Math.floor(n) && n > 0 && isFinite(n);\n/* c8 ignore start */\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values.  Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\nconst getUintArray = (max) => !isPosInt(max)\n    ? null\n    : max <= Math.pow(2, 8)\n        ? Uint8Array\n        : max <= Math.pow(2, 16)\n            ? Uint16Array\n            : max <= Math.pow(2, 32)\n                ? Uint32Array\n                : max <= Number.MAX_SAFE_INTEGER\n                    ? ZeroArray\n                    : null;\n/* c8 ignore stop */\nclass ZeroArray extends Array {\n    constructor(size) {\n        super(size);\n        this.fill(0);\n    }\n}\nclass Stack {\n    heap;\n    length;\n    // private constructor\n    static #constructing = false;\n    static create(max) {\n        const HeapCls = getUintArray(max);\n        if (!HeapCls)\n            return [];\n        Stack.#constructing = true;\n        const s = new Stack(max, HeapCls);\n        Stack.#constructing = false;\n        return s;\n    }\n    constructor(max, HeapCls) {\n        /* c8 ignore start */\n        if (!Stack.#constructing) {\n            throw new TypeError('instantiate Stack using Stack.create(n)');\n        }\n        /* c8 ignore stop */\n        this.heap = new HeapCls(max);\n        this.length = 0;\n    }\n    push(n) {\n        this.heap[this.length++] = n;\n    }\n    pop() {\n        return this.heap[--this.length];\n    }\n}\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n    // options that cannot be changed without disaster\n    #max;\n    #maxSize;\n    #dispose;\n    #onInsert;\n    #disposeAfter;\n    #fetchMethod;\n    #memoMethod;\n    /**\n     * {@link LRUCache.OptionsBase.ttl}\n     */\n    ttl;\n    /**\n     * {@link LRUCache.OptionsBase.ttlResolution}\n     */\n    ttlResolution;\n    /**\n     * {@link LRUCache.OptionsBase.ttlAutopurge}\n     */\n    ttlAutopurge;\n    /**\n     * {@link LRUCache.OptionsBase.updateAgeOnGet}\n     */\n    updateAgeOnGet;\n    /**\n     * {@link LRUCache.OptionsBase.updateAgeOnHas}\n     */\n    updateAgeOnHas;\n    /**\n     * {@link LRUCache.OptionsBase.allowStale}\n     */\n    allowStale;\n    /**\n     * {@link LRUCache.OptionsBase.noDisposeOnSet}\n     */\n    noDisposeOnSet;\n    /**\n     * {@link LRUCache.OptionsBase.noUpdateTTL}\n     */\n    noUpdateTTL;\n    /**\n     * {@link LRUCache.OptionsBase.maxEntrySize}\n     */\n    maxEntrySize;\n    /**\n     * {@link LRUCache.OptionsBase.sizeCalculation}\n     */\n    sizeCalculation;\n    /**\n     * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n     */\n    noDeleteOnFetchRejection;\n    /**\n     * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n     */\n    noDeleteOnStaleGet;\n    /**\n     * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n     */\n    allowStaleOnFetchAbort;\n    /**\n     * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n     */\n    allowStaleOnFetchRejection;\n    /**\n     * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n     */\n    ignoreFetchAbort;\n    // computed properties\n    #size;\n    #calculatedSize;\n    #keyMap;\n    #keyList;\n    #valList;\n    #next;\n    #prev;\n    #head;\n    #tail;\n    #free;\n    #disposed;\n    #sizes;\n    #starts;\n    #ttls;\n    #hasDispose;\n    #hasFetchMethod;\n    #hasDisposeAfter;\n    #hasOnInsert;\n    /**\n     * Do not call this method unless you need to inspect the\n     * inner workings of the cache.  If anything returned by this\n     * object is modified in any way, strange breakage may occur.\n     *\n     * These fields are private for a reason!\n     *\n     * @internal\n     */\n    static unsafeExposeInternals(c) {\n        return {\n            // properties\n            starts: c.#starts,\n            ttls: c.#ttls,\n            sizes: c.#sizes,\n            keyMap: c.#keyMap,\n            keyList: c.#keyList,\n            valList: c.#valList,\n            next: c.#next,\n            prev: c.#prev,\n            get head() {\n                return c.#head;\n            },\n            get tail() {\n                return c.#tail;\n            },\n            free: c.#free,\n            // methods\n            isBackgroundFetch: (p) => c.#isBackgroundFetch(p),\n            backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context),\n            moveToTail: (index) => c.#moveToTail(index),\n            indexes: (options) => c.#indexes(options),\n            rindexes: (options) => c.#rindexes(options),\n            isStale: (index) => c.#isStale(index),\n        };\n    }\n    // Protected read-only members\n    /**\n     * {@link LRUCache.OptionsBase.max} (read-only)\n     */\n    get max() {\n        return this.#max;\n    }\n    /**\n     * {@link LRUCache.OptionsBase.maxSize} (read-only)\n     */\n    get maxSize() {\n        return this.#maxSize;\n    }\n    /**\n     * The total computed size of items in the cache (read-only)\n     */\n    get calculatedSize() {\n        return this.#calculatedSize;\n    }\n    /**\n     * The number of items stored in the cache (read-only)\n     */\n    get size() {\n        return this.#size;\n    }\n    /**\n     * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n     */\n    get fetchMethod() {\n        return this.#fetchMethod;\n    }\n    get memoMethod() {\n        return this.#memoMethod;\n    }\n    /**\n     * {@link LRUCache.OptionsBase.dispose} (read-only)\n     */\n    get dispose() {\n        return this.#dispose;\n    }\n    /**\n     * {@link LRUCache.OptionsBase.onInsert} (read-only)\n     */\n    get onInsert() {\n        return this.#onInsert;\n    }\n    /**\n     * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n     */\n    get disposeAfter() {\n        return this.#disposeAfter;\n    }\n    constructor(options) {\n        const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, onInsert, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, memoMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, } = options;\n        if (max !== 0 && !isPosInt(max)) {\n            throw new TypeError('max option must be a nonnegative integer');\n        }\n        const UintArray = max ? getUintArray(max) : Array;\n        if (!UintArray) {\n            throw new Error('invalid max value: ' + max);\n        }\n        this.#max = max;\n        this.#maxSize = maxSize;\n        this.maxEntrySize = maxEntrySize || this.#maxSize;\n        this.sizeCalculation = sizeCalculation;\n        if (this.sizeCalculation) {\n            if (!this.#maxSize && !this.maxEntrySize) {\n                throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize');\n            }\n            if (typeof this.sizeCalculation !== 'function') {\n                throw new TypeError('sizeCalculation set to non-function');\n            }\n        }\n        if (memoMethod !== undefined &&\n            typeof memoMethod !== 'function') {\n            throw new TypeError('memoMethod must be a function if defined');\n        }\n        this.#memoMethod = memoMethod;\n        if (fetchMethod !== undefined &&\n            typeof fetchMethod !== 'function') {\n            throw new TypeError('fetchMethod must be a function if specified');\n        }\n        this.#fetchMethod = fetchMethod;\n        this.#hasFetchMethod = !!fetchMethod;\n        this.#keyMap = new Map();\n        this.#keyList = new Array(max).fill(undefined);\n        this.#valList = new Array(max).fill(undefined);\n        this.#next = new UintArray(max);\n        this.#prev = new UintArray(max);\n        this.#head = 0;\n        this.#tail = 0;\n        this.#free = Stack.create(max);\n        this.#size = 0;\n        this.#calculatedSize = 0;\n        if (typeof dispose === 'function') {\n            this.#dispose = dispose;\n        }\n        if (typeof onInsert === 'function') {\n            this.#onInsert = onInsert;\n        }\n        if (typeof disposeAfter === 'function') {\n            this.#disposeAfter = disposeAfter;\n            this.#disposed = [];\n        }\n        else {\n            this.#disposeAfter = undefined;\n            this.#disposed = undefined;\n        }\n        this.#hasDispose = !!this.#dispose;\n        this.#hasOnInsert = !!this.#onInsert;\n        this.#hasDisposeAfter = !!this.#disposeAfter;\n        this.noDisposeOnSet = !!noDisposeOnSet;\n        this.noUpdateTTL = !!noUpdateTTL;\n        this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection;\n        this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection;\n        this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort;\n        this.ignoreFetchAbort = !!ignoreFetchAbort;\n        // NB: maxEntrySize is set to maxSize if it's set\n        if (this.maxEntrySize !== 0) {\n            if (this.#maxSize !== 0) {\n                if (!isPosInt(this.#maxSize)) {\n                    throw new TypeError('maxSize must be a positive integer if specified');\n                }\n            }\n            if (!isPosInt(this.maxEntrySize)) {\n                throw new TypeError('maxEntrySize must be a positive integer if specified');\n            }\n            this.#initializeSizeTracking();\n        }\n        this.allowStale = !!allowStale;\n        this.noDeleteOnStaleGet = !!noDeleteOnStaleGet;\n        this.updateAgeOnGet = !!updateAgeOnGet;\n        this.updateAgeOnHas = !!updateAgeOnHas;\n        this.ttlResolution =\n            isPosInt(ttlResolution) || ttlResolution === 0\n                ? ttlResolution\n                : 1;\n        this.ttlAutopurge = !!ttlAutopurge;\n        this.ttl = ttl || 0;\n        if (this.ttl) {\n            if (!isPosInt(this.ttl)) {\n                throw new TypeError('ttl must be a positive integer if specified');\n            }\n            this.#initializeTTLTracking();\n        }\n        // do not allow completely unbounded caches\n        if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n            throw new TypeError('At least one of max, maxSize, or ttl is required');\n        }\n        if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n            const code = 'LRU_CACHE_UNBOUNDED';\n            if (shouldWarn(code)) {\n                warned.add(code);\n                const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n                    'result in unbounded memory consumption.';\n                emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache);\n            }\n        }\n    }\n    /**\n     * Return the number of ms left in the item's TTL. If item is not in cache,\n     * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n     */\n    getRemainingTTL(key) {\n        return this.#keyMap.has(key) ? Infinity : 0;\n    }\n    #initializeTTLTracking() {\n        const ttls = new ZeroArray(this.#max);\n        const starts = new ZeroArray(this.#max);\n        this.#ttls = ttls;\n        this.#starts = starts;\n        this.#setItemTTL = (index, ttl, start = perf.now()) => {\n            starts[index] = ttl !== 0 ? start : 0;\n            ttls[index] = ttl;\n            if (ttl !== 0 && this.ttlAutopurge) {\n                const t = setTimeout(() => {\n                    if (this.#isStale(index)) {\n                        this.#delete(this.#keyList[index], 'expire');\n                    }\n                }, ttl + 1);\n                // unref() not supported on all platforms\n                /* c8 ignore start */\n                if (t.unref) {\n                    t.unref();\n                }\n                /* c8 ignore stop */\n            }\n        };\n        this.#updateItemAge = index => {\n            starts[index] = ttls[index] !== 0 ? perf.now() : 0;\n        };\n        this.#statusTTL = (status, index) => {\n            if (ttls[index]) {\n                const ttl = ttls[index];\n                const start = starts[index];\n                /* c8 ignore next */\n                if (!ttl || !start)\n                    return;\n                status.ttl = ttl;\n                status.start = start;\n                status.now = cachedNow || getNow();\n                const age = status.now - start;\n                status.remainingTTL = ttl - age;\n            }\n        };\n        // debounce calls to perf.now() to 1s so we're not hitting\n        // that costly call repeatedly.\n        let cachedNow = 0;\n        const getNow = () => {\n            const n = perf.now();\n            if (this.ttlResolution > 0) {\n                cachedNow = n;\n                const t = setTimeout(() => (cachedNow = 0), this.ttlResolution);\n                // not available on all platforms\n                /* c8 ignore start */\n                if (t.unref) {\n                    t.unref();\n                }\n                /* c8 ignore stop */\n            }\n            return n;\n        };\n        this.getRemainingTTL = key => {\n            const index = this.#keyMap.get(key);\n            if (index === undefined) {\n                return 0;\n            }\n            const ttl = ttls[index];\n            const start = starts[index];\n            if (!ttl || !start) {\n                return Infinity;\n            }\n            const age = (cachedNow || getNow()) - start;\n            return ttl - age;\n        };\n        this.#isStale = index => {\n            const s = starts[index];\n            const t = ttls[index];\n            return !!t && !!s && (cachedNow || getNow()) - s > t;\n        };\n    }\n    // conditionally set private methods related to TTL\n    #updateItemAge = () => { };\n    #statusTTL = () => { };\n    #setItemTTL = () => { };\n    /* c8 ignore stop */\n    #isStale = () => false;\n    #initializeSizeTracking() {\n        const sizes = new ZeroArray(this.#max);\n        this.#calculatedSize = 0;\n        this.#sizes = sizes;\n        this.#removeItemSize = index => {\n            this.#calculatedSize -= sizes[index];\n            sizes[index] = 0;\n        };\n        this.#requireSize = (k, v, size, sizeCalculation) => {\n            // provisionally accept background fetches.\n            // actual value size will be checked when they return.\n            if (this.#isBackgroundFetch(v)) {\n                return 0;\n            }\n            if (!isPosInt(size)) {\n                if (sizeCalculation) {\n                    if (typeof sizeCalculation !== 'function') {\n                        throw new TypeError('sizeCalculation must be a function');\n                    }\n                    size = sizeCalculation(v, k);\n                    if (!isPosInt(size)) {\n                        throw new TypeError('sizeCalculation return invalid (expect positive integer)');\n                    }\n                }\n                else {\n                    throw new TypeError('invalid size value (must be positive integer). ' +\n                        'When maxSize or maxEntrySize is used, sizeCalculation ' +\n                        'or size must be set.');\n                }\n            }\n            return size;\n        };\n        this.#addItemSize = (index, size, status) => {\n            sizes[index] = size;\n            if (this.#maxSize) {\n                const maxSize = this.#maxSize - sizes[index];\n                while (this.#calculatedSize > maxSize) {\n                    this.#evict(true);\n                }\n            }\n            this.#calculatedSize += sizes[index];\n            if (status) {\n                status.entrySize = size;\n                status.totalCalculatedSize = this.#calculatedSize;\n            }\n        };\n    }\n    #removeItemSize = _i => { };\n    #addItemSize = (_i, _s, _st) => { };\n    #requireSize = (_k, _v, size, sizeCalculation) => {\n        if (size || sizeCalculation) {\n            throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache');\n        }\n        return 0;\n    };\n    *#indexes({ allowStale = this.allowStale } = {}) {\n        if (this.#size) {\n            for (let i = this.#tail; true;) {\n                if (!this.#isValidIndex(i)) {\n                    break;\n                }\n                if (allowStale || !this.#isStale(i)) {\n                    yield i;\n                }\n                if (i === this.#head) {\n                    break;\n                }\n                else {\n                    i = this.#prev[i];\n                }\n            }\n        }\n    }\n    *#rindexes({ allowStale = this.allowStale } = {}) {\n        if (this.#size) {\n            for (let i = this.#head; true;) {\n                if (!this.#isValidIndex(i)) {\n                    break;\n                }\n                if (allowStale || !this.#isStale(i)) {\n                    yield i;\n                }\n                if (i === this.#tail) {\n                    break;\n                }\n                else {\n                    i = this.#next[i];\n                }\n            }\n        }\n    }\n    #isValidIndex(index) {\n        return (index !== undefined &&\n            this.#keyMap.get(this.#keyList[index]) === index);\n    }\n    /**\n     * Return a generator yielding `[key, value]` pairs,\n     * in order from most recently used to least recently used.\n     */\n    *entries() {\n        for (const i of this.#indexes()) {\n            if (this.#valList[i] !== undefined &&\n                this.#keyList[i] !== undefined &&\n                !this.#isBackgroundFetch(this.#valList[i])) {\n                yield [this.#keyList[i], this.#valList[i]];\n            }\n        }\n    }\n    /**\n     * Inverse order version of {@link LRUCache.entries}\n     *\n     * Return a generator yielding `[key, value]` pairs,\n     * in order from least recently used to most recently used.\n     */\n    *rentries() {\n        for (const i of this.#rindexes()) {\n            if (this.#valList[i] !== undefined &&\n                this.#keyList[i] !== undefined &&\n                !this.#isBackgroundFetch(this.#valList[i])) {\n                yield [this.#keyList[i], this.#valList[i]];\n            }\n        }\n    }\n    /**\n     * Return a generator yielding the keys in the cache,\n     * in order from most recently used to least recently used.\n     */\n    *keys() {\n        for (const i of this.#indexes()) {\n            const k = this.#keyList[i];\n            if (k !== undefined &&\n                !this.#isBackgroundFetch(this.#valList[i])) {\n                yield k;\n            }\n        }\n    }\n    /**\n     * Inverse order version of {@link LRUCache.keys}\n     *\n     * Return a generator yielding the keys in the cache,\n     * in order from least recently used to most recently used.\n     */\n    *rkeys() {\n        for (const i of this.#rindexes()) {\n            const k = this.#keyList[i];\n            if (k !== undefined &&\n                !this.#isBackgroundFetch(this.#valList[i])) {\n                yield k;\n            }\n        }\n    }\n    /**\n     * Return a generator yielding the values in the cache,\n     * in order from most recently used to least recently used.\n     */\n    *values() {\n        for (const i of this.#indexes()) {\n            const v = this.#valList[i];\n            if (v !== undefined &&\n                !this.#isBackgroundFetch(this.#valList[i])) {\n                yield this.#valList[i];\n            }\n        }\n    }\n    /**\n     * Inverse order version of {@link LRUCache.values}\n     *\n     * Return a generator yielding the values in the cache,\n     * in order from least recently used to most recently used.\n     */\n    *rvalues() {\n        for (const i of this.#rindexes()) {\n            const v = this.#valList[i];\n            if (v !== undefined &&\n                !this.#isBackgroundFetch(this.#valList[i])) {\n                yield this.#valList[i];\n            }\n        }\n    }\n    /**\n     * Iterating over the cache itself yields the same results as\n     * {@link LRUCache.entries}\n     */\n    [Symbol.iterator]() {\n        return this.entries();\n    }\n    /**\n     * A String value that is used in the creation of the default string\n     * description of an object. Called by the built-in method\n     * `Object.prototype.toString`.\n     */\n    [Symbol.toStringTag] = 'LRUCache';\n    /**\n     * Find a value for which the supplied fn method returns a truthy value,\n     * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n     */\n    find(fn, getOptions = {}) {\n        for (const i of this.#indexes()) {\n            const v = this.#valList[i];\n            const value = this.#isBackgroundFetch(v)\n                ? v.__staleWhileFetching\n                : v;\n            if (value === undefined)\n                continue;\n            if (fn(value, this.#keyList[i], this)) {\n                return this.get(this.#keyList[i], getOptions);\n            }\n        }\n    }\n    /**\n     * Call the supplied function on each item in the cache, in order from most\n     * recently used to least recently used.\n     *\n     * `fn` is called as `fn(value, key, cache)`.\n     *\n     * If `thisp` is provided, function will be called in the `this`-context of\n     * the provided object, or the cache if no `thisp` object is provided.\n     *\n     * Does not update age or recenty of use, or iterate over stale values.\n     */\n    forEach(fn, thisp = this) {\n        for (const i of this.#indexes()) {\n            const v = this.#valList[i];\n            const value = this.#isBackgroundFetch(v)\n                ? v.__staleWhileFetching\n                : v;\n            if (value === undefined)\n                continue;\n            fn.call(thisp, value, this.#keyList[i], this);\n        }\n    }\n    /**\n     * The same as {@link LRUCache.forEach} but items are iterated over in\n     * reverse order.  (ie, less recently used items are iterated over first.)\n     */\n    rforEach(fn, thisp = this) {\n        for (const i of this.#rindexes()) {\n            const v = this.#valList[i];\n            const value = this.#isBackgroundFetch(v)\n                ? v.__staleWhileFetching\n                : v;\n            if (value === undefined)\n                continue;\n            fn.call(thisp, value, this.#keyList[i], this);\n        }\n    }\n    /**\n     * Delete any stale entries. Returns true if anything was removed,\n     * false otherwise.\n     */\n    purgeStale() {\n        let deleted = false;\n        for (const i of this.#rindexes({ allowStale: true })) {\n            if (this.#isStale(i)) {\n                this.#delete(this.#keyList[i], 'expire');\n                deleted = true;\n            }\n        }\n        return deleted;\n    }\n    /**\n     * Get the extended info about a given entry, to get its value, size, and\n     * TTL info simultaneously. Returns `undefined` if the key is not present.\n     *\n     * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n     * serialization, the `start` value is always the current timestamp, and the\n     * `ttl` is a calculated remaining time to live (negative if expired).\n     *\n     * Always returns stale values, if their info is found in the cache, so be\n     * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n     * if relevant.\n     */\n    info(key) {\n        const i = this.#keyMap.get(key);\n        if (i === undefined)\n            return undefined;\n        const v = this.#valList[i];\n        const value = this.#isBackgroundFetch(v)\n            ? v.__staleWhileFetching\n            : v;\n        if (value === undefined)\n            return undefined;\n        const entry = { value };\n        if (this.#ttls && this.#starts) {\n            const ttl = this.#ttls[i];\n            const start = this.#starts[i];\n            if (ttl && start) {\n                const remain = ttl - (perf.now() - start);\n                entry.ttl = remain;\n                entry.start = Date.now();\n            }\n        }\n        if (this.#sizes) {\n            entry.size = this.#sizes[i];\n        }\n        return entry;\n    }\n    /**\n     * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n     * passed to {@link LRUCache#load}.\n     *\n     * The `start` fields are calculated relative to a portable `Date.now()`\n     * timestamp, even if `performance.now()` is available.\n     *\n     * Stale entries are always included in the `dump`, even if\n     * {@link LRUCache.OptionsBase.allowStale} is false.\n     *\n     * Note: this returns an actual array, not a generator, so it can be more\n     * easily passed around.\n     */\n    dump() {\n        const arr = [];\n        for (const i of this.#indexes({ allowStale: true })) {\n            const key = this.#keyList[i];\n            const v = this.#valList[i];\n            const value = this.#isBackgroundFetch(v)\n                ? v.__staleWhileFetching\n                : v;\n            if (value === undefined || key === undefined)\n                continue;\n            const entry = { value };\n            if (this.#ttls && this.#starts) {\n                entry.ttl = this.#ttls[i];\n                // always dump the start relative to a portable timestamp\n                // it's ok for this to be a bit slow, it's a rare operation.\n                const age = perf.now() - this.#starts[i];\n                entry.start = Math.floor(Date.now() - age);\n            }\n            if (this.#sizes) {\n                entry.size = this.#sizes[i];\n            }\n            arr.unshift([key, entry]);\n        }\n        return arr;\n    }\n    /**\n     * Reset the cache and load in the items in entries in the order listed.\n     *\n     * The shape of the resulting cache may be different if the same options are\n     * not used in both caches.\n     *\n     * The `start` fields are assumed to be calculated relative to a portable\n     * `Date.now()` timestamp, even if `performance.now()` is available.\n     */\n    load(arr) {\n        this.clear();\n        for (const [key, entry] of arr) {\n            if (entry.start) {\n                // entry.start is a portable timestamp, but we may be using\n                // node's performance.now(), so calculate the offset, so that\n                // we get the intended remaining TTL, no matter how long it's\n                // been on ice.\n                //\n                // it's ok for this to be a bit slow, it's a rare operation.\n                const age = Date.now() - entry.start;\n                entry.start = perf.now() - age;\n            }\n            this.set(key, entry.value, entry);\n        }\n    }\n    /**\n     * Add a value to the cache.\n     *\n     * Note: if `undefined` is specified as a value, this is an alias for\n     * {@link LRUCache#delete}\n     *\n     * Fields on the {@link LRUCache.SetOptions} options param will override\n     * their corresponding values in the constructor options for the scope\n     * of this single `set()` operation.\n     *\n     * If `start` is provided, then that will set the effective start\n     * time for the TTL calculation. Note that this must be a previous\n     * value of `performance.now()` if supported, or a previous value of\n     * `Date.now()` if not.\n     *\n     * Options object may also include `size`, which will prevent\n     * calling the `sizeCalculation` function and just use the specified\n     * number if it is a positive integer, and `noDisposeOnSet` which\n     * will prevent calling a `dispose` function in the case of\n     * overwrites.\n     *\n     * If the `size` (or return value of `sizeCalculation`) for a given\n     * entry is greater than `maxEntrySize`, then the item will not be\n     * added to the cache.\n     *\n     * Will update the recency of the entry.\n     *\n     * If the value is `undefined`, then this is an alias for\n     * `cache.delete(key)`. `undefined` is never stored in the cache.\n     */\n    set(k, v, setOptions = {}) {\n        if (v === undefined) {\n            this.delete(k);\n            return this;\n        }\n        const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions;\n        let { noUpdateTTL = this.noUpdateTTL } = setOptions;\n        const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation);\n        // if the item doesn't fit, don't do anything\n        // NB: maxEntrySize set to maxSize by default\n        if (this.maxEntrySize && size > this.maxEntrySize) {\n            if (status) {\n                status.set = 'miss';\n                status.maxEntrySizeExceeded = true;\n            }\n            // have to delete, in case something is there already.\n            this.#delete(k, 'set');\n            return this;\n        }\n        let index = this.#size === 0 ? undefined : this.#keyMap.get(k);\n        if (index === undefined) {\n            // addition\n            index = (this.#size === 0\n                ? this.#tail\n                : this.#free.length !== 0\n                    ? this.#free.pop()\n                    : this.#size === this.#max\n                        ? this.#evict(false)\n                        : this.#size);\n            this.#keyList[index] = k;\n            this.#valList[index] = v;\n            this.#keyMap.set(k, index);\n            this.#next[this.#tail] = index;\n            this.#prev[index] = this.#tail;\n            this.#tail = index;\n            this.#size++;\n            this.#addItemSize(index, size, status);\n            if (status)\n                status.set = 'add';\n            noUpdateTTL = false;\n            if (this.#hasOnInsert) {\n                this.#onInsert?.(v, k, 'add');\n            }\n        }\n        else {\n            // update\n            this.#moveToTail(index);\n            const oldVal = this.#valList[index];\n            if (v !== oldVal) {\n                if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) {\n                    oldVal.__abortController.abort(new Error('replaced'));\n                    const { __staleWhileFetching: s } = oldVal;\n                    if (s !== undefined && !noDisposeOnSet) {\n                        if (this.#hasDispose) {\n                            this.#dispose?.(s, k, 'set');\n                        }\n                        if (this.#hasDisposeAfter) {\n                            this.#disposed?.push([s, k, 'set']);\n                        }\n                    }\n                }\n                else if (!noDisposeOnSet) {\n                    if (this.#hasDispose) {\n                        this.#dispose?.(oldVal, k, 'set');\n                    }\n                    if (this.#hasDisposeAfter) {\n                        this.#disposed?.push([oldVal, k, 'set']);\n                    }\n                }\n                this.#removeItemSize(index);\n                this.#addItemSize(index, size, status);\n                this.#valList[index] = v;\n                if (status) {\n                    status.set = 'replace';\n                    const oldValue = oldVal && this.#isBackgroundFetch(oldVal)\n                        ? oldVal.__staleWhileFetching\n                        : oldVal;\n                    if (oldValue !== undefined)\n                        status.oldValue = oldValue;\n                }\n            }\n            else if (status) {\n                status.set = 'update';\n            }\n            if (this.#hasOnInsert) {\n                this.onInsert?.(v, k, v === oldVal ? 'update' : 'replace');\n            }\n        }\n        if (ttl !== 0 && !this.#ttls) {\n            this.#initializeTTLTracking();\n        }\n        if (this.#ttls) {\n            if (!noUpdateTTL) {\n                this.#setItemTTL(index, ttl, start);\n            }\n            if (status)\n                this.#statusTTL(status, index);\n        }\n        if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n            const dt = this.#disposed;\n            let task;\n            while ((task = dt?.shift())) {\n                this.#disposeAfter?.(...task);\n            }\n        }\n        return this;\n    }\n    /**\n     * Evict the least recently used item, returning its value or\n     * `undefined` if cache is empty.\n     */\n    pop() {\n        try {\n            while (this.#size) {\n                const val = this.#valList[this.#head];\n                this.#evict(true);\n                if (this.#isBackgroundFetch(val)) {\n                    if (val.__staleWhileFetching) {\n                        return val.__staleWhileFetching;\n                    }\n                }\n                else if (val !== undefined) {\n                    return val;\n                }\n            }\n        }\n        finally {\n            if (this.#hasDisposeAfter && this.#disposed) {\n                const dt = this.#disposed;\n                let task;\n                while ((task = dt?.shift())) {\n                    this.#disposeAfter?.(...task);\n                }\n            }\n        }\n    }\n    #evict(free) {\n        const head = this.#head;\n        const k = this.#keyList[head];\n        const v = this.#valList[head];\n        if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) {\n            v.__abortController.abort(new Error('evicted'));\n        }\n        else if (this.#hasDispose || this.#hasDisposeAfter) {\n            if (this.#hasDispose) {\n                this.#dispose?.(v, k, 'evict');\n            }\n            if (this.#hasDisposeAfter) {\n                this.#disposed?.push([v, k, 'evict']);\n            }\n        }\n        this.#removeItemSize(head);\n        // if we aren't about to use the index, then null these out\n        if (free) {\n            this.#keyList[head] = undefined;\n            this.#valList[head] = undefined;\n            this.#free.push(head);\n        }\n        if (this.#size === 1) {\n            this.#head = this.#tail = 0;\n            this.#free.length = 0;\n        }\n        else {\n            this.#head = this.#next[head];\n        }\n        this.#keyMap.delete(k);\n        this.#size--;\n        return head;\n    }\n    /**\n     * Check if a key is in the cache, without updating the recency of use.\n     * Will return false if the item is stale, even though it is technically\n     * in the cache.\n     *\n     * Check if a key is in the cache, without updating the recency of\n     * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n     * to `true` in either the options or the constructor.\n     *\n     * Will return `false` if the item is stale, even though it is technically in\n     * the cache. The difference can be determined (if it matters) by using a\n     * `status` argument, and inspecting the `has` field.\n     *\n     * Will not update item age unless\n     * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n     */\n    has(k, hasOptions = {}) {\n        const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions;\n        const index = this.#keyMap.get(k);\n        if (index !== undefined) {\n            const v = this.#valList[index];\n            if (this.#isBackgroundFetch(v) &&\n                v.__staleWhileFetching === undefined) {\n                return false;\n            }\n            if (!this.#isStale(index)) {\n                if (updateAgeOnHas) {\n                    this.#updateItemAge(index);\n                }\n                if (status) {\n                    status.has = 'hit';\n                    this.#statusTTL(status, index);\n                }\n                return true;\n            }\n            else if (status) {\n                status.has = 'stale';\n                this.#statusTTL(status, index);\n            }\n        }\n        else if (status) {\n            status.has = 'miss';\n        }\n        return false;\n    }\n    /**\n     * Like {@link LRUCache#get} but doesn't update recency or delete stale\n     * items.\n     *\n     * Returns `undefined` if the item is stale, unless\n     * {@link LRUCache.OptionsBase.allowStale} is set.\n     */\n    peek(k, peekOptions = {}) {\n        const { allowStale = this.allowStale } = peekOptions;\n        const index = this.#keyMap.get(k);\n        if (index === undefined ||\n            (!allowStale && this.#isStale(index))) {\n            return;\n        }\n        const v = this.#valList[index];\n        // either stale and allowed, or forcing a refresh of non-stale value\n        return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n    }\n    #backgroundFetch(k, index, options, context) {\n        const v = index === undefined ? undefined : this.#valList[index];\n        if (this.#isBackgroundFetch(v)) {\n            return v;\n        }\n        const ac = new AC();\n        const { signal } = options;\n        // when/if our AC signals, then stop listening to theirs.\n        signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n            signal: ac.signal,\n        });\n        const fetchOpts = {\n            signal: ac.signal,\n            options,\n            context,\n        };\n        const cb = (v, updateCache = false) => {\n            const { aborted } = ac.signal;\n            const ignoreAbort = options.ignoreFetchAbort && v !== undefined;\n            if (options.status) {\n                if (aborted && !updateCache) {\n                    options.status.fetchAborted = true;\n                    options.status.fetchError = ac.signal.reason;\n                    if (ignoreAbort)\n                        options.status.fetchAbortIgnored = true;\n                }\n                else {\n                    options.status.fetchResolved = true;\n                }\n            }\n            if (aborted && !ignoreAbort && !updateCache) {\n                return fetchFail(ac.signal.reason);\n            }\n            // either we didn't abort, and are still here, or we did, and ignored\n            const bf = p;\n            if (this.#valList[index] === p) {\n                if (v === undefined) {\n                    if (bf.__staleWhileFetching) {\n                        this.#valList[index] = bf.__staleWhileFetching;\n                    }\n                    else {\n                        this.#delete(k, 'fetch');\n                    }\n                }\n                else {\n                    if (options.status)\n                        options.status.fetchUpdated = true;\n                    this.set(k, v, fetchOpts.options);\n                }\n            }\n            return v;\n        };\n        const eb = (er) => {\n            if (options.status) {\n                options.status.fetchRejected = true;\n                options.status.fetchError = er;\n            }\n            return fetchFail(er);\n        };\n        const fetchFail = (er) => {\n            const { aborted } = ac.signal;\n            const allowStaleAborted = aborted && options.allowStaleOnFetchAbort;\n            const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection;\n            const noDelete = allowStale || options.noDeleteOnFetchRejection;\n            const bf = p;\n            if (this.#valList[index] === p) {\n                // if we allow stale on fetch rejections, then we need to ensure that\n                // the stale value is not removed from the cache when the fetch fails.\n                const del = !noDelete || bf.__staleWhileFetching === undefined;\n                if (del) {\n                    this.#delete(k, 'fetch');\n                }\n                else if (!allowStaleAborted) {\n                    // still replace the *promise* with the stale value,\n                    // since we are done with the promise at this point.\n                    // leave it untouched if we're still waiting for an\n                    // aborted background fetch that hasn't yet returned.\n                    this.#valList[index] = bf.__staleWhileFetching;\n                }\n            }\n            if (allowStale) {\n                if (options.status && bf.__staleWhileFetching !== undefined) {\n                    options.status.returnedStale = true;\n                }\n                return bf.__staleWhileFetching;\n            }\n            else if (bf.__returned === bf) {\n                throw er;\n            }\n        };\n        const pcall = (res, rej) => {\n            const fmp = this.#fetchMethod?.(k, v, fetchOpts);\n            if (fmp && fmp instanceof Promise) {\n                fmp.then(v => res(v === undefined ? undefined : v), rej);\n            }\n            // ignored, we go until we finish, regardless.\n            // defer check until we are actually aborting,\n            // so fetchMethod can override.\n            ac.signal.addEventListener('abort', () => {\n                if (!options.ignoreFetchAbort ||\n                    options.allowStaleOnFetchAbort) {\n                    res(undefined);\n                    // when it eventually resolves, update the cache.\n                    if (options.allowStaleOnFetchAbort) {\n                        res = v => cb(v, true);\n                    }\n                }\n            });\n        };\n        if (options.status)\n            options.status.fetchDispatched = true;\n        const p = new Promise(pcall).then(cb, eb);\n        const bf = Object.assign(p, {\n            __abortController: ac,\n            __staleWhileFetching: v,\n            __returned: undefined,\n        });\n        if (index === undefined) {\n            // internal, don't expose status.\n            this.set(k, bf, { ...fetchOpts.options, status: undefined });\n            index = this.#keyMap.get(k);\n        }\n        else {\n            this.#valList[index] = bf;\n        }\n        return bf;\n    }\n    #isBackgroundFetch(p) {\n        if (!this.#hasFetchMethod)\n            return false;\n        const b = p;\n        return (!!b &&\n            b instanceof Promise &&\n            b.hasOwnProperty('__staleWhileFetching') &&\n            b.__abortController instanceof AC);\n    }\n    async fetch(k, fetchOptions = {}) {\n        const { \n        // get options\n        allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, \n        // set options\n        ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, \n        // fetch exclusive options\n        noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions;\n        if (!this.#hasFetchMethod) {\n            if (status)\n                status.fetch = 'get';\n            return this.get(k, {\n                allowStale,\n                updateAgeOnGet,\n                noDeleteOnStaleGet,\n                status,\n            });\n        }\n        const options = {\n            allowStale,\n            updateAgeOnGet,\n            noDeleteOnStaleGet,\n            ttl,\n            noDisposeOnSet,\n            size,\n            sizeCalculation,\n            noUpdateTTL,\n            noDeleteOnFetchRejection,\n            allowStaleOnFetchRejection,\n            allowStaleOnFetchAbort,\n            ignoreFetchAbort,\n            status,\n            signal,\n        };\n        let index = this.#keyMap.get(k);\n        if (index === undefined) {\n            if (status)\n                status.fetch = 'miss';\n            const p = this.#backgroundFetch(k, index, options, context);\n            return (p.__returned = p);\n        }\n        else {\n            // in cache, maybe already fetching\n            const v = this.#valList[index];\n            if (this.#isBackgroundFetch(v)) {\n                const stale = allowStale && v.__staleWhileFetching !== undefined;\n                if (status) {\n                    status.fetch = 'inflight';\n                    if (stale)\n                        status.returnedStale = true;\n                }\n                return stale ? v.__staleWhileFetching : (v.__returned = v);\n            }\n            // if we force a refresh, that means do NOT serve the cached value,\n            // unless we are already in the process of refreshing the cache.\n            const isStale = this.#isStale(index);\n            if (!forceRefresh && !isStale) {\n                if (status)\n                    status.fetch = 'hit';\n                this.#moveToTail(index);\n                if (updateAgeOnGet) {\n                    this.#updateItemAge(index);\n                }\n                if (status)\n                    this.#statusTTL(status, index);\n                return v;\n            }\n            // ok, it is stale or a forced refresh, and not already fetching.\n            // refresh the cache.\n            const p = this.#backgroundFetch(k, index, options, context);\n            const hasStale = p.__staleWhileFetching !== undefined;\n            const staleVal = hasStale && allowStale;\n            if (status) {\n                status.fetch = isStale ? 'stale' : 'refresh';\n                if (staleVal && isStale)\n                    status.returnedStale = true;\n            }\n            return staleVal ? p.__staleWhileFetching : (p.__returned = p);\n        }\n    }\n    async forceFetch(k, fetchOptions = {}) {\n        const v = await this.fetch(k, fetchOptions);\n        if (v === undefined)\n            throw new Error('fetch() returned undefined');\n        return v;\n    }\n    memo(k, memoOptions = {}) {\n        const memoMethod = this.#memoMethod;\n        if (!memoMethod) {\n            throw new Error('no memoMethod provided to constructor');\n        }\n        const { context, forceRefresh, ...options } = memoOptions;\n        const v = this.get(k, options);\n        if (!forceRefresh && v !== undefined)\n            return v;\n        const vv = memoMethod(k, v, {\n            options,\n            context,\n        });\n        this.set(k, vv, options);\n        return vv;\n    }\n    /**\n     * Return a value from the cache. Will update the recency of the cache\n     * entry found.\n     *\n     * If the key is not found, get() will return `undefined`.\n     */\n    get(k, getOptions = {}) {\n        const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions;\n        const index = this.#keyMap.get(k);\n        if (index !== undefined) {\n            const value = this.#valList[index];\n            const fetching = this.#isBackgroundFetch(value);\n            if (status)\n                this.#statusTTL(status, index);\n            if (this.#isStale(index)) {\n                if (status)\n                    status.get = 'stale';\n                // delete only if not an in-flight background fetch\n                if (!fetching) {\n                    if (!noDeleteOnStaleGet) {\n                        this.#delete(k, 'expire');\n                    }\n                    if (status && allowStale)\n                        status.returnedStale = true;\n                    return allowStale ? value : undefined;\n                }\n                else {\n                    if (status &&\n                        allowStale &&\n                        value.__staleWhileFetching !== undefined) {\n                        status.returnedStale = true;\n                    }\n                    return allowStale ? value.__staleWhileFetching : undefined;\n                }\n            }\n            else {\n                if (status)\n                    status.get = 'hit';\n                // if we're currently fetching it, we don't actually have it yet\n                // it's not stale, which means this isn't a staleWhileRefetching.\n                // If it's not stale, and fetching, AND has a __staleWhileFetching\n                // value, then that means the user fetched with {forceRefresh:true},\n                // so it's safe to return that value.\n                if (fetching) {\n                    return value.__staleWhileFetching;\n                }\n                this.#moveToTail(index);\n                if (updateAgeOnGet) {\n                    this.#updateItemAge(index);\n                }\n                return value;\n            }\n        }\n        else if (status) {\n            status.get = 'miss';\n        }\n    }\n    #connect(p, n) {\n        this.#prev[n] = p;\n        this.#next[p] = n;\n    }\n    #moveToTail(index) {\n        // if tail already, nothing to do\n        // if head, move head to next[index]\n        // else\n        //   move next[prev[index]] to next[index] (head has no prev)\n        //   move prev[next[index]] to prev[index]\n        // prev[index] = tail\n        // next[tail] = index\n        // tail = index\n        if (index !== this.#tail) {\n            if (index === this.#head) {\n                this.#head = this.#next[index];\n            }\n            else {\n                this.#connect(this.#prev[index], this.#next[index]);\n            }\n            this.#connect(this.#tail, index);\n            this.#tail = index;\n        }\n    }\n    /**\n     * Deletes a key out of the cache.\n     *\n     * Returns true if the key was deleted, false otherwise.\n     */\n    delete(k) {\n        return this.#delete(k, 'delete');\n    }\n    #delete(k, reason) {\n        let deleted = false;\n        if (this.#size !== 0) {\n            const index = this.#keyMap.get(k);\n            if (index !== undefined) {\n                deleted = true;\n                if (this.#size === 1) {\n                    this.#clear(reason);\n                }\n                else {\n                    this.#removeItemSize(index);\n                    const v = this.#valList[index];\n                    if (this.#isBackgroundFetch(v)) {\n                        v.__abortController.abort(new Error('deleted'));\n                    }\n                    else if (this.#hasDispose || this.#hasDisposeAfter) {\n                        if (this.#hasDispose) {\n                            this.#dispose?.(v, k, reason);\n                        }\n                        if (this.#hasDisposeAfter) {\n                            this.#disposed?.push([v, k, reason]);\n                        }\n                    }\n                    this.#keyMap.delete(k);\n                    this.#keyList[index] = undefined;\n                    this.#valList[index] = undefined;\n                    if (index === this.#tail) {\n                        this.#tail = this.#prev[index];\n                    }\n                    else if (index === this.#head) {\n                        this.#head = this.#next[index];\n                    }\n                    else {\n                        const pi = this.#prev[index];\n                        this.#next[pi] = this.#next[index];\n                        const ni = this.#next[index];\n                        this.#prev[ni] = this.#prev[index];\n                    }\n                    this.#size--;\n                    this.#free.push(index);\n                }\n            }\n        }\n        if (this.#hasDisposeAfter && this.#disposed?.length) {\n            const dt = this.#disposed;\n            let task;\n            while ((task = dt?.shift())) {\n                this.#disposeAfter?.(...task);\n            }\n        }\n        return deleted;\n    }\n    /**\n     * Clear the cache entirely, throwing away all values.\n     */\n    clear() {\n        return this.#clear('delete');\n    }\n    #clear(reason) {\n        for (const index of this.#rindexes({ allowStale: true })) {\n            const v = this.#valList[index];\n            if (this.#isBackgroundFetch(v)) {\n                v.__abortController.abort(new Error('deleted'));\n            }\n            else {\n                const k = this.#keyList[index];\n                if (this.#hasDispose) {\n                    this.#dispose?.(v, k, reason);\n                }\n                if (this.#hasDisposeAfter) {\n                    this.#disposed?.push([v, k, reason]);\n                }\n            }\n        }\n        this.#keyMap.clear();\n        this.#valList.fill(undefined);\n        this.#keyList.fill(undefined);\n        if (this.#ttls && this.#starts) {\n            this.#ttls.fill(0);\n            this.#starts.fill(0);\n        }\n        if (this.#sizes) {\n            this.#sizes.fill(0);\n        }\n        this.#head = 0;\n        this.#tail = 0;\n        this.#free.length = 0;\n        this.#calculatedSize = 0;\n        this.#size = 0;\n        if (this.#hasDisposeAfter && this.#disposed) {\n            const dt = this.#disposed;\n            let task;\n            while ((task = dt?.shift())) {\n                this.#disposeAfter?.(...task);\n            }\n        }\n    }\n}\n//# sourceMappingURL=index.js.map","import { LRUCache } from \"lru-cache\";\r\nimport { AnyTileBasicData, AnyTileData, TileData } from \"../virtual-meshes\";\r\n\r\nexport class VirtualMemoryController {\r\n  private static readonly oneHundredMb = 100000000;\r\n\r\n  private static _meshes = this.setupMeshes();\r\n  private static _capacity: number;\r\n\r\n  private static readonly _memoryAttributes: (keyof TileData)[] = [\r\n    \"positionBuffer\",\r\n    \"indexBuffer\",\r\n    \"normalBuffer\",\r\n  ];\r\n\r\n  static get(id: number) {\r\n    return this._meshes.get(id);\r\n  }\r\n\r\n  static lockIn(mesh: AnyTileBasicData) {\r\n    Object.seal(mesh);\r\n  }\r\n\r\n  static add(id: number, mesh: AnyTileData) {\r\n    this._meshes.set(id, mesh);\r\n  }\r\n\r\n  static delete(ids: Iterable<number>) {\r\n    for (const id of ids) {\r\n      this._meshes.delete(id);\r\n    }\r\n  }\r\n\r\n  static updateMeshMemory = (mesh: TileData) => {\r\n    mesh.usedMemory = 0;\r\n    for (const key of this._memoryAttributes) {\r\n      if (mesh.usedMemory !== undefined && mesh[key]) {\r\n        mesh.usedMemory += (mesh[key] as any).byteLength;\r\n      }\r\n    }\r\n    this.lockIn(mesh);\r\n  };\r\n\r\n  static setCapacity(value: number) {\r\n    if (value === this._capacity) return;\r\n    this._meshes.clear();\r\n    this._meshes = this.setupMeshes(value);\r\n    this._capacity = value;\r\n  }\r\n\r\n  private static setupMeshes(size?: number) {\r\n    const maxSize = Math.max(size ?? this.computeCapacity(), 1);\r\n    const sizeCalculation = this.getSizeCalculationEvent();\r\n    const lruInput = { maxSize, sizeCalculation };\r\n    return new LRUCache<number, AnyTileData>(lruInput);\r\n  }\r\n\r\n  private static computeCapacity(): number {\r\n    const deviceMemory =\r\n      globalThis.navigator && \"deviceMemory\" in globalThis.navigator\r\n        ? (globalThis.navigator.deviceMemory as number)\r\n        : null;\r\n    const fallbackMemory = 2;\r\n    const baseMemory = deviceMemory !== null ? deviceMemory : fallbackMemory;\r\n    const result = this.oneHundredMb * baseMemory;\r\n    return Math.trunc(result);\r\n  }\r\n\r\n  private static getDataSetMemory(mesh: TileData[]) {\r\n    let usedMemory = 0;\r\n    for (const item of mesh) {\r\n      usedMemory += item.usedMemory!;\r\n    }\r\n    return Math.max(usedMemory, 1);\r\n  }\r\n\r\n  private static getSizeCalculationEvent() {\r\n    return (mesh: AnyTileData) => {\r\n      if (!Array.isArray(mesh)) {\r\n        return Math.max(mesh.usedMemory!, 1);\r\n      }\r\n      return this.getDataSetMemory(mesh);\r\n    };\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport {\r\n  TileData,\r\n  LodClass,\r\n  normalizationValue,\r\n  VirtualMeshManager,\r\n  VirtualShellManager,\r\n  VirtualCircleExtrusionManager,\r\n} from \"../virtual-meshes\";\r\nimport {\r\n  ObjectClass,\r\n  CurrentLod,\r\n  DataBuffer,\r\n  limitOf2Bytes,\r\n  TileRequestClass,\r\n  SnappingClass,\r\n  LodMode,\r\n} from \"../../model/model-types\";\r\nimport { VirtualBoxController } from \"../../bounding-boxes\";\r\nimport {\r\n  CRC,\r\n  CameraUtils,\r\n  MultiBufferData,\r\n  TransformHelper,\r\n  MiscHelper,\r\n  BoxUtils,\r\n} from \"../../utils\";\r\n\r\nimport { Connection } from \"../../multithreading/connection\";\r\nimport {\r\n  RepresentationClass,\r\n  Model,\r\n  Meshes,\r\n  Sample,\r\n  Representation,\r\n} from \"../../../../Schema\";\r\nimport { ItemConfigController } from \"./item-config-controller\";\r\nimport { MeshConnection } from \"../../multithreading/mesh-connection\";\r\nimport { RaycastController } from \"./raycast-controller\";\r\nimport { VirtualMemoryController } from \"./virtual-memory-controller\";\r\n\r\ntype VirtualMeshes = Map<RepresentationClass, VirtualMeshManager>;\r\n\r\nexport type VirtualTileData = {\r\n  modelId: string;\r\n  connection: Connection;\r\n  model: Model;\r\n  boxes: VirtualBoxController;\r\n  items: ItemConfigController;\r\n  materials: number[];\r\n};\r\n\r\nenum TileDimension {\r\n  SMALL = 0,\r\n  MEDIUM = 1,\r\n  LARGE = 2,\r\n}\r\n\r\nexport class VirtualTilesController {\r\n  meshes: Meshes;\r\n  tilesUpdated = false;\r\n\r\n  private static _graphicMemoryConsumed = 0;\r\n\r\n  private readonly _sampleAmount: number;\r\n  private readonly _tileDimension: number;\r\n  private readonly _tileBySample: Array<number | number[]>;\r\n  private readonly _lodBySample: number[];\r\n  private readonly _virtualMeshes: VirtualMeshes = new Map();\r\n  private readonly _meshConnection: MeshConnection;\r\n  private readonly _samples: ItemConfigController;\r\n  private readonly _tileIdGenerator = new CRC();\r\n  private readonly _tiles = new Map<number, TileData>();\r\n  private readonly _tilesChanged = new Set<number>();\r\n  private readonly _sizeByTile = new Map<number, number>();\r\n  private readonly _samplesDimensions: DataBuffer;\r\n  private readonly _sampleLodClass: DataBuffer;\r\n  private readonly _sampleLodState: DataBuffer;\r\n  private readonly _sampleLodSize: DataBuffer;\r\n  private readonly _boxes: VirtualBoxController;\r\n  private readonly _items: ItemConfigController;\r\n  private readonly _materials: number[];\r\n  private readonly _modelId: string;\r\n\r\n  private readonly _lastView = {\r\n    rotation: new THREE.Vector3(),\r\n    location: new THREE.Vector3(),\r\n  };\r\n  private readonly _params = {\r\n    updateTime: 16,\r\n    updateSamples: 64,\r\n    updateviewOrientation: (8 * Math.PI) / 180,\r\n    updateViewPosition: 256,\r\n    smallTileSize: 0.32,\r\n    mediumTileSize: 4,\r\n    smallObjectSize: 2,\r\n    smallScreenSize: 2,\r\n    mediumScreenSize: 4,\r\n    largeScreenSize: 16,\r\n    tempTileDataSize: 6,\r\n    tileIdIncrement: 1,\r\n    tileSizeMultiplier: 10,\r\n    minTileDimension: 32,\r\n    tileDimensionFactor: 8,\r\n  };\r\n\r\n  private readonly _temp = {\r\n    sample: new Sample(),\r\n    representation: new Representation(),\r\n    vector: new THREE.Vector3(),\r\n    matrix: new THREE.Matrix4(),\r\n    transform: new THREE.Matrix4(),\r\n    boundingBox: new THREE.Box3(),\r\n    sampleGeometry: {} as any,\r\n    box: new THREE.Box3(),\r\n    raycastPoints: [] as any[],\r\n    tileData: {\r\n      positionCount: this._params.tempTileDataSize,\r\n      objectClass: ObjectClass.LINE,\r\n      positionBuffer: new Float32Array(this._params.tempTileDataSize),\r\n    } as TileData,\r\n    tileCenter: new THREE.Vector3(),\r\n    tile: {\r\n      objectClass: ObjectClass.LINE,\r\n      positionCount: 6,\r\n    } as TileData,\r\n    viewDimension: 0,\r\n    pastFieldOfview: 0,\r\n  };\r\n\r\n  private _currentSample = 0;\r\n  private _virtualPlanes: THREE.Plane[] = [];\r\n  private _changedSamples = 0;\r\n  private _virtualView: any;\r\n\r\n  private _lodMode = LodMode.DEFAULT;\r\n\r\n  constructor(data: VirtualTileData) {\r\n    this._modelId = data.modelId;\r\n    this._boxes = data.boxes;\r\n    this._items = data.items;\r\n    this._materials = data.materials;\r\n    this._meshConnection = new MeshConnection(data.modelId, data.connection);\r\n    this.meshes = data.model.meshes() as Meshes;\r\n    this._sampleAmount = this.meshes.samplesLength();\r\n    this._samples = new ItemConfigController(this._sampleAmount);\r\n    this._samplesDimensions = new Int32Array(this._sampleAmount);\r\n    this._sampleLodClass = new Uint8Array(this._sampleAmount);\r\n    this._sampleLodState = new Uint8Array(this._sampleAmount);\r\n    this._sampleLodSize = new Float32Array(this._sampleAmount);\r\n    this._tileDimension = this.computeTileSize();\r\n    this._tileBySample = new Array(this._sampleAmount);\r\n    this._lodBySample = new Array(this._sampleAmount);\r\n    this.init();\r\n  }\r\n\r\n  restart() {\r\n    this.resetUpdateProcess();\r\n    this._meshConnection.clean();\r\n  }\r\n\r\n  fetchSample(id: number, lod: CurrentLod) {\r\n    this.fetchSampleAndRepresentation(id);\r\n    const mesh = this.fetchCurrentMesh();\r\n    const sample = this.sampleTemplate(id);\r\n    sample.geometries = this.sampleGeoms(sample, lod, mesh);\r\n    return sample;\r\n  }\r\n\r\n  fetchGeometry(id: number) {\r\n    this.meshes.representations(id, this._temp.representation);\r\n    const mesh = this.fetchCurrentMesh();\r\n    return mesh.fetchMeshes(id, true);\r\n  }\r\n\r\n  dispose() {\r\n    this._meshConnection.dispose();\r\n    for (const [, mesh] of this._virtualMeshes) {\r\n      mesh.dispose();\r\n    }\r\n  }\r\n\r\n  async generate(\r\n    onProgress?: (progress: number) => void,\r\n    throwIfAborted?: () => void,\r\n  ) {\r\n    for (const [, mesh] of this._virtualMeshes) {\r\n      mesh.setupTemplates();\r\n    }\r\n    const step = Math.max(1, Math.floor(this._sampleAmount / 20));\r\n    for (let i = 0; i < this._sampleAmount; i++) {\r\n      this.generateSampleInTiles(i);\r\n      if (i % step === 0) {\r\n        onProgress?.(i / this._sampleAmount);\r\n        // Yield the worker thread so progress messages get dispatched\r\n        // and pending ABORT_MODEL messages can be processed.\r\n        await new Promise<void>((resolve) => setTimeout(resolve, 0));\r\n        throwIfAborted?.();\r\n      }\r\n    }\r\n    this.setupTileVisibilityAndHighlight();\r\n  }\r\n\r\n  setupView(view: any) {\r\n    this._virtualView = view;\r\n    VirtualMemoryController.setCapacity(view.meshThreshold);\r\n    this.restart();\r\n    this.updateOrientationIfNeeded();\r\n    this.updatePositionIfNeeded();\r\n    this.setupViewPlanes();\r\n  }\r\n\r\n  updateVirtualMeshes(itemIds: number[]) {\r\n    if (!itemIds || !this._virtualView) {\r\n      return;\r\n    }\r\n    for (const itemId of itemIds) {\r\n      this.updateItem(itemId);\r\n    }\r\n    this.restart();\r\n  }\r\n\r\n  getSampleTransform(id: number) {\r\n    this.fetchSampleAndRepresentation(id);\r\n    const sample = this.sampleTemplate(id);\r\n    return sample.transform;\r\n  }\r\n\r\n  async update(time: number) {\r\n    this.updateTiles(time);\r\n    this.notifyUpdateFinished();\r\n    for (const tileId of this._tilesChanged) {\r\n      const tile = this._tiles.get(tileId) as TileData;\r\n      this._meshConnection.process({\r\n        tileRequestClass: TileRequestClass.UPDATE,\r\n        modelId: this._modelId,\r\n        tileId,\r\n        objectClass: tile.objectClass,\r\n        material: tile.materialId as number,\r\n        tileData: this.getTileData(tile),\r\n        currentLod: tile.lod as number,\r\n      });\r\n    }\r\n    this._tilesChanged.clear();\r\n  }\r\n\r\n  raycast(\r\n    representation: Representation,\r\n    ray: THREE.Ray,\r\n    frustum: THREE.Frustum,\r\n    snap?: SnappingClass,\r\n  ) {\r\n    this._temp.raycastPoints = [];\r\n    const rClass = representation.representationClass();\r\n    const mesh = this._virtualMeshes.get(rClass) as VirtualMeshManager;\r\n    this.manageRaycast(mesh, representation, ray, frustum, snap);\r\n    return this._temp.raycastPoints;\r\n  }\r\n\r\n  setLodMode(lodMode: LodMode) {\r\n    this._lodMode = lodMode;\r\n    this.restart();\r\n  }\r\n\r\n  private init() {\r\n    const shells = new VirtualShellManager(this._modelId, this.meshes);\r\n    const shellsRepresentation = shells.getRepresentation();\r\n    this._virtualMeshes.set(shellsRepresentation, shells);\r\n    const ces = new VirtualCircleExtrusionManager(this._modelId, this.meshes);\r\n    const cesRepresentation = ces.getRepresentation();\r\n    this._virtualMeshes.set(cesRepresentation, ces);\r\n    this.processSamplesDimension();\r\n    this.fetchSampleLodSize();\r\n  }\r\n\r\n  private initSampleLod(id: number) {\r\n    this.fetchSampleAndRepresentation(id);\r\n    const mesh = this.fetchCurrentMesh();\r\n    this._sampleLodClass[id] = mesh.getLodClass();\r\n    this._sampleLodState[id] = CurrentLod.INVISIBLE;\r\n  }\r\n\r\n  private fetchSampleAndRepresentation(id: number) {\r\n    this.meshes.samples(id, this._temp.sample);\r\n    this.meshes.representations(\r\n      this._temp.sample.representation(),\r\n      this._temp.representation,\r\n    );\r\n  }\r\n\r\n  private fetchCurrentMesh() {\r\n    const rClass = this._temp.representation.representationClass();\r\n    return this._virtualMeshes.get(rClass) as VirtualMeshManager;\r\n  }\r\n\r\n  private fetchCurrentMaterial() {\r\n    const materialId = this._temp.sample.material();\r\n    return this._materials[materialId];\r\n  }\r\n\r\n  private fetchSampleLodSize() {\r\n    for (let i = 0; i < this._sampleAmount; i++) {\r\n      this.initSampleLod(i);\r\n      TransformHelper.getBox(this._temp.representation, this._temp.box);\r\n      this._sampleLodSize[i] = BoxUtils.getWidth(this._temp.box);\r\n    }\r\n  }\r\n\r\n  private setupTileVisibilityAndHighlight() {\r\n    for (const [, tile] of this._tiles) {\r\n      tile.visibilities = new MultiBufferData<boolean>(tile.size, false);\r\n      tile.highlights = new MultiBufferData<number>(tile.size, 0);\r\n    }\r\n  }\r\n\r\n  private addLodToTile(mesh: VirtualMeshManager, id: number, material: number) {\r\n    if (mesh.getLodClass() === LodClass.AABB) {\r\n      this.addBoxLodToTile(id, material);\r\n      return;\r\n    }\r\n\r\n    if (mesh.getLodClass() === LodClass.CUSTOM) {\r\n      this.addCustomLodToTile(mesh, id, material);\r\n    }\r\n  }\r\n\r\n  private addBoxLodToTile(id: number, material: number) {\r\n    this._lodBySample[id] = this.lodTileAppendSample(id, material);\r\n  }\r\n\r\n  private notifyUpdateFinished() {\r\n    const noficationNotSentYet = !this.tilesUpdated;\r\n    const samplesUpdated = this._changedSamples >= this._sampleAmount;\r\n    const updateFinished = samplesUpdated && noficationNotSentYet;\r\n    if (!updateFinished) {\r\n      return;\r\n    }\r\n    this._meshConnection.process({\r\n      tileRequestClass: TileRequestClass.FINISH,\r\n      modelId: this._modelId,\r\n    });\r\n    this.tilesUpdated = true;\r\n  }\r\n\r\n  private updatePositionIfNeeded() {\r\n    const positionThreshold = this._params.updateViewPosition;\r\n    const pos = this._virtualView.cameraPosition;\r\n    const positionChange = pos.distanceToSquared(this._lastView.location);\r\n    const positionNeedsUpdate = positionChange > positionThreshold;\r\n    if (positionNeedsUpdate) {\r\n      this._currentSample = 0;\r\n      this._lastView.location.copy(pos);\r\n    }\r\n  }\r\n\r\n  private updateCurrentSample() {\r\n    this._currentSample++;\r\n    if (this._currentSample >= this._sampleAmount) {\r\n      this._currentSample = 0;\r\n    }\r\n    this._changedSamples++;\r\n  }\r\n\r\n  private processSamplesDimension() {\r\n    for (let i = 0; i < this._sampleAmount; i++) {\r\n      this._samplesDimensions[i] = i;\r\n    }\r\n    this._samplesDimensions.sort((a, b) => {\r\n      const bDimension = this._boxes.dimensionOf(b);\r\n      const aDimension = this._boxes.dimensionOf(a);\r\n      return bDimension - aDimension;\r\n    });\r\n  }\r\n\r\n  private setupViewPlanes() {\r\n    this._virtualPlanes = [];\r\n    for (const plane of this._virtualView.cameraFrustum.planes) {\r\n      this._virtualPlanes.push(plane);\r\n    }\r\n    if (this._virtualView.clippingPlanes) {\r\n      for (const plane of this._virtualView.clippingPlanes) {\r\n        this._virtualPlanes.push(plane);\r\n      }\r\n    }\r\n  }\r\n\r\n  private updateOrientationIfNeeded() {\r\n    const orientation = this.getCurrentViewOrientation();\r\n    const orientationThreshold = this._params.updateviewOrientation;\r\n    const orientationChange = orientation.angleTo(this._lastView.rotation);\r\n    const orientationNeedsUpdate = orientationChange > orientationThreshold;\r\n    if (orientationNeedsUpdate) {\r\n      this._currentSample = 0;\r\n      this._lastView.rotation.copy(orientation);\r\n    }\r\n  }\r\n\r\n  private getCurrentViewOrientation() {\r\n    return this._virtualView.cameraFrustum.planes[4].normal;\r\n  }\r\n\r\n  private resetUpdateProcess() {\r\n    this._changedSamples = 0;\r\n    this.tilesUpdated = false;\r\n  }\r\n\r\n  private manageRaycast(\r\n    mesh: VirtualMeshManager,\r\n    repr: Representation,\r\n    ray: THREE.Ray,\r\n    frustum: THREE.Frustum,\r\n    snap?: SnappingClass,\r\n  ) {\r\n    const found = RaycastController.cast(mesh, repr, ray, frustum, snap);\r\n    if (found) {\r\n      for (const point of found) {\r\n        point.representationClass = mesh.getObjectClass();\r\n        this._temp.raycastPoints.push(point);\r\n      }\r\n    }\r\n  }\r\n\r\n  private setTileShellBuffer(tile: TileData) {\r\n    if (\r\n      tile.usedMemory === undefined ||\r\n      tile.objectClass !== ObjectClass.SHELL\r\n    ) {\r\n      return;\r\n    }\r\n    tile.ids = new Float32Array(tile.positionCount! / 3);\r\n    tile.usedMemory += tile.ids.byteLength;\r\n  }\r\n\r\n  private getTileWhenSamplePut(\r\n    tileId: number,\r\n    tileData: TileData,\r\n    material: number,\r\n  ) {\r\n    let tile = this._tiles.get(tileId);\r\n    if (tile === undefined) {\r\n      const lod = tileData.lod || CurrentLod.GEOMETRY;\r\n      tile = this.newTile(tileData.objectClass, material, lod);\r\n      this._tiles.set(tileId, tile);\r\n    }\r\n    return tile;\r\n  }\r\n\r\n  private getPerspTrueDim(fov: number, distance: number) {\r\n    const radFactor = Math.PI / 180;\r\n    const tan = Math.tan(fov * 0.5 * radFactor);\r\n    return distance * tan;\r\n  }\r\n\r\n  private getTileHighlight(tile: TileData, locations: number[]) {\r\n    let highlightData: any = undefined as any;\r\n    let highlightIds: any = undefined as any;\r\n    const highlights = tile.highlights;\r\n    if (!highlights) {\r\n      return { highlightData: undefined, highlightIds: undefined };\r\n    }\r\n\r\n    const highlightSize = highlights.size((id) => id !== 0);\r\n    if (highlightSize > 0) {\r\n      highlightIds = new Uint16Array(highlightSize);\r\n      const f = (id: number) => id !== 0;\r\n      const c = (id: number, data: number) => (highlightIds[id] = data);\r\n      highlightData = MultiBufferData.get(highlights, locations, f, c);\r\n    }\r\n\r\n    return { highlightData, highlightIds };\r\n  }\r\n\r\n  private setupTileSampleAttributes(\r\n    tile: TileData,\r\n    location: number,\r\n    geometry: any,\r\n    sample: any,\r\n  ) {\r\n    const resultPosition = tile.vertexLocation[location] * 3;\r\n    for (let i = 0; i < geometry.positionBuffer!.length; i += 3) {\r\n      this._temp.vector.fromArray(geometry.positionBuffer!, i);\r\n      this._temp.vector.applyMatrix4(this._temp.matrix);\r\n      this._temp.vector.toArray(tile.positionBuffer!, resultPosition + i);\r\n    }\r\n\r\n    if (tile.normalBuffer) {\r\n      const resultPosition = tile.vertexLocation[location] * 3;\r\n      for (let i = 0; i < geometry.normalBuffer!.length; i += 3) {\r\n        this._temp.vector.fromArray(geometry.normalBuffer!, i);\r\n        this._temp.vector.transformDirection(this._temp.matrix);\r\n        this._temp.vector.multiplyScalar(normalizationValue);\r\n        this._temp.vector.toArray(tile.normalBuffer!, resultPosition + i);\r\n      }\r\n    }\r\n\r\n    if (tile.indexBuffer) {\r\n      const indicesPosition = tile.indexLocation[location];\r\n      const position = tile.vertexLocation[location];\r\n      for (let i = 0; i < geometry.indexCount!; i++) {\r\n        const result = geometry.indexBuffer![i] + position;\r\n        tile.indexBuffer[i + indicesPosition] = result;\r\n      }\r\n    }\r\n\r\n    if (tile.faceIdBuffer && geometry.faceIdBuffer) {\r\n      // We define an offset to the ID to force that different samples have different face IDs\r\n      const sampleOffset = sample.sample * 100;\r\n      const start = tile.vertexLocation[location];\r\n      const end = start + geometry.positionCount! / 3;\r\n      for (let i = start; i < end; i++) {\r\n        tile.faceIdBuffer[i] = geometry.faceIdBuffer[i - start] + sampleOffset;\r\n      }\r\n    }\r\n\r\n    if (geometry.objectClass === ObjectClass.SHELL) {\r\n      const start = tile.vertexLocation[location];\r\n      const end = start + geometry.positionCount! / 3;\r\n      tile.ids!.fill(this.itemId(sample.sample), start, end);\r\n    }\r\n  }\r\n\r\n  private getTileVisibility(tile: TileData, locations: number[]) {\r\n    if (!tile.visibilities) {\r\n      throw new Error(\"Fragments: Malformed tile!\");\r\n    }\r\n    if (tile.visibilities.fullOf(false)) {\r\n      return undefined;\r\n    }\r\n    const filter = (data: boolean) => data;\r\n    return MultiBufferData.get(tile.visibilities!, locations, filter);\r\n  }\r\n\r\n  private memoryOverflow() {\r\n    const current = VirtualTilesController._graphicMemoryConsumed;\r\n    const available = this._virtualView.graphicThreshold;\r\n    return current > available;\r\n  }\r\n\r\n  private updateMesh(sample: number) {\r\n    let current = this.fetchLodLevel(sample);\r\n    const past = this._sampleLodState[sample];\r\n    current = this.hideHighlightedLods(current, sample);\r\n    if (current === past) {\r\n      this.updateSampleIfSeen(current, sample);\r\n      return;\r\n    }\r\n    this.updateVisible(past, current, sample);\r\n  }\r\n\r\n  private tileLoadSample(tile: TileData, sample: any, geomIndex: number) {\r\n    const location = tile.sampleLocation.get(sample.sample) as number;\r\n    const geometry = this.getSampleGeometries(sample, geomIndex);\r\n    this.setupTileLocation(tile, geometry, sample);\r\n    this.fetchSampleTransform(tile, sample);\r\n    this.setupTileSampleAttributes(tile, location, geometry, sample);\r\n  }\r\n\r\n  private updateSampleIfSeen(current: CurrentLod, sample: number) {\r\n    if (current !== CurrentLod.INVISIBLE) {\r\n      this.updateSample(sample, current);\r\n    }\r\n  }\r\n\r\n  private hideHighlightedLods(current: CurrentLod, _sample: number) {\r\n    return current;\r\n  }\r\n\r\n  private updateVisible(past: CurrentLod, current: CurrentLod, sample: number) {\r\n    if (past !== CurrentLod.INVISIBLE) {\r\n      this.makeSampleInvisible(sample, past);\r\n    }\r\n    const isSeen = current !== CurrentLod.INVISIBLE;\r\n    if (isSeen) {\r\n      this.updateSample(sample, current);\r\n    }\r\n    this._samples.setVisible(sample, isSeen);\r\n    this._sampleLodState[sample] = current;\r\n  }\r\n\r\n  private makeInvisibleFromTile(tileId: number, sample: number) {\r\n    const tile = this._tiles.get(tileId) as TileData;\r\n    this.updateTileData(tile, sample, false, 0);\r\n    this.deleteTileIfNeeded(tile, tileId);\r\n  }\r\n\r\n  private updateSample(id: number, lod: CurrentLod) {\r\n    const itemId = this.itemId(id);\r\n    const visible = this._items.visible(itemId);\r\n    const highlight = this._items.getHighlight(itemId);\r\n    const changed = this.hasChanged(id, lod, visible, highlight);\r\n    if (changed) {\r\n      this.setSample(id, visible, highlight, lod);\r\n    }\r\n  }\r\n\r\n  private hasHighlightChanged(id: number, highlight: number) {\r\n    const currentHighlight = this._samples.getHighlight(id);\r\n    return highlight !== currentHighlight;\r\n  }\r\n\r\n  private hasVisibleChanged(id: number, visible: boolean) {\r\n    const currentVisible = this._samples.visible(id);\r\n    return visible !== currentVisible;\r\n  }\r\n\r\n  private newTile(objectClass: ObjectClass, material: number, lod: CurrentLod) {\r\n    const tile = {} as Partial<TileData>;\r\n    tile.notVirtual = false;\r\n    tile.materialId = material;\r\n    tile.indexLocation = [];\r\n    tile.box = new THREE.Box3();\r\n    tile.objectClass = objectClass;\r\n    tile.lod = lod;\r\n    tile.normalCount = 0;\r\n    tile.indexCount = 0;\r\n    tile.vertexLocation = [];\r\n    tile.size = 0;\r\n    tile.geometriesLocation = [];\r\n    tile.positionCount = 0;\r\n    tile.sampleLocation = new Map();\r\n    tile.faceIdBuffer = new Uint32Array(0);\r\n    return tile as TileData;\r\n  }\r\n\r\n  private createLod(box: THREE.Box3) {\r\n    const line = TransformHelper.boxSize(box);\r\n    const position = this._temp.tileData.positionBuffer;\r\n    if (!position) {\r\n      throw new Error(\"Fragments: Malformed tiles!\");\r\n    }\r\n    position[0] = line.start.x;\r\n    position[1] = line.start.y;\r\n    position[2] = line.start.z;\r\n    position[3] = line.end.x;\r\n    position[4] = line.end.y;\r\n    position[5] = line.end.z;\r\n    return this._temp.tileData;\r\n  }\r\n\r\n  private sampleTemplate(id: number) {\r\n    const sample = this._temp.sample;\r\n    const representation = this._temp.representation;\r\n    TransformHelper.get(sample, this.meshes, this._temp.transform);\r\n    TransformHelper.getBox(representation, this._temp.boundingBox);\r\n    this._temp.sampleGeometry.sample = id;\r\n    const materialId = sample.material();\r\n    this._temp.sampleGeometry.material = this._materials[materialId];\r\n    this._temp.sampleGeometry.transform = this._temp.transform;\r\n    this._temp.sampleGeometry.aabb = this._temp.boundingBox;\r\n    delete this._temp.sampleGeometry.geometries;\r\n\r\n    const reprIndex = this._temp.sample.representation();\r\n    const reprId = this.meshes.representationIds(reprIndex);\r\n    this._temp.sampleGeometry.representationId = reprId;\r\n\r\n    return this._temp.sampleGeometry;\r\n  }\r\n\r\n  private makeSampleInvisible(id: number, lod: CurrentLod) {\r\n    const tileIds = this.getTileIds(id, lod);\r\n    if (!tileIds) {\r\n      return;\r\n    }\r\n    const callback = (tileId: number) => this.makeInvisibleFromTile(tileId, id);\r\n    MiscHelper.forEach(tileIds, callback);\r\n  }\r\n\r\n  private setSample(id: number, vis: boolean, high: number, lod: CurrentLod) {\r\n    this._samples.setVisible(id, vis);\r\n    this._samples.setHighlight(id, high);\r\n    const tileIds = this.getTileIds(id, lod);\r\n    if (tileIds === undefined) return;\r\n    MiscHelper.forEach(tileIds, (tileId) => {\r\n      this.updateTile(tileId, id, high, high === 0);\r\n    });\r\n  }\r\n\r\n  private getTileIds(sample: number, lod: number) {\r\n    if (lod === CurrentLod.GEOMETRY) {\r\n      return this._tileBySample[sample];\r\n    }\r\n    return this._lodBySample[sample];\r\n  }\r\n\r\n  private addBasicTileData(a: TileData, sample: number, id: number) {\r\n    a.sampleLocation.set(sample, a.size);\r\n    a.size++;\r\n    a.geometriesLocation.push(id);\r\n    a.indexLocation.push(a.indexCount || 0);\r\n    a.vertexLocation.push((a.positionCount || 0) / 3);\r\n  }\r\n\r\n  private buildNewVirtualTile(tile: TileData, tileId: number) {\r\n    this.constructTile(tile);\r\n    this.loadTile(tileId, tile);\r\n    tile.notVirtual = true;\r\n    delete tile.indexBuffer;\r\n    delete tile.positionBuffer;\r\n    delete tile.normalBuffer;\r\n    delete tile.faceIdBuffer;\r\n    delete tile.ids;\r\n  }\r\n\r\n  private deleteTileIfNeeded(tile: TileData, tileId: number) {\r\n    const shouldDelete = this.getShouldDeleteTile(tile);\r\n    if (shouldDelete) {\r\n      this.deleteGeometry(tileId);\r\n      tile.notVirtual = false;\r\n      VirtualTilesController._graphicMemoryConsumed -= tile.usedMemory!;\r\n      return;\r\n    }\r\n    this._tilesChanged.add(tileId);\r\n  }\r\n\r\n  private getShouldDeleteTile(tile: TileData) {\r\n    if (!tile.visibilities || !tile.highlights) {\r\n      throw new Error(\"Fragments: Malformed tile!\");\r\n    }\r\n    const invisible = tile.visibilities.fullOf(false);\r\n    const noHighlight = tile.highlights.fullOf(0);\r\n    const memoryOverflow = this.memoryOverflow();\r\n    return invisible && noHighlight && memoryOverflow;\r\n  }\r\n\r\n  private checkTileMemoryOverflow(tileId: number, tileData: TileData) {\r\n    const tile = this._tiles.get(tileId);\r\n    const bufferSize = tile ? tile.positionCount! : 0;\r\n    const totalSize = bufferSize + tileData.positionCount!;\r\n    const memoryOverflow = totalSize > limitOf2Bytes;\r\n    return memoryOverflow;\r\n  }\r\n\r\n  private updateTileData(\r\n    tile: TileData,\r\n    sample: number,\r\n    visible: boolean,\r\n    highlight: number,\r\n  ) {\r\n    if (!tile.visibilities || !tile.highlights) {\r\n      throw new Error(\"Fragments: Malformed tile!\");\r\n    }\r\n    const id = tile.sampleLocation.get(sample) as number;\r\n    tile.visibilities.update(id, visible);\r\n    tile.highlights.update(id, highlight);\r\n  }\r\n\r\n  private getKeepUpdating(sampleId: number, time: number) {\r\n    const maxTime = this._params.updateTime;\r\n    const minSamples = this._params.updateSamples;\r\n    const samplesLeft = sampleId < this._sampleAmount;\r\n    const passedTime = performance.now() - time;\r\n    const isFirstSamples = sampleId < minSamples;\r\n    const timeLeft = passedTime < maxTime || isFirstSamples;\r\n    const shouldKeepUpdating = samplesLeft && timeLeft;\r\n    return shouldKeepUpdating;\r\n  }\r\n\r\n  private computeTileSize() {\r\n    const dimension = this._boxes.fullBox.getSize(this._temp.vector);\r\n    const maxDimension = Math.max(dimension.x, dimension.y, dimension.z);\r\n    const fraction = maxDimension / this._params.tileDimensionFactor;\r\n    const maxIntFraction = Math.ceil(fraction);\r\n    return Math.max(this._params.minTileDimension, maxIntFraction);\r\n  }\r\n\r\n  private newTileId(sample: number, material: number, tileData: TileData) {\r\n    this.logBufferOverflowIfNeeded(tileData);\r\n    const lod = tileData.lod || CurrentLod.GEOMETRY;\r\n    const code = this.generateTileCode(sample, material, tileData, lod);\r\n    const tileSize = this._sizeByTile.get(code) || 1;\r\n    let tileId = code + tileSize - 1;\r\n    const memoryOverflow = this.checkTileMemoryOverflow(tileId, tileData);\r\n    if (memoryOverflow) {\r\n      tileId += this._params.tileIdIncrement;\r\n      this._sizeByTile.set(code, tileSize + 1);\r\n    }\r\n    return tileId;\r\n  }\r\n\r\n  private logBufferOverflowIfNeeded(tileData: TileData) {\r\n    const geometrySize = tileData.positionCount! / 3;\r\n    if (geometrySize > limitOf2Bytes) {\r\n      console.log(\"Fragments: Buffer overflow\");\r\n    }\r\n  }\r\n\r\n  private fetchLodLevel(sample: number) {\r\n    if (this._lodMode === LodMode.ALL_VISIBLE) {\r\n      this.meshes.samples(sample, this._temp.sample);\r\n      const itemId = this._temp.sample.item();\r\n      const isSeen = this._items.visible(itemId);\r\n      if (!isSeen) {\r\n        return CurrentLod.INVISIBLE;\r\n      }\r\n      return CurrentLod.GEOMETRY;\r\n    }\r\n\r\n    const item = this._boxes.get(sample);\r\n    const notClipped = CameraUtils.collides(item, this._virtualPlanes);\r\n    if (!notClipped) {\r\n      return CurrentLod.INVISIBLE;\r\n    }\r\n\r\n    this.meshes.samples(sample, this._temp.sample);\r\n    const itemId = this._temp.sample.item();\r\n    const isSeen = this._items.visible(itemId);\r\n    if (!isSeen) {\r\n      return CurrentLod.INVISIBLE;\r\n    }\r\n\r\n    const quality = this._virtualView.graphicQuality;\r\n    const dimension = this._boxes.dimensionOf(sample);\r\n    const offset = item.distanceToPoint(this._virtualView.cameraPosition);\r\n    const screenDimension = this.screenSize(dimension, offset);\r\n\r\n    const isSmall = dimension < this._params.smallObjectSize;\r\n    const isLarge = !isSmall;\r\n\r\n    const smallScreen = this._params.smallScreenSize * quality;\r\n    const mediumScreen = this._params.mediumScreenSize * quality;\r\n    const largeScreen = this._params.largeScreenSize * quality;\r\n\r\n    const isSmallInScreen = screenDimension < smallScreen;\r\n    const isMediumInScreen = screenDimension < mediumScreen;\r\n    const isLargeInScreen = screenDimension < largeScreen;\r\n\r\n    const smallAndFar = isSmall && isMediumInScreen;\r\n    const largeAndVeryFar = isLarge && isSmallInScreen;\r\n    const smallAndClose = isSmall && isLargeInScreen;\r\n    const largeAndFar = isLarge && isMediumInScreen;\r\n\r\n    if (smallAndFar || largeAndVeryFar) {\r\n      return CurrentLod.INVISIBLE;\r\n    }\r\n\r\n    if (this._lodMode === LodMode.ALL_GEOMETRY) {\r\n      return CurrentLod.GEOMETRY;\r\n    }\r\n\r\n    if (smallAndClose || largeAndFar) {\r\n      return CurrentLod.WIRES;\r\n    }\r\n\r\n    const lodSize = this._sampleLodSize[sample];\r\n    const screenSize = this.screenSize(lodSize, offset);\r\n    const wireLimit = Math.max(mediumScreen, this._params.mediumScreenSize);\r\n    const isWireLike = screenSize < wireLimit;\r\n    if (isWireLike) {\r\n      return CurrentLod.WIRES;\r\n    }\r\n\r\n    return CurrentLod.GEOMETRY;\r\n  }\r\n\r\n  private generateTileCode(\r\n    sample: number,\r\n    material: number,\r\n    tile: TileData,\r\n    lod: CurrentLod,\r\n  ) {\r\n    this._tileIdGenerator.reset();\r\n    this.processTileDataId(tile, material, lod);\r\n    const box = this.processTileSpatialId(sample, lod);\r\n    this.processTileDimensionId(box);\r\n    return this._tileIdGenerator.value;\r\n  }\r\n\r\n  private processTileDataId(tile: TileData, material: number, lod: CurrentLod) {\r\n    this._tileIdGenerator.compute(\r\n      tile.objectClass !== undefined ? tile.objectClass : 0,\r\n    );\r\n    this._tileIdGenerator.compute(material);\r\n    this._tileIdGenerator.compute(lod);\r\n  }\r\n\r\n  private deleteGeometry(tileId: number) {\r\n    this._meshConnection.process({\r\n      tileRequestClass: TileRequestClass.DELETE,\r\n      modelId: this._modelId,\r\n      tileId,\r\n    });\r\n  }\r\n\r\n  private processTileSpatialId(sample: number, lod: CurrentLod) {\r\n    const x = this._temp.tileCenter.x;\r\n    const y = this._temp.tileCenter.y;\r\n    const z = this._temp.tileCenter.z;\r\n    const box = this._boxes.get(sample);\r\n    box.getCenter(this._temp.tileCenter);\r\n    const tileDimension = this.getTileDimension(lod);\r\n    const tx = x - (x % tileDimension);\r\n    const ty = y - (y % tileDimension);\r\n    const tz = z - (z % tileDimension);\r\n    this._tileIdGenerator.compute(tx);\r\n    this._tileIdGenerator.compute(ty);\r\n    this._tileIdGenerator.compute(tz);\r\n    return box;\r\n  }\r\n\r\n  private addCustomLodToTile(\r\n    mesh: VirtualMeshManager,\r\n    id: number,\r\n    material: number,\r\n  ) {\r\n    const lods = this.meshData(mesh, false, CurrentLod.WIRES) as TileData;\r\n    this._sampleLodSize[id] = lods.lodThickness || 0;\r\n    this._lodBySample[id] = this.putSampleInTiles(id, material, lods) as number;\r\n  }\r\n\r\n  private getTileLocations(tile: TileData) {\r\n    if (tile.indexCount) {\r\n      return tile.indexLocation;\r\n    }\r\n    return tile.vertexLocation;\r\n  }\r\n\r\n  private getTileDimension(lod: CurrentLod) {\r\n    let tileDimension = this._tileDimension;\r\n    if (lod === CurrentLod.GEOMETRY) {\r\n      tileDimension *= this._params.tileSizeMultiplier;\r\n    }\r\n    return tileDimension;\r\n  }\r\n\r\n  private processTileDimensionId(box: THREE.Box3) {\r\n    const sizeCategory = this.getTileDimensionClass(box);\r\n    this._tileIdGenerator.compute(sizeCategory);\r\n  }\r\n\r\n  private tileAppend(a: TileData, b: TileData, sample: number, id: number) {\r\n    this.addBasicTileData(a, sample, id);\r\n    this.tileAppendAttribute(a, b, \"indexCount\", false);\r\n    this.tileAppendAttribute(a, b, \"positionCount\", false);\r\n    this.tileAppendAttribute(a, b, \"normalCount\", false);\r\n    this.tileAppendAttribute(a, b, \"materialId\", true);\r\n  }\r\n\r\n  private putSampleInTiles(\r\n    sample: number,\r\n    material: number,\r\n    tiles: TileData | TileData[],\r\n  ) {\r\n    let tileIds: number | number[] = undefined as any;\r\n    const onSamplePut = (tileData: TileData, id: number) => {\r\n      const tileId = this.newTileId(sample, material, tileData);\r\n      tileIds = this.getTileIdsWhenSamplePut(tileIds, tileId);\r\n      const tile = this.getTileWhenSamplePut(tileId, tileData, material);\r\n      this.tileAppend(tile, tileData, sample, id);\r\n    };\r\n    MiscHelper.forEach(tiles, onSamplePut);\r\n    return tileIds;\r\n  }\r\n\r\n  private hasLodChanged(id: number, lod: CurrentLod) {\r\n    const currentLod = this._sampleLodState[id];\r\n    return lod !== currentLod;\r\n  }\r\n\r\n  private getTileIdsWhenSamplePut(tileIds: number | number[], tileId: number) {\r\n    if (tileIds === undefined) {\r\n      tileIds = tileId;\r\n    } else if (typeof tileIds === \"number\") {\r\n      if (tileIds !== tileId) tileIds = [tileIds, tileId];\r\n    } else if (!tileIds.includes(tileId)) {\r\n      tileIds.push(tileId);\r\n    }\r\n    return tileIds;\r\n  }\r\n\r\n  private updateTile(\r\n    tileId: number,\r\n    sample: number,\r\n    highlight: number,\r\n    visible: boolean,\r\n  ) {\r\n    const tile = this._tiles.get(tileId) as TileData;\r\n    this.updateTileData(tile, sample, visible, highlight);\r\n    if (tile.notVirtual) {\r\n      this._tilesChanged.add(tileId);\r\n      return;\r\n    }\r\n    this.buildNewVirtualTile(tile, tileId);\r\n  }\r\n\r\n  private getLodTileWhenPutSample(tileId: number, material: number) {\r\n    let tile = this._tiles.get(tileId);\r\n    if (!tile) {\r\n      const objectClass = this._temp.tile.objectClass;\r\n      tile = this.newTile(objectClass, material, CurrentLod.WIRES);\r\n      this._tiles.set(tileId, tile);\r\n    }\r\n    return tile;\r\n  }\r\n\r\n  private lodTileAppendSample(sample: number, material: number) {\r\n    const wires = CurrentLod.WIRES;\r\n    const tempTile = this._temp.tile;\r\n    const tileId = this.generateTileCode(sample, material, tempTile, wires);\r\n    const tile = this.getLodTileWhenPutSample(tileId, material);\r\n    this.tileAppend(tile, tempTile, sample, 0);\r\n    return tileId;\r\n  }\r\n\r\n  private addSampleToTile(\r\n    mesh: VirtualMeshManager,\r\n    id: number,\r\n    material: number,\r\n  ) {\r\n    const meshes = this.meshData(mesh, false, CurrentLod.GEOMETRY);\r\n    this._tileBySample[id] = this.putSampleInTiles(id, material, meshes);\r\n  }\r\n\r\n  private setTileBuffer(\r\n    tile: TileData,\r\n    key: \"index\" | \"normal\",\r\n    unsigned: boolean,\r\n  ) {\r\n    if (tile.usedMemory === undefined) {\r\n      return;\r\n    }\r\n    const count = tile[`${key}Count`] as number;\r\n    if (count > 0) {\r\n      const buffer = unsigned ? new Uint16Array(count) : new Int16Array(count);\r\n      tile[`${key}Buffer`] = buffer;\r\n      tile.usedMemory += buffer.byteLength;\r\n    }\r\n  }\r\n\r\n  private updateTiles(time: number) {\r\n    const needsUpdate = this._changedSamples < this._sampleAmount;\r\n    const viewAvailable = this._virtualView !== undefined;\r\n    if (!viewAvailable || !needsUpdate) {\r\n      return;\r\n    }\r\n    let keepUpdating = true;\r\n    let updatingSampleId = 0;\r\n    while (keepUpdating) {\r\n      const meshId = this._samplesDimensions[this._currentSample];\r\n      this.updateMesh(meshId);\r\n      this.updateCurrentSample();\r\n      updatingSampleId++;\r\n      keepUpdating = this.getKeepUpdating(updatingSampleId, time);\r\n    }\r\n  }\r\n\r\n  private sampleGeoms(sample: any, lod: CurrentLod, mesh: VirtualMeshManager) {\r\n    if (mesh.getLodClass() === LodClass.AABB && lod === CurrentLod.WIRES) {\r\n      return this.createLod(sample.aabb);\r\n    }\r\n    return this.meshData(mesh, true, lod);\r\n  }\r\n\r\n  private generateSampleInTiles(id: number) {\r\n    this.fetchSampleAndRepresentation(id);\r\n    const material = this.fetchCurrentMaterial();\r\n    const mesh = this.fetchCurrentMesh();\r\n    this.addSampleToTile(mesh, id, material);\r\n    this.addLodToTile(mesh, id, material);\r\n  }\r\n\r\n  private buildSampleInTile(\r\n    tile: TileData,\r\n    position: number,\r\n    sample: any,\r\n    isStart: boolean,\r\n    id: number,\r\n  ) {\r\n    const found = tile.geometriesLocation[position];\r\n    this.tileLoadSample(tile, sample, found);\r\n    if (isStart) {\r\n      const box = this._boxes.get(id);\r\n      this._temp.vector.copy(tile.location!);\r\n      this._temp.vector.negate();\r\n      box.translate(this._temp.vector);\r\n      tile.box.union(box);\r\n    }\r\n  }\r\n\r\n  private getSampleGeometries(sample: any, geomIndex: number) {\r\n    if (Array.isArray(sample.geometries)) {\r\n      return sample.geometries[geomIndex];\r\n    }\r\n    return sample.geometries;\r\n  }\r\n\r\n  private constructTile(tile: TileData) {\r\n    if (tile.positionBuffer === undefined) {\r\n      tile.positionBuffer = new Float32Array(tile.positionCount!);\r\n      tile.usedMemory = tile.positionBuffer.byteLength;\r\n      this.setTileBuffer(tile, \"index\", true);\r\n      this.setTileBuffer(tile, \"normal\", false);\r\n      this.setTileShellBuffer(tile);\r\n      tile.faceIdBuffer = new Uint32Array(tile.positionCount! / 3);\r\n      tile.usedMemory += tile.faceIdBuffer.byteLength;\r\n    }\r\n    const isStart = !tile.location;\r\n    for (const [id, position] of tile.sampleLocation) {\r\n      const sample = this.fetchSample(id, tile.lod!);\r\n      if (sample && sample.geometries) {\r\n        this.buildSampleInTile(tile, position, sample, isStart, id);\r\n      }\r\n    }\r\n  }\r\n\r\n  private fetchSampleTransform(tile: TileData, sample: any) {\r\n    this._temp.vector.copy(tile.location!);\r\n    this._temp.vector.negate();\r\n    this._temp.matrix.identity();\r\n    this._temp.matrix.setPosition(this._temp.vector);\r\n    this._temp.matrix.multiply(sample.transform);\r\n  }\r\n\r\n  private hasChanged(id: number, lod: CurrentLod, vis: boolean, high: number) {\r\n    const lodNeedsChanged = this.hasLodChanged(id, lod);\r\n    const visibleChangd = this.hasVisibleChanged(id, vis);\r\n    const highlightChanged = this.hasHighlightChanged(id, high);\r\n    return lodNeedsChanged || visibleChangd || highlightChanged;\r\n  }\r\n\r\n  private setupTileLocation(tile: TileData, geometry: any, sample: any) {\r\n    if (tile.location) {\r\n      return;\r\n    }\r\n    const result = new THREE.Vector3();\r\n    result.fromArray(geometry.positionBuffer!);\r\n    result.applyMatrix4(sample.transform);\r\n    tile.location = result;\r\n  }\r\n\r\n  private getTileData(tile: TileData) {\r\n    const locations = this.getTileLocations(tile);\r\n    const visibilityData = this.getTileVisibility(tile, locations);\r\n    const highlight = this.getTileHighlight(tile, locations);\r\n    const { highlightData, highlightIds } = highlight;\r\n    return { visibilityData, highlightData, highlightIds };\r\n  }\r\n\r\n  private updateMemoryOnTileLoad(tile: TileData) {\r\n    VirtualTilesController._graphicMemoryConsumed += tile.usedMemory!;\r\n  }\r\n\r\n  private fetchTileMatrixOnLoad(tile: TileData) {\r\n    if (tile.location) {\r\n      this._temp.matrix.identity();\r\n      this._temp.matrix.setPosition(tile.location);\r\n    }\r\n  }\r\n\r\n  private updateItem(itemId: number) {\r\n    const sampleIds = this._boxes.sampleOf(itemId);\r\n    if (sampleIds) {\r\n      for (const sampleId of sampleIds) {\r\n        this.updateMesh(sampleId);\r\n      }\r\n    }\r\n  }\r\n\r\n  private screenSize(dimension: number, distance: number) {\r\n    const viewDimension = this.getViewDimension(distance);\r\n    const screenDimension = dimension / viewDimension;\r\n    return screenDimension * this._virtualView.viewSize;\r\n  }\r\n\r\n  private getTileDimensionClass(box: THREE.Box3) {\r\n    const size = box.min.distanceToSquared(box.max);\r\n    const small = this._params.smallTileSize;\r\n    const medium = this._params.mediumTileSize;\r\n\r\n    if (size > medium) {\r\n      return TileDimension.LARGE;\r\n    }\r\n\r\n    if (size > small) {\r\n      return TileDimension.MEDIUM;\r\n    }\r\n\r\n    return TileDimension.SMALL;\r\n  }\r\n\r\n  private getViewDimension(distance: number) {\r\n    if (this._virtualView.orthogonalDimension) {\r\n      return this._virtualView.orthogonalDimension;\r\n    }\r\n    const currentFov = this._virtualView.fov;\r\n    const fovChanged = currentFov !== this._temp.pastFieldOfview;\r\n    if (fovChanged) {\r\n      this._temp.viewDimension = this.getPerspTrueDim(currentFov, 1);\r\n      this._temp.pastFieldOfview = currentFov;\r\n    }\r\n    return distance * this._temp.viewDimension;\r\n  }\r\n\r\n  private loadTile(tileId: number, tile: TileData) {\r\n    const tileData = this.getTileData(tile);\r\n    this.fetchTileMatrixOnLoad(tile);\r\n    const faceIds = this.getFaceIds(tile);\r\n    this._meshConnection.process({\r\n      tileRequestClass: TileRequestClass.CREATE,\r\n      modelId: this._modelId,\r\n      objectClass: tile.objectClass,\r\n      tileId,\r\n      itemId: undefined,\r\n      tileData,\r\n      indices: tile.indexBuffer,\r\n      positions: tile.positionBuffer,\r\n      normals: tile.normalBuffer,\r\n      faceIds,\r\n      itemIds: tile.ids,\r\n      material: tile.materialId,\r\n      matrix: this._temp.matrix.clone(),\r\n      aabb: tile.box.clone(),\r\n      currentLod: tile.lod,\r\n    });\r\n    this.updateMemoryOnTileLoad(tile);\r\n  }\r\n\r\n  private getFaceIds(tile: TileData) {\r\n    const tempColor = new THREE.Color();\r\n    const faceIdBuffer = tile.faceIdBuffer!;\r\n    const faceIds = new Float32Array(faceIdBuffer.length * 3);\r\n    for (let i = 0; i < faceIdBuffer.length; i++) {\r\n      const id = faceIdBuffer[i];\r\n      tempColor.set(0x000000 + id);\r\n      faceIds[i * 3] = tempColor.r;\r\n      faceIds[i * 3 + 1] = tempColor.g;\r\n      faceIds[i * 3 + 2] = tempColor.b;\r\n    }\r\n    return faceIds;\r\n  }\r\n\r\n  private meshData(mesh: VirtualMeshManager, allowVoid: boolean, lod: number) {\r\n    const id = this._temp.representation.id();\r\n    const customLod = mesh.getLodClass() === LodClass.CUSTOM;\r\n    const wiresLod = lod === CurrentLod.WIRES;\r\n    if (customLod && wiresLod) {\r\n      const meshWithLod = mesh as any;\r\n      const result = meshWithLod.fetchLod(id, allowVoid);\r\n      return result;\r\n    }\r\n    const result = mesh.fetchMeshes(id, allowVoid);\r\n    return result;\r\n  }\r\n\r\n  private tileAppendAttribute(\r\n    a: TileData,\r\n    b: TileData,\r\n    name: keyof TileData,\r\n    equal: boolean,\r\n  ) {\r\n    if (b[name] === undefined) {\r\n      return;\r\n    }\r\n\r\n    if (equal) {\r\n      (a[name] as any) = b[name] as any;\r\n      return;\r\n    }\r\n\r\n    (a[name] as any) += b[name] as any;\r\n  }\r\n\r\n  private itemId(sample: number) {\r\n    this.meshes.samples(sample, this._temp.sample);\r\n    return this._temp.sample.item();\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { RenderedFaces } from \"../../../../Schema\";\r\nimport { MaterialDefinition } from \"../../model/model-types\";\r\n\r\nexport class MaterialUtils {\r\n  static isSame(a: MaterialDefinition, b: MaterialDefinition) {\r\n    const isSameColor = this.checkSameColor(a.color, b.color);\r\n    const isSameOpacity = this.checkSame(a.opacity, b.opacity, 1.0);\r\n    const facesA = a.renderedFaces;\r\n    const facesB = b.renderedFaces;\r\n    const isSameFaces = this.checkSame(facesA, facesB, RenderedFaces.ONE);\r\n    return isSameColor && isSameOpacity && isSameFaces;\r\n  }\r\n\r\n  private static checkSame(a: any, b: any, fallback: any): boolean {\r\n    if (a === b) {\r\n      return true;\r\n    }\r\n\r\n    if (a === fallback && b === undefined) {\r\n      return true;\r\n    }\r\n\r\n    if (a === undefined && b === fallback) {\r\n      return true;\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  private static checkSameColor(a: THREE.Color, b: THREE.Color) {\r\n    if (a === b) {\r\n      return true;\r\n    }\r\n\r\n    if (a === undefined || b === undefined) {\r\n      return false;\r\n    }\r\n\r\n    const { r: ar, g: ag, b: ab } = a;\r\n    const { r: br, g: bg, b: bb } = b;\r\n\r\n    if (ar === br && ag === bg && ab === bb) {\r\n      return true;\r\n    }\r\n\r\n    return false;\r\n  }\r\n}\r\n","import {\r\n  MultiThreadingRequestClass,\r\n  MaterialDefinition,\r\n} from \"../../model/model-types\";\r\nimport { Material, Meshes, Model } from \"../../../../Schema\";\r\nimport { ParserHelper } from \"../../utils/geometry/parser-helper\";\r\nimport { MaterialUtils } from \"../../utils/geometry/material-utils\";\r\n\r\ntype VirtualMaterialTransfer = (data: any, trans?: any[]) => void;\r\n\r\nexport class VirtualMaterialController {\r\n  private readonly _modelId: string;\r\n  private readonly _list: MaterialDefinition[] = [];\r\n  private readonly _onTransfer: VirtualMaterialTransfer;\r\n\r\n  constructor(modelId: string, onTransfer: VirtualMaterialTransfer) {\r\n    this._modelId = modelId;\r\n    this._onTransfer = onTransfer;\r\n  }\r\n\r\n  update(model: Model): number[] {\r\n    const meshes = model.meshes() as Meshes;\r\n    const matList = [] as MaterialDefinition[];\r\n    return this.getAll(meshes, matList);\r\n  }\r\n\r\n  fetch(materialId: number) {\r\n    return this._list[materialId];\r\n  }\r\n\r\n  transfer(materials: MaterialDefinition[]): number[] {\r\n    const result = this.deduplicateMaterials(materials);\r\n    const { materialDefinitions, ids } = result;\r\n    this.transferMaterialData(materialDefinitions);\r\n    return ids;\r\n  }\r\n\r\n  getItemsMaterialDefinition(\r\n    model: Model,\r\n    indices: number[],\r\n    localIds: number[],\r\n  ) {\r\n    const result: { localIds: number[]; definition: MaterialDefinition }[] = [];\r\n    const meshes = model.meshes();\r\n    if (!meshes) return [];\r\n    const map = new Map<number, Set<number>>();\r\n    for (const [index, itemIndex] of indices.entries()) {\r\n      const sample = meshes.samples(itemIndex);\r\n      if (!sample) continue;\r\n      const materialIndex = sample.material();\r\n      let materialItems = map.get(materialIndex);\r\n      if (!materialItems) {\r\n        materialItems = new Set();\r\n        map.set(materialIndex, materialItems);\r\n      }\r\n      materialItems.add(localIds[index]);\r\n    }\r\n    for (const [materialIndex, localIds] of map.entries()) {\r\n      const material = meshes.materials(materialIndex);\r\n      if (!material) continue;\r\n      const definition = ParserHelper.parseMaterial(material);\r\n      result.push({ localIds: [...localIds], definition });\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private checkMaterialExists(material: MaterialDefinition, ids: number[]) {\r\n    // Don't deduplicate materials with preserveOriginalMaterial flag,\r\n    // as they need to preserve original material properties (like opacity)\r\n    // which may differ from existing materials with the same color\r\n    if (material.preserveOriginalMaterial) {\r\n      return false;\r\n    }\r\n    const count = this._list.length;\r\n    for (let i = 0; i < count; i++) {\r\n      const current = this._list[i];\r\n      const isSame = MaterialUtils.isSame(material, current);\r\n      if (isSame) {\r\n        ids.push(i);\r\n        return true;\r\n      }\r\n    }\r\n    return false;\r\n  }\r\n\r\n  private deduplicateMaterials(materialDefinition: MaterialDefinition[]) {\r\n    const ids = [] as number[];\r\n    const materialDefinitions = [] as MaterialDefinition[];\r\n    for (const material of materialDefinition) {\r\n      const exists = this.checkMaterialExists(material, ids);\r\n      if (!exists) {\r\n        this._list.push(material);\r\n        materialDefinitions.push(material);\r\n        const currentId = this._list.length - 1;\r\n        ids.push(currentId);\r\n      }\r\n    }\r\n    return { materialDefinitions, ids };\r\n  }\r\n\r\n  private getAll(meshes: Meshes, materialDefinitions: MaterialDefinition[]) {\r\n    const count = meshes.materialsLength();\r\n    for (let i = 0; i < count; i++) {\r\n      const matData = meshes.materials(i) as Material;\r\n      const definition = ParserHelper.parseMaterial(matData);\r\n      definition.localId = meshes.materialIds(i)!;\r\n      materialDefinitions.push(definition);\r\n    }\r\n    return this.transfer(materialDefinitions);\r\n  }\r\n\r\n  private transferMaterialData(materialDefinitions: MaterialDefinition[]) {\r\n    this._onTransfer({\r\n      class: MultiThreadingRequestClass.CREATE_MATERIAL,\r\n      modelId: this._modelId,\r\n      materialDefinitions,\r\n    });\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { VirtualBoxController } from \"../../bounding-boxes\";\r\nimport { Meshes, Model, SpatialStructure } from \"../../../../Schema\";\r\n\r\nimport { Identifier } from \"../../model\";\r\nimport {\r\n  AttributesUniqueValuesParams,\r\n  CRSData,\r\n  GetItemsByAttributeParams,\r\n  GetItemsByRelationParams,\r\n  ItemData,\r\n  ItemsDataConfig,\r\n  ItemsQueryConfig,\r\n  ItemsQueryParams,\r\n  SpatialTreeItem,\r\n  VirtualPropertiesConfig,\r\n} from \"../../model/model-types\";\r\nimport { VirtualFragmentsModel } from \"..\";\r\nimport { EditRequestType, RawRelationData } from \"../../../../Utils\";\r\n\r\n// TODO: Create private _items on demand and not always from the start\r\nexport class VirtualPropertiesController {\r\n  private readonly _model: Model;\r\n  private readonly _boxes: VirtualBoxController;\r\n  private readonly _localIdsToGeometryIds = new Map<number, number[]>();\r\n\r\n  private _guidToLocalIdMap = new Map<string, number>();\r\n  private _items = new Map<\r\n    number,\r\n    {\r\n      category: string | null;\r\n      guid: string | null;\r\n      geometryIds: number[] | null;\r\n      attrs: any;\r\n    }\r\n  >();\r\n\r\n  private _itemDataCache: Map<Identifier, ItemData> = new Map();\r\n  private _itemDataConfig: ItemsDataConfig = {\r\n    attributesDefault: true,\r\n    relationsDefault: { attributes: false, relations: false },\r\n  };\r\n\r\n  private _spatialStructure: SpatialTreeItem | null = null;\r\n\r\n  private _virtualModel: VirtualFragmentsModel;\r\n\r\n  constructor(\r\n    virtualModel: VirtualFragmentsModel,\r\n    boxes: VirtualBoxController,\r\n    config?: VirtualPropertiesConfig,\r\n  ) {\r\n    this._virtualModel = virtualModel;\r\n    this._model = virtualModel.data;\r\n    this._boxes = boxes;\r\n    this.preindexGeometryIds();\r\n    if (config && config.extraRelations) {\r\n      for (const extra of config.extraRelations) {\r\n        const { category, relation, inverseName } = extra;\r\n        this.addInverseRelation(category, relation, inverseName);\r\n      }\r\n    }\r\n\r\n    const localIds = this._model.localIdsArray();\r\n    if (localIds) {\r\n      for (let i = 0; i < this._model.localIdsLength(); i++) {\r\n        const category = this._model.categories(i);\r\n        // const attrs: any = {};\r\n        // const bufferAttributes = this._model.attributes(i);\r\n        // if (bufferAttributes) {\r\n        //   for (let j = 0; j < bufferAttributes.dataLength(); j++) {\r\n        //     const data = bufferAttributes.data(j);\r\n        //     const [name, value, type] = JSON.parse(data);\r\n        //     attrs[name] = { value, type };\r\n        //   }\r\n        // }\r\n        const localId = localIds[i];\r\n        let itemInfo = this._items.get(localId);\r\n        if (!itemInfo) {\r\n          itemInfo = {\r\n            category: null,\r\n            guid: null,\r\n            geometryIds: null,\r\n            attrs: null,\r\n          };\r\n          this._items.set(localId, itemInfo);\r\n        }\r\n        itemInfo.category = category;\r\n        // itemInfo.attrs = attrs;\r\n      }\r\n      for (let i = 0; i < this._model.guidsItemsLength(); i++) {\r\n        const localId = this._model.guidsItems(i);\r\n        if (localId === null) continue;\r\n        const guid = this._model.guids(i);\r\n        this._guidToLocalIdMap.set(guid, localId);\r\n        let itemInfo = this._items.get(localId);\r\n        if (!itemInfo) {\r\n          itemInfo = {\r\n            category: null,\r\n            guid: null,\r\n            geometryIds: null,\r\n            attrs: null,\r\n          };\r\n          this._items.set(localId, itemInfo);\r\n        }\r\n        itemInfo.guid = guid;\r\n      }\r\n    }\r\n  }\r\n\r\n  private _relations = new Map<number, Record<string, number[]>>();\r\n\r\n  private getAllLocalIds() {\r\n    return this._model.localIdsArray() ?? [];\r\n  }\r\n\r\n  addInverseRelation(category: string, relation: string, inverseName: string) {\r\n    const categoriesIds = this.getItemsOfCategories([\r\n      new RegExp(`^${category}$`),\r\n    ]);\r\n    const psetLocalIds = categoriesIds[category];\r\n    for (const psetId of psetLocalIds) {\r\n      const relations = this.getItemRelations(psetId);\r\n      if (!(relations && relations[relation])) continue;\r\n      const localIds = relations[relation];\r\n      for (const itemId of localIds) {\r\n        let relationsObject = this._relations.get(itemId);\r\n        if (!relationsObject) {\r\n          relationsObject = {};\r\n          this._relations.set(itemId, relationsObject);\r\n        }\r\n        let inverse = relationsObject[inverseName];\r\n        if (!inverse) {\r\n          inverse = [];\r\n          relationsObject[inverseName] = inverse;\r\n        }\r\n        inverse.push(psetId);\r\n      }\r\n    }\r\n  }\r\n\r\n  getItemsCount() {\r\n    return this._model.localIdsLength();\r\n  }\r\n\r\n  getMaxLocalId() {\r\n    return this._model.maxLocalId();\r\n  }\r\n\r\n  getMetadata() {\r\n    const metadata = this._model.metadata();\r\n    if (!metadata) {\r\n      return null;\r\n    }\r\n    return JSON.parse(metadata);\r\n  }\r\n\r\n  getCRS(): CRSData | null {\r\n    const metadata = this.getMetadata();\r\n    if (!metadata || !metadata.crs) {\r\n      return null;\r\n    }\r\n    return metadata.crs as CRSData;\r\n  }\r\n\r\n  getItemIdsFromLocalIds(localIds?: Iterable<number>): number[] {\r\n    if (!localIds) {\r\n      return Array.from(this._model.meshes()!.meshesItemsArray()!);\r\n    }\r\n    const itemIds: number[] = [];\r\n    for (const localId of localIds) {\r\n      const found = this._localIdsToGeometryIds.get(localId);\r\n      if (!found) continue;\r\n      for (const itemId of found) {\r\n        itemIds.push(itemId);\r\n      }\r\n    }\r\n    return itemIds;\r\n  }\r\n\r\n  getLocalIdsFromItemIds(itemIds: Iterable<number>) {\r\n    const result: number[] = [];\r\n    const entries = this._localIdsToGeometryIds.entries();\r\n    for (const [localId, geometryIds] of entries) {\r\n      for (const itemId of itemIds) {\r\n        if (!geometryIds.includes(itemId)) continue;\r\n        result.push(localId);\r\n      }\r\n    }\r\n    return result;\r\n  }\r\n\r\n  getBox(items: number[], result: THREE.Box3) {\r\n    for (const itemId of items) {\r\n      const currentBoxesIds = this._boxes.sampleOf(itemId);\r\n      if (currentBoxesIds) {\r\n        for (const currentBoxId of currentBoxesIds) {\r\n          const currentBox = this._boxes.get(currentBoxId);\r\n          result.union(currentBox);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  getSpatialStructure() {\r\n    if (this._spatialStructure) {\r\n      return this._spatialStructure;\r\n    }\r\n    const structure = this._model.spatialStructure();\r\n    if (!structure) {\r\n      return {} as SpatialTreeItem;\r\n    }\r\n    this._spatialStructure = this.getTreeItem(structure);\r\n    return this._spatialStructure;\r\n  }\r\n\r\n  getItemsChildren(ids: Identifier[]) {\r\n    const result = new Set<number>();\r\n    for (const id of ids) {\r\n      const localId = this.convertToLocalId(id);\r\n      if (localId === null) continue;\r\n      this.traverseSpatialStructure(localId, result);\r\n    }\r\n    return [...result];\r\n  }\r\n\r\n  getGuids() {\r\n    const guids: string[] = [];\r\n    for (let i = 0; i < this._model.guidsLength(); i++) {\r\n      const guid = this._model.guids(i);\r\n      guids.push(guid);\r\n    }\r\n    return guids;\r\n  }\r\n\r\n  getLocalIds() {\r\n    const array = this._model.localIdsArray();\r\n    if (!array) return [];\r\n    return Array.from(array);\r\n  }\r\n\r\n  getItemsCategories(ids: Identifier[]) {\r\n    const result: (string | null)[] = [];\r\n\r\n    for (const id of ids) {\r\n      const localId = this.convertToLocalId(id);\r\n      if (localId === null) continue;\r\n      let category = this._items.get(localId)?.category ?? null;\r\n      if (category === null) {\r\n        // If the item was created, return the created category\r\n        for (let i = this._virtualModel.requests.length - 1; i >= 0; i--) {\r\n          const request = this._virtualModel.requests[i];\r\n          if (request.type === EditRequestType.CREATE_ITEM) {\r\n            if (request.localId === localId) {\r\n              category = request.data.category;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      result.push(category);\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  getLocalIdsByGuids(guids: string[]) {\r\n    const result: (number | null)[] = [];\r\n\r\n    for (const guid of guids) {\r\n      const localId = this._guidToLocalIdMap.get(guid);\r\n      result.push(localId !== undefined ? localId : null);\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  getGuidsByLocalIds(localIds: number[]) {\r\n    const result: (string | null)[] = [];\r\n\r\n    for (const id of localIds) {\r\n      const guid = this._items.get(id)?.guid;\r\n      result.push(guid !== undefined ? guid : null);\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  getAttributeNames() {\r\n    const names = new Set<string>();\r\n    for (let i = 0; i < this._model.uniqueAttributesLength(); i++) {\r\n      const attribute = this._model.uniqueAttributes(i);\r\n      if (!attribute) continue;\r\n      const [name] = JSON.parse(attribute);\r\n      names.add(name);\r\n    }\r\n    return [...names];\r\n  }\r\n\r\n  getAttributeValues() {\r\n    const values = new Set<any>();\r\n    for (let i = 0; i < this._model.uniqueAttributesLength(); i++) {\r\n      const attribute = this._model.uniqueAttributes(i);\r\n      if (!attribute) continue;\r\n      const [, value] = JSON.parse(attribute);\r\n      values.add(value);\r\n    }\r\n    return [...values];\r\n  }\r\n\r\n  getAttributesUniqueValues(params: AttributesUniqueValuesParams[]) {\r\n    // Map: attribute name -> Map: value -> Set of item indices\r\n    const map = new Map<string, Map<any, Set<number>>>();\r\n\r\n    // All param entries must have the category\r\n    // define to used them as a filter.\r\n    // If not, would be checking for specific categories\r\n    // in param entries that doesn't specify any\r\n    const areCategoriesDefined = params.every(\r\n      (value) => value.categories !== undefined,\r\n    );\r\n\r\n    const categoriesRegex = params\r\n      .map((value) => value.categories)\r\n      .filter((value) => value !== undefined)\r\n      .flat();\r\n\r\n    // It's safe to do the search looping through categories\r\n    // instead of attributes because each set of attributes\r\n    // always belong to a category, and the indices always match.\r\n    for (let i = 0; i < this._model.categoriesLength(); i++) {\r\n      const localId = this._model.localIds(i);\r\n      if (localId === null) continue;\r\n      let valid = true;\r\n      if (areCategoriesDefined) {\r\n        const category = this._model.categories(i);\r\n        valid = categoriesRegex.some((regex) => regex?.test(category));\r\n      }\r\n\r\n      if (!valid) continue;\r\n\r\n      const buffer = this._model.attributes(i);\r\n      if (!buffer) continue;\r\n      const attributeSet: Record<string, { value: any; type?: string }> = {};\r\n\r\n      for (let j = 0; j < buffer.dataLength(); j++) {\r\n        const attr = buffer.data(j);\r\n        if (!attr) continue;\r\n        const [name, value, type] = JSON.parse(attr) as [\r\n          string,\r\n          string | number | boolean,\r\n          string?,\r\n        ];\r\n        attributeSet[name] = { value, type };\r\n      }\r\n\r\n      const keys = Object.keys(attributeSet);\r\n      const category = this._model.categories(i);\r\n\r\n      for (const { key: resultKey, attributes, get, categories } of params) {\r\n        let categoryMatch = true;\r\n\r\n        if (categories) {\r\n          categoryMatch = categories.some((value) => value.test(category));\r\n        }\r\n\r\n        if (!categoryMatch) continue;\r\n\r\n        let setPasses = true;\r\n\r\n        if (attributes) {\r\n          const { aggregation, queries } = attributes;\r\n\r\n          const queryResults: boolean[] = [];\r\n          for (const { name, value, type, negate } of queries) {\r\n            const key = keys.find((key) => name.test(key));\r\n            if (!(key && attributeSet[key]?.value !== undefined)) break;\r\n            let pass = false;\r\n            const { value: keyValue, type: keyType } = attributeSet[key];\r\n\r\n            if (value instanceof RegExp) {\r\n              pass = typeof keyValue === \"string\" && value.test(keyValue);\r\n            } else {\r\n              pass = keyValue === value;\r\n            }\r\n\r\n            if (type !== undefined) {\r\n              pass = pass && typeof keyType === \"string\" && type.test(keyType);\r\n            }\r\n\r\n            if (negate) pass = !pass;\r\n\r\n            queryResults.push(pass);\r\n          }\r\n\r\n          setPasses =\r\n            aggregation === \"exclusive\"\r\n              ? queryResults.every((result) => result)\r\n              : queryResults.some((result) => result);\r\n        }\r\n\r\n        if (setPasses) {\r\n          const key = keys.find((key) => get.test(key));\r\n          if (!(key && attributeSet[key]?.value !== undefined)) continue;\r\n          const mapKey = resultKey ?? key;\r\n          const value = attributeSet[key]?.value;\r\n\r\n          if (!map.has(mapKey)) {\r\n            map.set(mapKey, new Map<any, Set<number>>());\r\n          }\r\n          const valueMap = map.get(mapKey)!;\r\n          if (!valueMap.has(value)) {\r\n            valueMap.set(value, new Set<number>());\r\n          }\r\n          valueMap.get(value)!.add(localId);\r\n        }\r\n      }\r\n    }\r\n\r\n    // Format result\r\n    const result: Record<string, { value: any; localIds: number[] }[]> = {};\r\n    for (const [name, valueMap] of map) {\r\n      result[name] = [];\r\n      for (const [value, itemsSet] of valueMap) {\r\n        result[name].push({\r\n          value,\r\n          localIds: Array.from(itemsSet),\r\n        });\r\n      }\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  getAttributeTypes() {\r\n    const types = new Set<string>();\r\n    for (let i = 0; i < this._model.uniqueAttributesLength(); i++) {\r\n      const attribute = this._model.uniqueAttributes(i);\r\n      if (!attribute) continue;\r\n      const [, , type] = JSON.parse(attribute);\r\n      types.add(type);\r\n    }\r\n    return [...types];\r\n  }\r\n\r\n  getRelationNames() {\r\n    const names = new Set<string>();\r\n    for (let i = 0; i < this._model.relationNamesLength(); i++) {\r\n      const name = this._model.relationNames(i);\r\n      if (!name) continue;\r\n      names.add(name);\r\n    }\r\n    return [...names];\r\n  }\r\n\r\n  // getItemsAttributes(ids: Identifier[]) {\r\n  //   const result: (Record<string, { value: any; type?: string }> | null)[] =\r\n  //     new Array(ids.length).fill(null);\r\n\r\n  //   const localIdToIndexMap = new Map<number | string, number>();\r\n  //   ids.forEach((id, index) => {\r\n  //     localIdToIndexMap.set(id, index);\r\n  //   });\r\n\r\n  //   let found = 0;\r\n  //   const count = this._model.localIdsLength();\r\n  //   for (let i = 0; i < count; i++) {\r\n  //     const localId = this._model.localIds(i);\r\n  //     if (localId === null) continue;\r\n  //     const index = localIdToIndexMap.get(localId);\r\n  //     if (index === undefined) continue;\r\n  //     const attributesBuffer = this._model.attributes(i);\r\n  //     if (!attributesBuffer) {\r\n  //       result[index] = null;\r\n  //       continue;\r\n  //     }\r\n  //     const attributes: Record<string, { value: any; type?: string }> = {};\r\n  //     for (let j = 0; j < attributesBuffer.dataLength(); j++) {\r\n  //       const data = attributesBuffer.data(j);\r\n  //       const [name, value, type] = data;\r\n  //       attributes[name] = { value, type };\r\n  //     }\r\n  //     result[index] = attributes;\r\n  //     found++;\r\n  //     if (ids.length === found) {\r\n  //       break;\r\n  //     }\r\n  //   }\r\n  //   return result;\r\n  // }\r\n\r\n  getItemAttributes(id: Identifier) {\r\n    const isLocalId = typeof id === \"number\";\r\n    const localId = isLocalId ? id : this.getLocalIdsByGuids([id])[0];\r\n    if (localId === null) {\r\n      return null;\r\n    }\r\n    const index = this._model.localIdsArray()?.indexOf(localId);\r\n    if (index === undefined || index === -1) {\r\n      // If the item was created, return the created data\r\n      const data: Record<string, { value: any; type?: string }> = {};\r\n      for (let i = this._virtualModel.requests.length - 1; i >= 0; i--) {\r\n        const request = this._virtualModel.requests[i];\r\n        if (\r\n          request.type === EditRequestType.CREATE_ITEM ||\r\n          // DO NOT remove this or editing created items break\r\n          // if you have problems with this, contact Antonio\r\n          request.type === EditRequestType.UPDATE_ITEM\r\n        ) {\r\n          if (request.localId === localId) {\r\n            for (const name in request.data.data) {\r\n              const found = request.data.data[name];\r\n              data[name] = { value: found.value, type: found.type };\r\n            }\r\n            return data;\r\n          }\r\n        }\r\n      }\r\n\r\n      // No previous id found and no new item, return null\r\n      return null;\r\n    }\r\n    const buffer = this._model.attributes(index);\r\n    if (!buffer) {\r\n      return null;\r\n    }\r\n    const data: Record<string, { value: any; type?: string }> = {};\r\n\r\n    // If edited, return edited data\r\n    // We traverse it backwards to get the latest edited data\r\n    for (let i = this._virtualModel.requests.length - 1; i >= 0; i--) {\r\n      const request = this._virtualModel.requests[i];\r\n      if (\r\n        request.type === EditRequestType.UPDATE_ITEM ||\r\n        request.type === EditRequestType.CREATE_ITEM\r\n      ) {\r\n        if (request.localId === localId) {\r\n          for (const name in request.data.data) {\r\n            const found = request.data.data[name];\r\n            data[name] = { value: found.value, type: found.type };\r\n          }\r\n          return data;\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let j = 0; j < buffer.dataLength(); j++) {\r\n      const attr = buffer.data(j);\r\n      if (!attr) {\r\n        continue;\r\n      }\r\n      this.parseAttribute(attr, data);\r\n    }\r\n    return data;\r\n  }\r\n\r\n  private parseAttribute(\r\n    attr: string,\r\n    data: Record<string, { value: any; type?: string }>,\r\n  ) {\r\n    const [name, value, type] = JSON.parse(attr) as [string, any, string?];\r\n    data[name] = { value, type };\r\n  }\r\n\r\n  getItemData(\r\n    id: Identifier,\r\n    config: { parentName?: string; rel?: string } = {},\r\n  ) {\r\n    const allAttributes = this._itemDataConfig.attributesDefault;\r\n    const attributesConfig = this._itemDataConfig.attributes;\r\n    const relationsConfig = this._itemDataConfig.relations ?? {};\r\n    let { attributes, relations } = this._itemDataConfig.relationsDefault;\r\n\r\n    const { parentName, rel } = config;\r\n    if (!parentName && !rel) {\r\n      attributes = true;\r\n      relations = true;\r\n    } else {\r\n      const hasRelConfig = rel && rel in relationsConfig;\r\n      const hasParentConfig = parentName && parentName in relationsConfig;\r\n      if (hasRelConfig) {\r\n        const toProcess = relationsConfig[rel];\r\n        if (toProcess) {\r\n          attributes = toProcess.attributes;\r\n          relations = toProcess.relations;\r\n        }\r\n      } else if (hasParentConfig) {\r\n        const toProcess = relationsConfig[parentName];\r\n        if (toProcess) {\r\n          attributes = toProcess.attributes;\r\n          relations = toProcess.relations;\r\n        }\r\n      }\r\n    }\r\n\r\n    if (!attributes && !relations) {\r\n      return {};\r\n    }\r\n\r\n    if (this._itemDataCache.has(id)) {\r\n      return this._itemDataCache.get(id)!;\r\n    }\r\n\r\n    const localId =\r\n      typeof id === \"number\" ? id : this._guidToLocalIdMap.get(id) ?? null;\r\n\r\n    const deletedItems = new Set<number>();\r\n    for (const request of this._virtualModel.requests) {\r\n      if (request.type === EditRequestType.DELETE_ITEM) {\r\n        deletedItems.add(request.localId as number);\r\n      }\r\n    }\r\n\r\n    if (localId === null || deletedItems.has(localId)) {\r\n      return {};\r\n    }\r\n\r\n    const [category] = this.getItemsCategories([localId]);\r\n\r\n    const guid =\r\n      typeof id === \"string\" ? id : this._items.get(id)?.guid ?? null;\r\n\r\n    const data: ItemData = {\r\n      _category: { value: category },\r\n      _localId: { value: localId },\r\n      _guid: { value: guid },\r\n    };\r\n\r\n    this._itemDataCache.set(id, data);\r\n\r\n    if (attributes && localId !== null) {\r\n      // const result = this._items.get(localId)?.attrs;\r\n      // if (result) {\r\n      //   for (const [key, value] of Object.entries(result)) {\r\n      //     data[key] = value;\r\n      //   }\r\n      // }\r\n      // const itemAttrs = this.getItemsAttributes([id])[0];\r\n      const itemAttrs = this.getItemAttributes(id);\r\n      for (const [key, value] of Object.entries(itemAttrs ?? {})) {\r\n        if (allAttributes) {\r\n          if (!attributesConfig?.includes(key)) {\r\n            data[key] = value;\r\n          }\r\n        } else if (attributesConfig?.includes(key)) {\r\n          data[key] = value;\r\n        }\r\n      }\r\n    }\r\n\r\n    if (relations) {\r\n      const itemRels = this.getItemRelations(id);\r\n      for (const [key, localIds] of Object.entries(itemRels ?? {})) {\r\n        for (const localId of localIds) {\r\n          if (deletedItems.has(localId)) {\r\n            continue;\r\n          }\r\n\r\n          const itemData = this.getItemData(localId, {\r\n            parentName: rel,\r\n            rel: key,\r\n          });\r\n          if (Object.keys(itemData).length === 0) {\r\n            continue;\r\n          }\r\n          const info = data[key];\r\n          if (Array.isArray(info)) {\r\n            info.push(itemData);\r\n          } else {\r\n            data[key] = [itemData];\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    return data;\r\n  }\r\n\r\n  getItemsData(ids: Identifier[], config: Partial<ItemsDataConfig> = {}) {\r\n    this._itemDataCache.clear();\r\n    const result: ItemData[] = [];\r\n    const _ids = ids.length !== 0 ? ids : this._model.localIdsArray();\r\n    if (!_ids) return result;\r\n    this._itemDataConfig = {\r\n      ...this._itemDataConfig,\r\n      ...config,\r\n    };\r\n    for (const id of _ids) {\r\n      result.push(this.getItemData(id));\r\n    }\r\n    this._itemDataCache.clear();\r\n    this._itemDataConfig = {\r\n      relationsDefault: { attributes: false, relations: false },\r\n      attributesDefault: true,\r\n    };\r\n    return result;\r\n  }\r\n\r\n  getRawRelations(ids?: number[]) {\r\n    const source = new Set(ids ?? this.getLocalIds());\r\n    const result: Map<number, RawRelationData> = new Map();\r\n    for (const id of source) {\r\n      const found = this.getItemRelations(id);\r\n      if (found) {\r\n        result.set(id, { data: found });\r\n      }\r\n    }\r\n    return result;\r\n  }\r\n\r\n  getItemRelations(id: Identifier) {\r\n    const isLocalId = typeof id === \"number\";\r\n    const localId = isLocalId ? id : this.getLocalIdsByGuids([id])[0];\r\n\r\n    // If a relation was created or updated and not saved yet, return the newest relation\r\n    for (let i = this._virtualModel.requests.length - 1; i >= 0; i--) {\r\n      const request = this._virtualModel.requests[i];\r\n      if (\r\n        request.type === EditRequestType.UPDATE_RELATION ||\r\n        request.type === EditRequestType.CREATE_RELATION\r\n      ) {\r\n        if (request.localId === localId) {\r\n          return request.data.data;\r\n        }\r\n      }\r\n    }\r\n\r\n    if (localId === null) {\r\n      return null;\r\n    }\r\n    const relations = this._relations.get(localId) ?? {};\r\n    const index = this._model.relationsItemsArray()?.indexOf(localId);\r\n    if (index === undefined || index === -1) {\r\n      return Object.keys(relations).length > 0 ? relations : null;\r\n    }\r\n    const buffer = this._model.relations(index);\r\n    if (!buffer) {\r\n      return Object.keys(relations).length > 0 ? relations : null;\r\n    }\r\n    for (let j = 0; j < buffer.dataLength(); j++) {\r\n      const attr = buffer.data(j);\r\n      if (!attr) {\r\n        continue;\r\n      }\r\n      const [name, ...localIds] = JSON.parse(attr) as [string, ...number[]];\r\n      relations[name] = localIds;\r\n    }\r\n    return relations;\r\n  }\r\n\r\n  getCategories() {\r\n    const categories = new Set<string>();\r\n    for (let index = 0; index < this._model.categoriesLength(); index++) {\r\n      const category = this._model.categories(index);\r\n      if (!category) continue;\r\n      categories.add(category);\r\n    }\r\n\r\n    // Add created categories, if any\r\n    for (let i = 0; i < this._virtualModel.requests.length; i++) {\r\n      const request = this._virtualModel.requests[i];\r\n      if (\r\n        request.type === EditRequestType.CREATE_ITEM ||\r\n        request.type === EditRequestType.UPDATE_ITEM\r\n      ) {\r\n        if (request.data.category) {\r\n          categories.add(request.data.category);\r\n        }\r\n      }\r\n    }\r\n\r\n    return [...categories];\r\n  }\r\n\r\n  // Improve this with an indexation at runtime?\r\n  // It already runs fast enough (?)\r\n  getItemsOfCategories(categories: RegExp[]) {\r\n    const result: { [category: string]: number[] } = {};\r\n\r\n    const deletedItems = new Set<number>();\r\n    for (const request of this._virtualModel.requests) {\r\n      // Skip deleted items, if any\r\n      if (request.type === EditRequestType.DELETE_ITEM) {\r\n        deletedItems.add(request.localId as number);\r\n      }\r\n    }\r\n\r\n    for (const request of this._virtualModel.requests) {\r\n      // Include created / updated items, if any\r\n      if (\r\n        request.type === EditRequestType.CREATE_ITEM ||\r\n        request.type === EditRequestType.UPDATE_ITEM\r\n      ) {\r\n        if (deletedItems.has(request.localId as number)) {\r\n          continue;\r\n        }\r\n        for (const categoryRegex of categories) {\r\n          if (categoryRegex.test(request.data.category)) {\r\n            if (!result[request.data.category]) {\r\n              result[request.data.category] = [];\r\n            }\r\n            result[request.data.category].push(request.localId as number);\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let index = 0; index < this._model.categoriesLength(); index++) {\r\n      const currentCategory = this._model.categories(index);\r\n      if (!currentCategory) continue;\r\n\r\n      const localId = this._model.localIds(index) as number;\r\n      if (deletedItems.has(localId)) {\r\n        continue;\r\n      }\r\n\r\n      for (const categoryRegex of categories) {\r\n        if (categoryRegex.test(currentCategory)) {\r\n          if (!result[currentCategory]) {\r\n            result[currentCategory] = [];\r\n          }\r\n          result[currentCategory].push(localId);\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  getItemsWithGeometry() {\r\n    const meshes = this._model.meshes(new Meshes());\r\n    const localIds: number[] = [];\r\n    if (!meshes) {\r\n      return localIds;\r\n    }\r\n    const indices = meshes.meshesItemsArray();\r\n    if (!indices) {\r\n      return localIds;\r\n    }\r\n    for (const index of indices) {\r\n      const localId = this._model.localIds(index);\r\n      if (localId === null) {\r\n        continue;\r\n      }\r\n      localIds.push(localId);\r\n    }\r\n    return localIds;\r\n  }\r\n\r\n  getItemsWithGeometryCategories() {\r\n    const localIds = this.getItemsWithGeometry();\r\n    const categories = this.getItemsCategories(localIds);\r\n    return categories;\r\n  }\r\n\r\n  private checkAttribute(\r\n    attr: { name: string; value: any; type?: string },\r\n    {\r\n      name,\r\n      value,\r\n      type,\r\n    }: Pick<GetItemsByAttributeParams, \"name\" | \"value\" | \"type\">,\r\n  ) {\r\n    const { name: attrName, value: val, type: typeValue } = attr;\r\n\r\n    let pass = false;\r\n\r\n    if (name.test(attrName)) {\r\n      // The check automatically passes if there is no value and type to check\r\n      pass = value === undefined && type === undefined;\r\n\r\n      // If the initial pass value is false, it means there is a value or type to check\r\n      if (!pass) {\r\n        if (value !== undefined) {\r\n          if (Array.isArray(value)) {\r\n            pass = value.some(\r\n              (regex) => typeof val === \"string\" && regex.test(val),\r\n            );\r\n          } else if (value instanceof RegExp) {\r\n            pass = typeof val === \"string\" && value.test(val);\r\n          } else {\r\n            pass = val === value;\r\n          }\r\n        }\r\n\r\n        if (type !== undefined) {\r\n          pass = pass && typeof typeValue === \"string\" && type.test(typeValue);\r\n        }\r\n      }\r\n    }\r\n\r\n    return pass;\r\n  }\r\n\r\n  getItemsByAttribute({\r\n    name,\r\n    value,\r\n    type,\r\n    negate,\r\n    itemIds,\r\n  }: GetItemsByAttributeParams) {\r\n    const allAttributesLength = this._model.attributesLength();\r\n\r\n    const res: number[] = [];\r\n\r\n    const missingItemsToIterate = new Set<number>(itemIds);\r\n\r\n    for (let i = 0; i < allAttributesLength; i++) {\r\n      const localId = this._model.localIds(i);\r\n      if (localId === null) continue;\r\n      missingItemsToIterate.delete(localId);\r\n      if (itemIds?.length && !itemIds.includes(localId)) continue;\r\n      const attribute = this._model.attributes(i);\r\n      if (!attribute) continue;\r\n\r\n      const dataLength = attribute?.dataLength();\r\n\r\n      let itemPasses = false;\r\n\r\n      for (let j = 0; j < dataLength; j++) {\r\n        const data = attribute.data(j);\r\n        if (!data) continue;\r\n\r\n        const [attrName, val, typeValue] = JSON.parse(data) as [\r\n          string,\r\n          string | number | boolean,\r\n          string?,\r\n        ];\r\n\r\n        const pass = this.checkAttribute(\r\n          {\r\n            name: attrName,\r\n            value: val,\r\n            type: typeValue,\r\n          },\r\n          { name, value, type },\r\n        );\r\n\r\n        if (pass) {\r\n          itemPasses = true;\r\n          break;\r\n        }\r\n      }\r\n\r\n      if (negate ? !itemPasses : itemPasses) {\r\n        res.push(localId);\r\n      }\r\n    }\r\n\r\n    // Missing items are probably the ones in delta models\r\n    if (!itemIds) {\r\n      for (let i = this._virtualModel.requests.length - 1; i >= 0; i--) {\r\n        const request = this._virtualModel.requests[i];\r\n        if (\r\n          request.type === EditRequestType.CREATE_ITEM &&\r\n          request.localId !== undefined\r\n        ) {\r\n          const data: Record<string, { value: any; type?: string }> = {};\r\n          for (const name in request.data.data) {\r\n            const found = request.data.data[name];\r\n            data[name] = { value: found.value, type: found.type };\r\n          }\r\n\r\n          // Check if it passes\r\n          let itemPasses = false;\r\n          for (const [\r\n            attrName,\r\n            { value: val, type: typeValue },\r\n          ] of Object.entries(data)) {\r\n            const pass = this.checkAttribute(\r\n              {\r\n                name: attrName,\r\n                value: val,\r\n                type: typeValue,\r\n              },\r\n              { name, value, type },\r\n            );\r\n\r\n            if (pass) {\r\n              itemPasses = true;\r\n              break;\r\n            }\r\n          }\r\n\r\n          if (negate ? !itemPasses : itemPasses) {\r\n            res.push(Number(request.localId));\r\n          }\r\n        }\r\n      }\r\n    } else {\r\n      for (const localId of missingItemsToIterate) {\r\n        // If the item was created, return the created data\r\n        for (let i = this._virtualModel.requests.length - 1; i >= 0; i--) {\r\n          const request = this._virtualModel.requests[i];\r\n          if (request.type === EditRequestType.CREATE_ITEM) {\r\n            if (request.localId !== localId) continue;\r\n            // Collect item data\r\n            const data: Record<string, { value: any; type?: string }> = {};\r\n            for (const name in request.data.data) {\r\n              const found = request.data.data[name];\r\n              data[name] = { value: found.value, type: found.type };\r\n            }\r\n\r\n            // Check if it passes\r\n            let itemPasses = false;\r\n            for (const [\r\n              attrName,\r\n              { value: val, type: typeValue },\r\n            ] of Object.entries(data)) {\r\n              const pass = this.checkAttribute(\r\n                {\r\n                  name: attrName,\r\n                  value: val,\r\n                  type: typeValue,\r\n                },\r\n                { name, value, type },\r\n              );\r\n\r\n              if (pass) {\r\n                itemPasses = true;\r\n                break;\r\n              }\r\n            }\r\n\r\n            if (negate ? !itemPasses : itemPasses) {\r\n              res.push(localId);\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    return res;\r\n  }\r\n\r\n  private getItemsByRelation({\r\n    name,\r\n    targetItemIds,\r\n    sourceItemIds,\r\n  }: GetItemsByRelationParams) {\r\n    const res: number[] = [];\r\n    const sources = sourceItemIds ?? this.getAllLocalIds();\r\n\r\n    for (const srcId of sources) {\r\n      const rels = this.getItemRelations(srcId);\r\n      const linked = rels?.[name];\r\n      if (!linked) continue;\r\n      if (targetItemIds) {\r\n        // Any intersection → add and skip further checks for this src\r\n        for (const trgId of linked) {\r\n          if (targetItemIds.has(trgId)) {\r\n            res.push(srcId);\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        // If there is no targetItemIds → only checks the relation exist in the source\r\n        res.push(srcId);\r\n      }\r\n    }\r\n    return res;\r\n  }\r\n\r\n  getItemsByQuery(params: ItemsQueryParams, config?: ItemsQueryConfig) {\r\n    const { categories, attributes, relation } = params;\r\n\r\n    //  Category pre‑filter (if any)\r\n    let candidateIds = config?.localIds;\r\n    if (candidateIds) {\r\n      // Filter the candidateIds based on the provided categories\r\n      if (categories) {\r\n        const itemsCategories = this.getItemsCategories(candidateIds);\r\n        candidateIds = candidateIds.filter((_, index) => {\r\n          const category = itemsCategories[index];\r\n          if (!category) return null;\r\n          return categories.some((entry) => entry.test(category));\r\n        });\r\n      }\r\n    } else {\r\n      // If no localIds where given, take the localIds matching the categories provided.\r\n      candidateIds = categories?.filter(Boolean)?.length\r\n        ? Object.values(this.getItemsOfCategories(categories)).flat()\r\n        : undefined;\r\n    }\r\n\r\n    // If category was given and no item matches, the whole search fails\r\n    if (candidateIds?.length === 0) return [];\r\n\r\n    //  Attribute filter on the *main* items (if requested)\r\n    if (attributes) {\r\n      const aggregation = attributes.aggregation ?? \"exclusive\";\r\n      // Store the result per attribute query\r\n      const ids: number[][] = [];\r\n      for (const attribute of attributes.queries) {\r\n        if (attributes && Boolean(attribute.name)) {\r\n          const localIds = this.getItemsByAttribute({\r\n            ...attribute,\r\n            itemIds: candidateIds,\r\n          });\r\n          ids.push(localIds);\r\n        }\r\n      }\r\n\r\n      const set = new Set<number>();\r\n      if (aggregation === \"inclusive\") {\r\n        for (const collection of ids) {\r\n          for (const id of collection) {\r\n            set.add(id);\r\n          }\r\n        }\r\n      } else {\r\n        const map = new Map<number, number>();\r\n        for (const collection of ids) {\r\n          for (const id of collection) {\r\n            const count = map.get(id);\r\n            if (count === undefined) {\r\n              map.set(id, 1);\r\n            } else {\r\n              map.set(id, count + 1);\r\n            }\r\n          }\r\n        }\r\n        for (const [id, count] of map) {\r\n          if (count === ids.length) {\r\n            set.add(id);\r\n          }\r\n        }\r\n      }\r\n      candidateIds = [...set];\r\n    }\r\n\r\n    // If attribute was given and no item matches, the whole search fails\r\n    if (candidateIds?.length === 0) return [];\r\n\r\n    //  Relation filter (if requested)\r\n    if (relation && Boolean(relation.name)) {\r\n      const { name, query } = relation;\r\n\r\n      // Find *target* items that satisfy the attribute constraint\r\n      const targetIds = query\r\n        ? new Set<number>(this.getItemsByQuery(query))\r\n        : undefined;\r\n\r\n      //  Keep only candidates that reference ↑ targets via the chosen relation\r\n      candidateIds = this.getItemsByRelation({\r\n        name,\r\n        targetItemIds: targetIds,\r\n        sourceItemIds: candidateIds,\r\n      });\r\n    }\r\n\r\n    // De-duplicate entries\r\n    return Array.from(new Set(candidateIds));\r\n  }\r\n\r\n  private getTreeItem(item: SpatialStructure) {\r\n    const tree: SpatialTreeItem = {\r\n      category: item.category(),\r\n      localId: item.localId(),\r\n    };\r\n    const children: SpatialTreeItem[] = [];\r\n    for (let i = 0; i < item.childrenLength(); i++) {\r\n      const child = item.children(i);\r\n      if (!child) {\r\n        continue;\r\n      }\r\n      children.push(this.getTreeItem(child));\r\n    }\r\n    if (children.length > 0) {\r\n      tree.children = children;\r\n    }\r\n    return tree;\r\n  }\r\n\r\n  private preindexGeometryIds() {\r\n    const geometries = this._model.meshes()!;\r\n    const length = geometries.meshesItemsLength();\r\n    for (let i = 0; i < length; i++) {\r\n      const localIdIndex = geometries.meshesItems(i)!;\r\n      const localId = this._model.localIds(localIdIndex);\r\n      if (localId === null) continue;\r\n      if (!this._localIdsToGeometryIds.has(localId)) {\r\n        this._localIdsToGeometryIds.set(localId, []);\r\n      }\r\n      this._localIdsToGeometryIds.get(localId)!.push(i);\r\n    }\r\n  }\r\n\r\n  private convertToLocalId(id: Identifier) {\r\n    const isLocalId = typeof id === \"number\";\r\n    if (isLocalId) return id;\r\n    const localId = this._guidToLocalIdMap.get(id);\r\n    if (localId === undefined) return null;\r\n    return localId;\r\n  }\r\n\r\n  private getChildrenLocalIds(\r\n    treeItem: SpatialTreeItem,\r\n    collector: Set<number>,\r\n  ) {\r\n    if (treeItem.localId !== null) {\r\n      collector.add(treeItem.localId);\r\n    }\r\n\r\n    if (treeItem.children) {\r\n      for (const child of treeItem.children) {\r\n        this.getChildrenLocalIds(child, collector);\r\n      }\r\n    }\r\n  }\r\n\r\n  private traverseSpatialStructure(\r\n    localId: number,\r\n    collector: Set<number>,\r\n    treeItem = this.getSpatialStructure(),\r\n  ) {\r\n    if (!treeItem) return;\r\n\r\n    if (treeItem.localId === localId && treeItem.children) {\r\n      for (const child of treeItem.children) {\r\n        this.getChildrenLocalIds(child, collector);\r\n      }\r\n      return;\r\n    }\r\n\r\n    if (treeItem.children) {\r\n      for (const child of treeItem.children) {\r\n        this.traverseSpatialStructure(localId, collector, child);\r\n      }\r\n    }\r\n  }\r\n}\r\n","import { VirtualFragmentsModel } from \"..\";\r\nimport {\r\n  ALIGNMENT_CATEGORY,\r\n  AlignmentData,\r\n  CustomDataItem,\r\n} from \"../../model/model-types\";\r\n\r\nexport class AlignmentsController {\r\n  private _fragments: VirtualFragmentsModel;\r\n\r\n  constructor(virtualFragmentsModel: VirtualFragmentsModel) {\r\n    this._fragments = virtualFragmentsModel;\r\n  }\r\n\r\n  async getAlignments() {\r\n    const allAlignments: AlignmentData[] = [];\r\n\r\n    // TODO: Extend AlignmentDataItem to optionally have implicit geometry\r\n    // Once we do it, it shouldn't be a breaking change because if it doesn't\r\n    // have implicit, we just use explicit\r\n\r\n    const alignCat = new RegExp(ALIGNMENT_CATEGORY);\r\n    const allItemsIds = this._fragments.getItemsOfCategories([alignCat]);\r\n    const itemsIds = allItemsIds[ALIGNMENT_CATEGORY];\r\n\r\n    if (!itemsIds) {\r\n      return [];\r\n    }\r\n\r\n    const alignmentsItems = this._fragments.getItemsData(\r\n      itemsIds,\r\n      {},\r\n    ) as CustomDataItem[];\r\n\r\n    for (const item of alignmentsItems) {\r\n      const data = JSON.parse(item.data.value) as AlignmentData;\r\n      allAlignments.push(data);\r\n    }\r\n\r\n    return allAlignments;\r\n  }\r\n}\r\n","import {\r\n  AnyTileBasicData,\r\n  TileBasicData,\r\n  TileData,\r\n  VirtualTemplates,\r\n} from \"../virtual-meshes\";\r\n\r\nexport class VirtualTemplateController {\r\n  private readonly _templates: VirtualTemplates = new Map();\r\n\r\n  add(code: number, template: AnyTileBasicData) {\r\n    this._templates.set(code, template);\r\n  }\r\n\r\n  get(code: number) {\r\n    const templates = this._templates.get(code);\r\n    if (!Array.isArray(templates)) {\r\n      return { ...templates } as TileData;\r\n    }\r\n    return this.getTemplateSet(templates);\r\n  }\r\n\r\n  private getTemplateSet(templates: TileBasicData[]) {\r\n    const result: TileData[] = [];\r\n    for (const template of templates) {\r\n      const tileData = template as TileData;\r\n      const copy = { ...tileData };\r\n      result.push(copy);\r\n    }\r\n    return result;\r\n  }\r\n}\r\n","import { DataBuffer } from \"../model/model-types\";\r\n\r\nexport class VirtualBox {\r\n  private readonly _dataBuffer: DataBuffer;\r\n  private readonly _dataPosition: number;\r\n\r\n  private static readonly _data = {\r\n    size: 6,\r\n    defaultPosition: 0,\r\n    min: {\r\n      x: 0,\r\n      y: 2,\r\n      z: 4,\r\n    },\r\n    max: {\r\n      x: 1,\r\n      y: 3,\r\n      z: 5,\r\n    },\r\n    coords: [\"x\", \"y\", \"z\"] as const,\r\n    points: [\"min\", \"max\"] as const,\r\n  };\r\n\r\n  constructor(position?: number, data?: DataBuffer) {\r\n    this._dataBuffer = data || this.getDefaultData();\r\n    this._dataPosition = position || VirtualBox._data.defaultPosition;\r\n  }\r\n\r\n  set(values: number[]) {\r\n    let counter = 0;\r\n    for (const point of VirtualBox._data.points) {\r\n      for (const coord of VirtualBox._data.coords) {\r\n        const position = this.getPosition(coord, point);\r\n        const result = values[counter++];\r\n        this.setValue(position, result);\r\n      }\r\n    }\r\n  }\r\n\r\n  get(coord: \"x\" | \"y\" | \"z\", point: \"min\" | \"max\") {\r\n    const position = this.getPosition(coord, point);\r\n    return this._dataBuffer[position];\r\n  }\r\n\r\n  clone(box: VirtualBox): void {\r\n    for (const point of VirtualBox._data.points) {\r\n      for (const coord of VirtualBox._data.coords) {\r\n        const position = this.getPosition(coord, point);\r\n        const result = box.get(coord, point);\r\n        this.setValue(position, result);\r\n      }\r\n    }\r\n  }\r\n\r\n  combine(box1: VirtualBox, box2: VirtualBox): void {\r\n    for (const point of VirtualBox._data.points) {\r\n      for (const coord of VirtualBox._data.coords) {\r\n        this.save(coord, point, box1, box2);\r\n      }\r\n    }\r\n  }\r\n\r\n  private setValue(position: number, value: number) {\r\n    this._dataBuffer[position] = value;\r\n  }\r\n\r\n  private getDefaultData() {\r\n    return new Float64Array(VirtualBox._data.size);\r\n  }\r\n\r\n  private getPosition(coord: \"x\" | \"y\" | \"z\", point: \"min\" | \"max\") {\r\n    const coordPosition = VirtualBox._data[point][coord];\r\n    return coordPosition + this._dataPosition;\r\n  }\r\n\r\n  private save(\r\n    coord: \"x\" | \"y\" | \"z\",\r\n    point: \"min\" | \"max\",\r\n    first: VirtualBox,\r\n    second: VirtualBox,\r\n  ) {\r\n    const position = this.getPosition(coord, point);\r\n    const data1 = first.get(coord, point);\r\n    const data2 = second.get(coord, point);\r\n    const result = Math[point](data1, data2);\r\n    this.setValue(position, result);\r\n  }\r\n}\r\n","import { DataBuffer } from \"../model/model-types\";\r\nimport { VirtualBox } from \"./virtual-box\";\r\n\r\nexport class VirtualSpatialPoint {\r\n  readonly box: VirtualBox;\r\n  data = 0;\r\n\r\n  private static readonly _data = {\r\n    threshold: 0,\r\n    factor: -1,\r\n  };\r\n\r\n  constructor(position: number, data: DataBuffer) {\r\n    this.box = new VirtualBox(position, data);\r\n  }\r\n\r\n  get size() {\r\n    return this.data * VirtualSpatialPoint._data.factor;\r\n  }\r\n\r\n  get isPoint() {\r\n    return this.data >= VirtualSpatialPoint._data.threshold;\r\n  }\r\n\r\n  transform(size: number, box: VirtualBox, group: boolean) {\r\n    if (!group) {\r\n      size *= VirtualSpatialPoint._data.factor;\r\n    }\r\n    this.data = size;\r\n    this.box.clone(box);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { VirtualBox } from \"./virtual-box\";\r\nimport { VirtualBoxController } from \"./virtual-box-controller\";\r\n\r\nexport class VirtualBoxCompressor {\r\n  private _boxes: VirtualBoxController;\r\n  private _min = new THREE.Vector3();\r\n  private _max = new THREE.Vector3();\r\n\r\n  constructor(boxes: VirtualBoxController) {\r\n    this._boxes = boxes;\r\n  }\r\n\r\n  inflate(bounds: VirtualBox): THREE.Box3 {\r\n    const offset = this._boxes.fullBox.min;\r\n    const min = this.getVector(bounds, offset, \"min\");\r\n    const max = this.getVector(bounds, offset, \"max\");\r\n    return new THREE.Box3(min, max);\r\n  }\r\n\r\n  deflate(bounds: THREE.Box3, result: VirtualBox) {\r\n    this.read(bounds);\r\n    const data: number[] = [];\r\n    data.push(this._min.x, this._min.y, this._min.z);\r\n    data.push(this._max.x, this._max.y, this._max.z);\r\n    result.set(data);\r\n  }\r\n\r\n  private getVector(\r\n    bounds: VirtualBox,\r\n    offset: THREE.Vector3,\r\n    value: \"min\" | \"max\",\r\n  ) {\r\n    const x = bounds.get(\"x\", value) + offset.x;\r\n    const y = bounds.get(\"y\", value) + offset.y;\r\n    const z = bounds.get(\"z\", value) + offset.z;\r\n    return new THREE.Vector3(x, y, z);\r\n  }\r\n\r\n  private read(bounds: THREE.Box3) {\r\n    const { min } = this._boxes.fullBox;\r\n    this._min.subVectors(bounds.min, min);\r\n    this._max.subVectors(bounds.max, min);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { VirtualBox } from \"./virtual-box\";\r\nimport { CameraUtils } from \"../utils\";\r\nimport { VirtualSpatialPoint } from \"./virtual-spatial-point\";\r\nimport { VirtualBoxCompressor } from \"./virtual-box-compressor\";\r\n\r\ntype BoxEvent = (box: THREE.Box3) => boolean;\r\n\r\nexport class VirtualBoxCollider {\r\n  private readonly _data;\r\n  private readonly _compressor: VirtualBoxCompressor;\r\n\r\n  constructor(\r\n    compressor: VirtualBoxCompressor,\r\n    data: {\r\n      points: Array<VirtualSpatialPoint>;\r\n      limits: {\r\n        primary: Array<VirtualBox>;\r\n        secondary: Array<VirtualBox>;\r\n      };\r\n    },\r\n  ) {\r\n    this._data = data;\r\n    this._compressor = compressor;\r\n  }\r\n\r\n  frustumCollide(\r\n    bounds: THREE.Plane[],\r\n    frustum: THREE.Frustum,\r\n    fullyIncluded = false,\r\n  ): number[] {\r\n    const planes = this.getFrustumPlanes(frustum, bounds);\r\n    const onCollide = this.getFrustumOnCollide(planes);\r\n    const onIncludes = this.getFrustumOnIncludes(planes);\r\n    const onSeen = this.newDefaultCallback(true);\r\n    return this.collide(onCollide, onIncludes, onSeen, fullyIncluded);\r\n  }\r\n\r\n  rayCollide(bounds: THREE.Plane[], ray: THREE.Ray): number[] {\r\n    const onCollide = this.getRayOnCollide(ray);\r\n    const onIncludes = this.newDefaultCallback(false);\r\n    const onSeen = this.getRayOnSeen(bounds);\r\n    return this.collide(onCollide, onIncludes, onSeen);\r\n  }\r\n\r\n  private addPoint(\r\n    fullyIncluded: boolean,\r\n    result: number[],\r\n    currentPosition: number,\r\n    includes: boolean,\r\n  ) {\r\n    if (!fullyIncluded) {\r\n      result.push(this.getPointData(currentPosition));\r\n    } else if (includes) {\r\n      result.push(this.getPointData(currentPosition));\r\n    }\r\n  }\r\n\r\n  private getPointData(position: number): number {\r\n    const point = this.getPoint(position);\r\n    return point.data;\r\n  }\r\n\r\n  private getBounds(position: number): THREE.Box3 {\r\n    const point = this.getPoint(position);\r\n    return this._compressor.inflate(point.box);\r\n  }\r\n\r\n  private isPoint(position: number): boolean {\r\n    const point = this.getPoint(position);\r\n    return point.isPoint;\r\n  }\r\n\r\n  private newDefaultCallback(value: boolean) {\r\n    return (_args: any) => value;\r\n  }\r\n\r\n  private groupSize(position: number): number {\r\n    const point = this.getPoint(position);\r\n    return point.size;\r\n  }\r\n\r\n  private getPoint(position: number) {\r\n    return this._data.points[position];\r\n  }\r\n\r\n  private getRayOnSeen(bounds: THREE.Plane[]) {\r\n    let onSeen = this.newDefaultCallback(true);\r\n    const boundsExists = bounds?.length > 0;\r\n    if (boundsExists) {\r\n      onSeen = (box: THREE.Box3) => {\r\n        return CameraUtils.collides(box, bounds);\r\n      };\r\n    }\r\n    return onSeen;\r\n  }\r\n\r\n  private getRayOnCollide(beam: THREE.Ray) {\r\n    return (box: THREE.Box3) => {\r\n      return beam.intersectsBox(box);\r\n    };\r\n  }\r\n\r\n  private collide(\r\n    onCollide: BoxEvent,\r\n    onIncludes: BoxEvent,\r\n    onSeen: BoxEvent,\r\n    fullyIncluded = false,\r\n  ): number[] {\r\n    const pointAmount = this._data.points.length;\r\n    const result: number[] = [];\r\n    let currentPosition = 0;\r\n\r\n    const addAllPoints = (bound: THREE.Box3, includes: boolean) => {\r\n      const finalPosition = currentPosition + this.groupSize(currentPosition);\r\n      for (; currentPosition < finalPosition; currentPosition++) {\r\n        const isPoint = this.isPoint(currentPosition);\r\n        if (isPoint && onSeen(bound)) {\r\n          if (!fullyIncluded) {\r\n            this.savePoint(currentPosition, result);\r\n          } else if (includes) {\r\n            this.savePoint(currentPosition, result);\r\n          }\r\n        }\r\n      }\r\n    };\r\n\r\n    const processCollisions = () => {\r\n      const bound = this.getBounds(currentPosition);\r\n      const includes = onIncludes(bound);\r\n      const isPoint = this.isPoint(currentPosition);\r\n      const collides = includes || onCollide(bound);\r\n\r\n      if (isPoint && collides && onSeen(bound)) {\r\n        this.addPoint(fullyIncluded, result, currentPosition, includes);\r\n      }\r\n\r\n      if (collides || isPoint) {\r\n        currentPosition++;\r\n        if (includes && !isPoint) {\r\n          addAllPoints(bound, includes);\r\n        }\r\n      } else {\r\n        currentPosition += this.groupSize(currentPosition);\r\n      }\r\n    };\r\n\r\n    while (currentPosition < pointAmount) {\r\n      processCollisions();\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  private getFrustumOnIncludes(planes: THREE.Plane[]) {\r\n    return (box: THREE.Box3) => {\r\n      return CameraUtils.isIncluded(box, planes);\r\n    };\r\n  }\r\n\r\n  private getFrustumOnCollide(planes: THREE.Plane[]) {\r\n    return (box: THREE.Box3) => {\r\n      return CameraUtils.collides(box, planes);\r\n    };\r\n  }\r\n\r\n  private getFrustumPlanes(frustum: THREE.Frustum, bounds: THREE.Plane[]) {\r\n    const planes: THREE.Plane[] = [];\r\n    for (const plane of frustum.planes) {\r\n      planes.push(plane);\r\n    }\r\n    if (bounds) {\r\n      for (const plane of bounds) {\r\n        planes.push(plane);\r\n      }\r\n    }\r\n    return planes;\r\n  }\r\n\r\n  private savePoint(position: number, result: number[]) {\r\n    const point = this.getPoint(position);\r\n    result.push(point.data);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { DataBuffer } from \"../model/model-types\";\r\nimport { VirtualBoxController } from \"./virtual-box-controller\";\r\n\r\nexport class VirtualBoxSorter {\r\n  private _boxes: VirtualBoxController;\r\n  private _total = new THREE.Vector3();\r\n  private _change = new THREE.Vector3();\r\n  private _average = new THREE.Vector3();\r\n  private _tempCenterVector = new THREE.Vector3();\r\n  private _tempVectors = {\r\n    x: new THREE.Vector3(),\r\n    y: new THREE.Vector3(),\r\n    z: new THREE.Vector3(),\r\n  };\r\n\r\n  constructor(boxes: VirtualBoxController) {\r\n    this._boxes = boxes;\r\n  }\r\n\r\n  sort(dataBuffer: DataBuffer, a: number, b: number) {\r\n    this.average(this._average, dataBuffer, a, b);\r\n    this.getDataToTotal(a, b, dataBuffer);\r\n    let result = this.anySort(a, b, dataBuffer);\r\n    result = this.adjust(b, a, result);\r\n    return Math.round(result);\r\n  }\r\n\r\n  private anySort(a: number, b: number, dataBuffer: DataBuffer) {\r\n    if (this._total.x > this._total.y) {\r\n      if (this._total.x > this._total.z) {\r\n        return this.sortDim(\"x\", this._average.x, a, b, dataBuffer);\r\n      }\r\n      return this.sortDim(\"z\", this._average.z, a, b, dataBuffer);\r\n    }\r\n    if (this._total.y > this._total.z) {\r\n      return this.sortDim(\"y\", this._average.y, a, b, dataBuffer);\r\n    }\r\n    return this.sortDim(\"z\", this._average.z, a, b, dataBuffer);\r\n  }\r\n\r\n  private getDataToTotal(a: number, b: number, dataBuffer: DataBuffer) {\r\n    this._total.set(0, 0, 0);\r\n    for (let i = a; i < b; i++) {\r\n      const box = this._boxes.get(dataBuffer[i]);\r\n      box.getCenter(this._change).sub(this._average);\r\n      const deltaSquared = this._change.multiply(this._change);\r\n      this._total.add(deltaSquared);\r\n    }\r\n  }\r\n\r\n  private sortDim(\r\n    dimension: \"x\" | \"y\" | \"z\",\r\n    threshold: number,\r\n    first: number,\r\n    second: number,\r\n    elements: DataBuffer,\r\n  ) {\r\n    let position = first;\r\n    for (let i = first; i < second; i++) {\r\n      const value = this.getValue(elements, i, dimension);\r\n      if (value > threshold) {\r\n        this.exchange(i, position, elements);\r\n        position++;\r\n      }\r\n    }\r\n    return position;\r\n  }\r\n\r\n  private exchange(first: number, second: number, elements: DataBuffer) {\r\n    const value = elements[first];\r\n    elements[first] = elements[second];\r\n    elements[second] = value;\r\n  }\r\n\r\n  private getValue(\r\n    elements: DataBuffer,\r\n    i: number,\r\n    dimension: \"x\" | \"y\" | \"z\",\r\n  ) {\r\n    const box = this.getBox(elements, i);\r\n    const vector = this._tempVectors[dimension];\r\n    const value = box.getCenter(vector)[dimension];\r\n    return value;\r\n  }\r\n\r\n  private average(\r\n    result: THREE.Vector3,\r\n    elements: DataBuffer,\r\n    first: number,\r\n    second: number,\r\n  ) {\r\n    const box = this.getBox(elements, first);\r\n    box.getCenter(result);\r\n    this.aggregate(first, second, elements, box, result);\r\n    return result.divideScalar(second - first);\r\n  }\r\n\r\n  private aggregate(\r\n    first: number,\r\n    second: number,\r\n    elements: DataBuffer,\r\n    box: THREE.Box3,\r\n    result: THREE.Vector3,\r\n  ) {\r\n    for (let i = first + 1; i < second; i++) {\r\n      const current = elements[i];\r\n      box = this._boxes.get(current);\r\n      const center = box.getCenter(this._tempCenterVector);\r\n      result.add(center);\r\n    }\r\n  }\r\n\r\n  private adjust(b: number, a: number, result: number) {\r\n    const correction = (a + b) / 2;\r\n    const diff = b - a;\r\n    const factor = diff / 3;\r\n    if (result <= a + factor) {\r\n      result = correction;\r\n    } else if (result >= b - 1 - factor) {\r\n      result = correction;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private getBox(elements: DataBuffer, index: number) {\r\n    const selected = elements[index];\r\n    return this._boxes.get(selected);\r\n  }\r\n}\r\n","import { DataBuffer } from \"../model/model-types\";\r\nimport { VirtualBox } from \"./virtual-box\";\r\nimport { VirtualBoxCompressor } from \"./virtual-box-compressor\";\r\nimport { VirtualBoxController } from \"./virtual-box-controller\";\r\nimport { VirtualBoxSorter } from \"./virtual-box-sorter\";\r\nimport { VirtualSpatialPoint } from \"./virtual-spatial-point\";\r\n\r\nexport class VirtualBoxMaker {\r\n  private readonly _data;\r\n  private readonly _compressor: VirtualBoxCompressor;\r\n  private readonly _boxes: VirtualBoxController;\r\n  private readonly _sorter: VirtualBoxSorter;\r\n\r\n  constructor(\r\n    boxes: VirtualBoxController,\r\n    compressor: VirtualBoxCompressor,\r\n    data: {\r\n      points: Array<VirtualSpatialPoint>;\r\n      limits: {\r\n        primary: Array<VirtualBox>;\r\n        secondary: Array<VirtualBox>;\r\n      };\r\n    },\r\n  ) {\r\n    this._data = data;\r\n    this._compressor = compressor;\r\n    this._boxes = boxes;\r\n    this._sorter = new VirtualBoxSorter(boxes);\r\n  }\r\n\r\n  make(\r\n    data: DataBuffer,\r\n    bounds: VirtualBox,\r\n    a = 0,\r\n    b = 0,\r\n    size = 0,\r\n    result = 0,\r\n  ): number {\r\n    const distance = a - b;\r\n    if (distance === 1) {\r\n      return this.makePoint(data, b, bounds, result);\r\n    }\r\n    if (distance === 2) {\r\n      return this.makeGroup3(result, data, b, bounds);\r\n    }\r\n    return this.makeGroup(size, data, b, a, result, bounds);\r\n  }\r\n\r\n  private makeGroup3(\r\n    position: number,\r\n    data: DataBuffer,\r\n    b: number,\r\n    bounds: VirtualBox,\r\n  ) {\r\n    const box1 = this.makeBox(position + 1, data, b);\r\n    const box2 = this.makeBox(position + 2, data, b + 1);\r\n    bounds.combine(box1, box2);\r\n    this.newGroup(position, 3, bounds);\r\n    return 3;\r\n  }\r\n\r\n  private makeGroup(\r\n    size: number,\r\n    data: DataBuffer,\r\n    b: number,\r\n    a: number,\r\n    position: number,\r\n    bounds: VirtualBox,\r\n  ) {\r\n    const lim1 = this._data.limits.primary[size];\r\n    const lim2 = this._data.limits.secondary[size];\r\n    const frontier = this._sorter.sort(data, b, a);\r\n    const size1 = this.make(data, lim1, frontier, b, size + 1, position + 1);\r\n    const result2 = position + size1 + 1;\r\n    const size2 = this.make(data, lim2, a, frontier, size + 1, result2);\r\n    bounds.combine(lim1, lim2);\r\n    const newSize = size1 + size2 + 1;\r\n    this.newGroup(position, newSize, bounds);\r\n    return newSize;\r\n  }\r\n\r\n  private makeBox(position: number, data: DataBuffer, b: number) {\r\n    const box = this._data.points[position].box;\r\n    const boxPosition = data[b];\r\n    const boxData = this._boxes.get(boxPosition);\r\n    this._compressor.deflate(boxData, box);\r\n    this.set(position, boxPosition);\r\n    return box;\r\n  }\r\n\r\n  private makePoint(\r\n    data: DataBuffer,\r\n    b: number,\r\n    bounds: VirtualBox,\r\n    position: number,\r\n  ) {\r\n    const box = this._boxes.get(data[b]);\r\n    this._compressor.deflate(box, bounds);\r\n    this.newPoint(position, data[b], bounds);\r\n    return 1;\r\n  }\r\n\r\n  private newGroup(position: number, size: number, bounds: VirtualBox) {\r\n    const point = this.get(position);\r\n    point.transform(size, bounds, false);\r\n  }\r\n\r\n  private get(position: number) {\r\n    return this._data.points[position];\r\n  }\r\n\r\n  private newPoint(position: number, value: number, bounds: VirtualBox) {\r\n    const point = this.get(position);\r\n    point.transform(value, bounds, true);\r\n  }\r\n\r\n  private set(position: number, data: number) {\r\n    const point = this.get(position);\r\n    point.data = data;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { VirtualSpatialPoint } from \"./virtual-spatial-point\";\r\nimport { VirtualBox } from \"./virtual-box\";\r\nimport { VirtualBoxController } from \"./virtual-box-controller\";\r\nimport { VirtualBoxCompressor } from \"./virtual-box-compressor\";\r\nimport { VirtualBoxCollider } from \"./virtual-box-collider\";\r\nimport { VirtualBoxMaker } from \"./virtual-box-maker\";\r\n\r\nexport class VirtualBoxStructure {\r\n  private static readonly _boxSize = 6;\r\n  private static readonly _limitThreshold = 32;\r\n  private readonly _compressor: VirtualBoxCompressor;\r\n  private readonly _collider: VirtualBoxCollider;\r\n  private readonly _maker: VirtualBoxMaker;\r\n\r\n  private readonly _data: {\r\n    points: Array<VirtualSpatialPoint>;\r\n    limits: {\r\n      primary: Array<VirtualBox>;\r\n      secondary: Array<VirtualBox>;\r\n    };\r\n  };\r\n\r\n  private readonly _boxes: VirtualBoxController;\r\n\r\n  constructor(boxes: VirtualBoxController) {\r\n    this._boxes = boxes;\r\n    this._compressor = new VirtualBoxCompressor(boxes);\r\n    this._data = this.getData();\r\n    this._collider = new VirtualBoxCollider(this._compressor, this._data);\r\n    this._maker = new VirtualBoxMaker(\r\n      this._boxes,\r\n      this._compressor,\r\n      this._data,\r\n    );\r\n    this.initData();\r\n  }\r\n\r\n  collideFrustum(\r\n    bounds: THREE.Plane[],\r\n    frustum: THREE.Frustum,\r\n    fullyIncluded = false,\r\n  ): number[] {\r\n    return this._collider.frustumCollide(bounds, frustum, fullyIncluded);\r\n  }\r\n\r\n  collideRay(bounds: THREE.Plane[], beam: THREE.Ray): number[] {\r\n    return this._collider.rayCollide(bounds, beam);\r\n  }\r\n\r\n  private setupLimits() {\r\n    for (let i = 0; i < VirtualBoxStructure._limitThreshold; i++) {\r\n      this._data.limits.primary.push(new VirtualBox());\r\n      this._data.limits.secondary.push(new VirtualBox());\r\n    }\r\n  }\r\n\r\n  private getPointBuffer() {\r\n    const count = this._boxes.getCount();\r\n    const pointBuffer = new Uint32Array(count);\r\n    for (let i = 0; i < pointBuffer.length; i++) {\r\n      pointBuffer[i] = i;\r\n    }\r\n    return pointBuffer;\r\n  }\r\n\r\n  private getPointsAmount(pointBuffer: Uint32Array) {\r\n    const result = pointBuffer.length * 2;\r\n    return result - 1;\r\n  }\r\n\r\n  private initData() {\r\n    const pointBuffer = this.getPointBuffer();\r\n    const pointsAmount = this.getPointsAmount(pointBuffer);\r\n    const size = pointsAmount * VirtualBoxStructure._boxSize;\r\n    const data = new Float64Array(size);\r\n    for (let i = 0; i < pointsAmount; i++) {\r\n      const position = i * VirtualBoxStructure._boxSize;\r\n      const newPoint = new VirtualSpatialPoint(position, data);\r\n      this._data.points.push(newPoint);\r\n    }\r\n    this.setupLimits();\r\n    const root = new VirtualBox();\r\n    this._maker.make(pointBuffer, root, pointBuffer.length);\r\n  }\r\n\r\n  private getData() {\r\n    return {\r\n      points: [],\r\n      limits: {\r\n        primary: [],\r\n        secondary: [],\r\n      },\r\n    };\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { VirtualBoxStructure } from \"./virtual-box-structure\";\r\nimport { Representation, Sample, Model, Meshes } from \"../../../Schema\";\r\nimport { TransformHelper } from \"../utils\";\r\nimport { DataBuffer } from \"../model/model-types\";\r\n\r\nexport class VirtualBoxController {\r\n  lookup: VirtualBoxStructure | null = null;\r\n\r\n  private readonly _boxSize = 6;\r\n  private readonly _pointSize = 3;\r\n  private readonly _temp: {\r\n    box: THREE.Box3;\r\n    vector: THREE.Vector3;\r\n    transform: THREE.Matrix4;\r\n    sample: Sample;\r\n    representation: Representation;\r\n  };\r\n\r\n  private _dimensionsOfSamples: DataBuffer;\r\n  private _samples: number[][] = [];\r\n  private _boxes: DataBuffer;\r\n  private _meshes: Meshes;\r\n  private _box: THREE.Box3;\r\n\r\n  get fullBox() {\r\n    return this._box;\r\n  }\r\n\r\n  set fullBox(box: THREE.Box3) {\r\n    this._box = box;\r\n  }\r\n\r\n  constructor(fragments: Model) {\r\n    this._temp = {\r\n      box: new THREE.Box3(),\r\n      vector: new THREE.Vector3(),\r\n      transform: new THREE.Matrix4(),\r\n      sample: new Sample(),\r\n      representation: new Representation(),\r\n    };\r\n\r\n    this._box = new THREE.Box3();\r\n\r\n    const meshes = fragments.meshes();\r\n\r\n    if (!meshes) {\r\n      throw new Error(\"Fragments: Malformed fragments data!\");\r\n    }\r\n\r\n    this._meshes = meshes;\r\n    const sampleCount = meshes.samplesLength();\r\n    this._dimensionsOfSamples = new Float32Array(sampleCount);\r\n\r\n    const boxSize = sampleCount * this._boxSize;\r\n    this._boxes = new Float64Array(boxSize);\r\n    this.lookup = this.newLookup();\r\n  }\r\n\r\n  sampleOf(id: number): number[] | undefined {\r\n    return this._samples[id];\r\n  }\r\n\r\n  get(id: number): THREE.Box3 {\r\n    const minPosition = this.getMinPosition(id);\r\n    const maxPosition = this.getMaxPosition(id);\r\n    this._temp.box.min.fromArray(this._boxes, minPosition);\r\n    this._temp.box.max.fromArray(this._boxes, maxPosition);\r\n    return this._temp.box;\r\n  }\r\n\r\n  process(id: number): void {\r\n    this.fetchSampleAndRepresentation(id);\r\n    this.getBox();\r\n    this.addToFullBox();\r\n    const minPosition = this.getMinPosition(id);\r\n    const maxPosition = this.getMaxPosition(id);\r\n    this._temp.box.min.toArray(this._boxes, minPosition);\r\n    this._temp.box.max.toArray(this._boxes, maxPosition);\r\n  }\r\n\r\n  getCount() {\r\n    return this._boxes.length / this._boxSize;\r\n  }\r\n\r\n  dimensionOf(id: number) {\r\n    const dimension = this._dimensionsOfSamples[id];\r\n    if (!dimension) {\r\n      throw new Error(\"Fragments: Dimension not found!\");\r\n    }\r\n    return dimension;\r\n  }\r\n\r\n  private newLookup() {\r\n    const sampleCount = this._meshes.samplesLength();\r\n    const itemsCount = this._meshes.globalTransformsLength();\r\n\r\n    // Empty model\r\n    if (sampleCount === 0) {\r\n      return null;\r\n    }\r\n\r\n    for (let i = 0; i < sampleCount; i++) {\r\n      this.fetchSampleAndRepresentation(i);\r\n      TransformHelper.getBox(this._temp.representation, this._temp.box);\r\n      const dimension = this._temp.box.getSize(this._temp.vector);\r\n      this._dimensionsOfSamples[i] = dimension.length();\r\n      this.process(i);\r\n    }\r\n\r\n    this._samples = new Array(itemsCount);\r\n    for (let i = 0; i < sampleCount; i++) {\r\n      this.storeBox(i);\r\n    }\r\n\r\n    if (!this.getCount()) {\r\n      throw new Error(\"Fragments: Malformed boxes!\");\r\n    }\r\n\r\n    return new VirtualBoxStructure(this);\r\n  }\r\n\r\n  private getBox() {\r\n    TransformHelper.get(this._temp.sample, this._meshes, this._temp.transform);\r\n    TransformHelper.getBox(this._temp.representation, this._temp.box);\r\n    this._temp.box.applyMatrix4(this._temp.transform);\r\n  }\r\n\r\n  private fetchSampleAndRepresentation(id: number) {\r\n    this._meshes.samples(id, this._temp.sample);\r\n    const representationId = this._temp.sample.representation();\r\n    this._meshes.representations(representationId, this._temp.representation);\r\n  }\r\n\r\n  private getMinPosition(id: number) {\r\n    return id * this._boxSize;\r\n  }\r\n\r\n  private storeBox(id: number) {\r\n    this.fetchSampleAndRepresentation(id);\r\n    const sampleId = this._temp.sample.item();\r\n    if (this._samples[sampleId] === undefined) {\r\n      this._samples[sampleId] = [];\r\n    }\r\n    this._samples[sampleId].push(id);\r\n  }\r\n\r\n  private getMaxPosition(id: number) {\r\n    return id * this._boxSize + this._pointSize;\r\n  }\r\n\r\n  private addToFullBox() {\r\n    this.fullBox.union(this._temp.box);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { VirtualFragmentsModel } from \"../virtual-fragments-model\";\r\nimport { SnappingClass } from \"../../model/model-types\";\r\n\r\nexport class RaycastHelper {\r\n  raycast(\r\n    model: VirtualFragmentsModel,\r\n    ray: THREE.Ray,\r\n    frustum: THREE.Frustum,\r\n    returnAll?: boolean,\r\n  ): any {\r\n    if (model.view) {\r\n      return model.raycaster.raycast(\r\n        ray,\r\n        frustum,\r\n        model.view.clippingPlanes,\r\n        returnAll,\r\n      );\r\n    }\r\n    return undefined;\r\n  }\r\n\r\n  snapRaycast(\r\n    model: VirtualFragmentsModel,\r\n    ray: THREE.Ray,\r\n    frustum: THREE.Frustum,\r\n    snappingClass: SnappingClass[],\r\n  ): any[] {\r\n    if (model.view) {\r\n      return model.raycaster.snapRaycast(\r\n        ray,\r\n        frustum,\r\n        snappingClass,\r\n        model.view.clippingPlanes,\r\n      );\r\n    }\r\n    return [];\r\n  }\r\n\r\n  rectangleRaycast(\r\n    model: VirtualFragmentsModel,\r\n    frustum: THREE.Frustum,\r\n    fullyIncluded: boolean,\r\n  ): number[] {\r\n    if (model.view) {\r\n      return model.raycaster.rectangleRaycast(\r\n        frustum,\r\n        model.view.clippingPlanes,\r\n        fullyIncluded,\r\n      );\r\n    }\r\n    return [];\r\n  }\r\n}\r\n","import { VirtualFragmentsModel } from \"../virtual-fragments-model\";\r\n\r\nexport class CoordinatesHelper {\r\n  getPositions(model: VirtualFragmentsModel, localIds: number[]) {\r\n    const positions: { x: number; y: number; z: number }[] = [];\r\n    const itemIds = model.properties.getItemIdsFromLocalIds(localIds);\r\n    for (const id of itemIds) {\r\n      const transform = model.tiles.meshes.globalTransforms(id);\r\n      if (!transform) {\r\n        continue;\r\n      }\r\n      const position = transform.position()!;\r\n      const x = position.x();\r\n      const y = position.y();\r\n      const z = position.z();\r\n      positions.push({ x, y, z });\r\n    }\r\n    return positions;\r\n  }\r\n\r\n  getCoordinates(model: VirtualFragmentsModel): number[] {\r\n    const meshes = model.data.meshes()!;\r\n    const coords = meshes.coordinates()!;\r\n    const position = coords.position()!;\r\n    const xDir = coords.xDirection()!;\r\n    const yDir = coords.yDirection()!;\r\n    const x = position.x();\r\n    const y = position.y();\r\n    const z = position.z();\r\n    const xx = xDir.x();\r\n    const xy = xDir.y();\r\n    const xz = xDir.z();\r\n    const yx = yDir.x();\r\n    const yy = yDir.y();\r\n    const yz = yDir.z();\r\n    // prettier-ignore\r\n    return [\r\n        x, y, z, \r\n        xx, xy, xz, \r\n        yx, yy, yz\r\n    ];\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { MaterialDefinition } from \"../../model/model-types\";\r\nimport { VirtualFragmentsModel } from \"../virtual-fragments-model\";\r\n\r\nexport class HighlightHelper {\r\n  private readonly _highlightProps = [\r\n    \"color\",\r\n    \"opacity\",\r\n    \"transparent\",\r\n    \"renderedFaces\",\r\n  ];\r\n\r\n  resetHighlight(model: VirtualFragmentsModel, items: number[]): void {\r\n    const itemIds = model.properties.getItemIdsFromLocalIds(items);\r\n    this.resetHighlightForItems(itemIds, model);\r\n    model.tiles.restart();\r\n  }\r\n\r\n  getHighlight(model: VirtualFragmentsModel, localIds: number[]) {\r\n    const found: MaterialDefinition[] = [];\r\n    const itemIds = model.properties.getItemIdsFromLocalIds(localIds);\r\n    const fetchEvent = this.getFetchEvent(model, found);\r\n    model.traverse(itemIds, fetchEvent);\r\n    return found;\r\n  }\r\n\r\n  getHighlightItems(model: VirtualFragmentsModel) {\r\n    const found: number[] = [];\r\n    const count = model.itemConfig.size;\r\n    for (let itemId = 0; itemId < count; itemId++) {\r\n      const hasHighlight = model.itemConfig.getHighlight(itemId);\r\n      if (!hasHighlight) continue;\r\n      const [localId] = model.properties.getLocalIdsFromItemIds([itemId]);\r\n      found.push(localId);\r\n    }\r\n    return found;\r\n  }\r\n\r\n  highlight(\r\n    model: VirtualFragmentsModel,\r\n    items: number[],\r\n    material: MaterialDefinition,\r\n  ) {\r\n    const itemIds = model.properties.getItemIdsFromLocalIds(items);\r\n    const materials: MaterialDefinition[] = [];\r\n    const highlightEvent = this.getCheckEvent(model, material, materials);\r\n    model.traverse(itemIds, highlightEvent);\r\n    const ids = model.materials.transfer(materials);\r\n    const createEvent = this.getCreateEvent(model, ids);\r\n    model.traverse(itemIds, createEvent);\r\n    model.tiles.updateVirtualMeshes(itemIds);\r\n  }\r\n\r\n  private hasEffectiveProperties(material: Partial<MaterialDefinition>) {\r\n    const { preserveOriginalMaterial, ...rest } = material;\r\n    return Object.keys(rest).length > 0;\r\n  }\r\n\r\n  private updateHighlightDefinition(\r\n    model: VirtualFragmentsModel,\r\n    items: number[],\r\n    updateFn: (current: MaterialDefinition) => Partial<MaterialDefinition>,\r\n  ) {\r\n    const itemIds = model.properties.getItemIdsFromLocalIds(items);\r\n    const itemsToUpdate: number[] = [];\r\n    const itemsToClear: number[] = [];\r\n    const materials: MaterialDefinition[] = [];\r\n\r\n    for (const itemId of itemIds) {\r\n      const highlightId = model.itemConfig.getHighlight(itemId);\r\n      if (highlightId) {\r\n        const currentHighlight = model.materials.fetch(highlightId);\r\n        const updated = updateFn(currentHighlight);\r\n        if (this.hasEffectiveProperties(updated)) {\r\n          const newMaterial = {\r\n            ...updated,\r\n            preserveOriginalMaterial: true,\r\n          } as MaterialDefinition;\r\n          materials.push(newMaterial);\r\n          itemsToUpdate.push(itemId);\r\n        } else {\r\n          itemsToClear.push(itemId);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (itemsToClear.length > 0) {\r\n      for (const itemId of itemsToClear) {\r\n        model.itemConfig.setHighlight(itemId, 0);\r\n      }\r\n    }\r\n\r\n    if (itemsToUpdate.length > 0) {\r\n      const ids = model.materials.transfer(materials);\r\n      const createEvent = this.getCreateEvent(model, ids);\r\n      model.traverse(itemsToUpdate, createEvent);\r\n    }\r\n\r\n    model.tiles.updateVirtualMeshes(itemIds);\r\n  }\r\n\r\n  setColor(\r\n    model: VirtualFragmentsModel,\r\n    items: number[],\r\n    color: MaterialDefinition[\"color\"],\r\n  ) {\r\n    let normalizedColor = color;\r\n    if (color && !color.isColor && typeof color.r === \"number\") {\r\n      normalizedColor = new THREE.Color().setRGB(\r\n        color.r,\r\n        color.g,\r\n        color.b,\r\n        THREE.SRGBColorSpace\r\n      );\r\n    }\r\n    const material = {\r\n      color: normalizedColor,\r\n      preserveOriginalMaterial: true,\r\n      _explicitProps: ['color'],\r\n    } as MaterialDefinition;\r\n    this.highlight(model, items, material);\r\n  }\r\n\r\n  resetColor(model: VirtualFragmentsModel, items: number[]) {\r\n    this.updateHighlightDefinition(model, items, (current) => {\r\n      const { color: _, ...rest } = current;\r\n      return rest;\r\n    });\r\n  }\r\n\r\n  setOpacity(\r\n    model: VirtualFragmentsModel,\r\n    items: number[],\r\n    opacity: number,\r\n  ) {\r\n    const material = {\r\n      opacity,\r\n      transparent: opacity < 1,\r\n      preserveOriginalMaterial: true,\r\n      _explicitProps: ['opacity', 'transparent'],\r\n    } as MaterialDefinition;\r\n    this.highlight(model, items, material);\r\n  }\r\n\r\n  resetOpacity(model: VirtualFragmentsModel, items: number[]) {\r\n    this.updateHighlightDefinition(model, items, (current) => {\r\n      const { opacity: _o, transparent: _t, ...rest } = current;\r\n      return rest;\r\n    });\r\n  }\r\n\r\n  private getFetchEvent(\r\n    model: VirtualFragmentsModel,\r\n    found: MaterialDefinition[],\r\n  ) {\r\n    return (itemId: number) => {\r\n      const id = model.itemConfig.getHighlight(itemId);\r\n      if (id) {\r\n        const result = model.materials.fetch(id);\r\n        found.push(result);\r\n        return;\r\n      }\r\n      found.push(undefined as any);\r\n    };\r\n  }\r\n\r\n  private setHighlightProperty(\r\n    newHigh: MaterialDefinition,\r\n    pastHigh: MaterialDefinition,\r\n    key: keyof MaterialDefinition,\r\n  ) {\r\n    if (newHigh[key] === undefined && pastHigh[key] !== undefined) {\r\n      (newHigh[key] as any) = pastHigh[key];\r\n    }\r\n  }\r\n\r\n  private getNewHighFromPast(\r\n    model: VirtualFragmentsModel,\r\n    past: number,\r\n    highlightMaterial: MaterialDefinition,\r\n  ) {\r\n    const pastHigh = model.materials.fetch(past);\r\n    const newHigh = { ...highlightMaterial } as MaterialDefinition;\r\n\r\n    const pastExplicit: string[] = (pastHigh as any)._explicitProps || [];\r\n    const newExplicit: string[] = (highlightMaterial as any)._explicitProps || [];\r\n\r\n    if (pastExplicit.length > 0 || newExplicit.length > 0) {\r\n      for (const prop of pastExplicit) {\r\n        const key = prop as keyof MaterialDefinition;\r\n        if (!newExplicit.includes(prop) && pastHigh[key] !== undefined) {\r\n          (newHigh as any)[prop] = pastHigh[key];\r\n        }\r\n      }\r\n      (newHigh as any)._explicitProps = [...new Set([...pastExplicit, ...newExplicit])];\r\n    } else {\r\n      for (const prop of this._highlightProps) {\r\n        this.setHighlightProperty(newHigh, pastHigh, prop as keyof MaterialDefinition);\r\n      }\r\n    }\r\n\r\n    return newHigh;\r\n  }\r\n\r\n  private getCheckEvent(\r\n    model: VirtualFragmentsModel,\r\n    highlightMaterial: MaterialDefinition,\r\n    materials: MaterialDefinition[],\r\n  ) {\r\n    return (itemId: number) => {\r\n      const past = model.itemConfig.getHighlight(itemId);\r\n      if (past !== undefined) {\r\n        const newHigh = this.getNewHighFromPast(model, past, highlightMaterial);\r\n        materials.push(newHigh);\r\n        return;\r\n      }\r\n      materials.push(highlightMaterial);\r\n    };\r\n  }\r\n\r\n  private getCreateEvent(model: VirtualFragmentsModel, ids: number[]) {\r\n    return (itemId: number, position: number) => {\r\n      model.itemConfig.setHighlight(itemId, ids[position]);\r\n    };\r\n  }\r\n\r\n  private resetHighlightForItems(\r\n    itemIds: number[],\r\n    model: VirtualFragmentsModel,\r\n  ) {\r\n    if (!itemIds) {\r\n      model.itemConfig.clearHighlight();\r\n      return;\r\n    }\r\n    for (const itemId of itemIds) {\r\n      model.itemConfig.setHighlight(itemId, 0);\r\n    }\r\n  }\r\n}\r\n","import { VirtualFragmentsModel } from \"../virtual-fragments-model\";\r\n\r\nexport class VisibilityHelper {\r\n  private _hiddenForEdit = new Set<number>();\r\n\r\n  resetVisible(model: VirtualFragmentsModel) {\r\n    model.itemConfig.clearVisible();\r\n    model.tiles.restart();\r\n  }\r\n\r\n  getVisible(model: VirtualFragmentsModel, items: number[]) {\r\n    const itemIds = model.properties.getItemIdsFromLocalIds(items);\r\n    const result: boolean[] = [];\r\n    for (const id of itemIds) {\r\n      if (this._hiddenForEdit.has(id)) {\r\n        continue;\r\n      }\r\n      const isVisible = model.itemConfig.visible(id);\r\n      result.push(isVisible);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  getItemsByVisibility(model: VirtualFragmentsModel, visible: boolean) {\r\n    const visibleCondition = this.getVisibleCondition(model, visible);\r\n    const result = model.getItemsByConfig(visibleCondition);\r\n    const localIds = model.properties.getLocalIdsFromItemIds(result);\r\n    const filtered = this.filterHiddenForEdit(localIds);\r\n    return filtered;\r\n  }\r\n\r\n  toggleVisible(model: VirtualFragmentsModel, localIds: number[]) {\r\n    const itemIds = model.properties.getItemIdsFromLocalIds(localIds);\r\n    const filtered = this.filterHiddenForEdit(itemIds);\r\n    const toggleEvent = this.getToggleEvent(model);\r\n    model.traverse(filtered, toggleEvent);\r\n    model.tiles.updateVirtualMeshes(filtered);\r\n  }\r\n\r\n  setVisible(\r\n    model: VirtualFragmentsModel,\r\n    localIds: number[],\r\n    visible: boolean,\r\n  ): void {\r\n    const itemIds = model.properties.getItemIdsFromLocalIds(localIds);\r\n    const filtered = this.filterHiddenForEdit(itemIds);\r\n    const setEvent = this.getSetEvent(model, visible);\r\n    model.traverse(filtered, setEvent);\r\n    model.tiles.updateVirtualMeshes(filtered);\r\n  }\r\n\r\n  // Edited items are hidden and ignore all future visibility requests\r\n  // Because their visibility is handled from the delta model\r\n  hideForEdit(model: VirtualFragmentsModel, localIds: number[]) {\r\n    this.setVisible(model, localIds, false);\r\n    for (const id of localIds) {\r\n      this._hiddenForEdit.add(id);\r\n    }\r\n  }\r\n\r\n  // Remove items from the hidden-for-edit set so future setVisible calls\r\n  // can control them again. Used when navigating history back to a state\r\n  // where those items are no longer in the delta.\r\n  unhideForEdit(localIds: number[]) {\r\n    for (const id of localIds) {\r\n      this._hiddenForEdit.delete(id);\r\n    }\r\n  }\r\n\r\n  // Clear the entire hidden-for-edit set. Used when undoing all edits\r\n  // so every item can be made visible on the base model again.\r\n  clearHiddenForEdit() {\r\n    this._hiddenForEdit.clear();\r\n  }\r\n\r\n  private filterHiddenForEdit(localIds: number[]) {\r\n    if (!this._hiddenForEdit.size) {\r\n      return localIds;\r\n    }\r\n    const result: number[] = [];\r\n    for (const id of localIds) {\r\n      if (this._hiddenForEdit.has(id)) {\r\n        continue;\r\n      }\r\n      result.push(id);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private getSetEvent(model: VirtualFragmentsModel, visible: boolean) {\r\n    return (itemId: number) => {\r\n      model.itemConfig.setVisible(itemId, visible);\r\n    };\r\n  }\r\n\r\n  private getVisibleCondition(model: VirtualFragmentsModel, visible: boolean) {\r\n    return (itemId: number) => {\r\n      const currentVisible = model.itemConfig.visible(itemId);\r\n      return currentVisible === visible;\r\n    };\r\n  }\r\n\r\n  private getToggleEvent(model: VirtualFragmentsModel) {\r\n    return (itemId: number) => {\r\n      const isVisible = model.itemConfig.visible(itemId);\r\n      model.itemConfig.setVisible(itemId, !isVisible);\r\n    };\r\n  }\r\n}\r\n","import { CurrentLod, MeshData } from \"../../model/model-types\";\r\nimport { VirtualFragmentsModel } from \"../virtual-fragments-model\";\r\n\r\ninterface Vector3 {\r\n  x: number;\r\n  y: number;\r\n  z: number;\r\n}\r\n\r\nexport class GeometryHelper {\r\n  getGeometriesLength(model: VirtualFragmentsModel) {\r\n    return model.data.meshes()!.globalTransformsLength();\r\n  }\r\n\r\n  getSampleGeometry(\r\n    model: VirtualFragmentsModel,\r\n    itemIndex: number,\r\n    lod: CurrentLod,\r\n  ): MeshData[] {\r\n    const sampleIndices = model.boxes.sampleOf(itemIndex);\r\n    const result: MeshData[] = [];\r\n    if (!sampleIndices) return result;\r\n\r\n    const meshes = model.data.meshes()!;\r\n\r\n    for (const sampleIndex of sampleIndices) {\r\n      const sample = model.tiles.fetchSample(sampleIndex, lod);\r\n      const sampleId = meshes.sampleIds(sampleIndex) as number;\r\n      const geometries = Array.isArray(sample.geometries)\r\n        ? sample.geometries\r\n        : [sample.geometries];\r\n\r\n      const sampleData = meshes.samples(sampleIndex)!;\r\n      const localIdIndex = meshes.meshesItems(sampleData.item()!)!;\r\n      const localId = model.data.localIds(localIdIndex)!;\r\n\r\n      for (const geometry of geometries) {\r\n        // We need to clone it when using LOD because it uses referenced internal data\r\n        const pos =\r\n          lod === CurrentLod.GEOMETRY\r\n            ? geometry.positionBuffer\r\n            : new Float32Array(geometry.positionBuffer);\r\n\r\n        result.push({\r\n          transform: sample.transform.clone(),\r\n          indices: geometry.indexBuffer,\r\n          positions: pos,\r\n          normals: geometry.normalBuffer,\r\n          sampleId,\r\n          localId,\r\n          representationId: sample.representationId,\r\n        });\r\n      }\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  getVolume(model: VirtualFragmentsModel, id: number) {\r\n    let volume = 0;\r\n    const p1: Vector3 = { x: 0, y: 0, z: 0 };\r\n    const p2: Vector3 = { x: 0, y: 0, z: 0 };\r\n    const p3: Vector3 = { x: 0, y: 0, z: 0 };\r\n\r\n    const geometries = this.getSampleGeometry(model, id, CurrentLod.GEOMETRY);\r\n    for (const { indices, positions } of geometries) {\r\n      if (!(indices && positions)) continue;\r\n      for (let i = 0; i < indices.length - 2; i += 3) {\r\n        const i1 = indices[i] * 3;\r\n        const i2 = indices[i + 1] * 3;\r\n        const i3 = indices[i + 2] * 3;\r\n        p1.x = positions[i1];\r\n        p1.y = positions[i1 + 1];\r\n        p1.z = positions[i1 + 2];\r\n        p2.x = positions[i2];\r\n        p2.y = positions[i2 + 1];\r\n        p2.z = positions[i2 + 2];\r\n        p3.x = positions[i3];\r\n        p3.y = positions[i3 + 1];\r\n        p3.z = positions[i3 + 2];\r\n        volume += this.getSignedVolumeOfTriangle(p1, p2, p3);\r\n      }\r\n    }\r\n\r\n    return Math.abs(volume);\r\n  }\r\n\r\n  private getSignedVolumeOfTriangle(p1: Vector3, p2: Vector3, p3: Vector3) {\r\n    const v321 = p3.x * p2.y * p1.z;\r\n    const v231 = p2.x * p3.y * p1.z;\r\n    const v312 = p3.x * p1.y * p2.z;\r\n    const v132 = p1.x * p3.y * p2.z;\r\n    const v213 = p2.x * p1.y * p3.z;\r\n    const v123 = p1.x * p2.y * p3.z;\r\n    return (1.0 / 6.0) * (-v321 + v231 + v312 - v132 - v213 + v123);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { VirtualFragmentsModel } from \"../virtual-fragments-model\";\r\nimport { CurrentLod, ModelSection } from \"../../model/model-types\";\r\nimport { MiscHelper, SectionGenerator } from \"../../utils\";\r\n\r\nexport class SectionHelper {\r\n  private _sectionGenerator = new SectionGenerator();\r\n\r\n  async getSection(\r\n    model: VirtualFragmentsModel,\r\n    plane: THREE.Plane,\r\n    indices: number[],\r\n  ) {\r\n    // TODO: Accept item IDs to traverse in the args\r\n\r\n    this._sectionGenerator.plane = plane;\r\n\r\n    // Traverse all items of the model to get all intersecting geometries\r\n\r\n    // @ts-ignore\r\n    const start = performance.now();\r\n    const visitedGeometries = new Map<number, THREE.BufferGeometry[]>();\r\n\r\n    const meshes: THREE.Mesh[] = [];\r\n\r\n    for (const itemID of indices) {\r\n      const sampleIds = model.boxes.sampleOf(itemID);\r\n      if (!sampleIds) continue;\r\n      for (const sampleId of sampleIds) {\r\n        // Fast check if the plane intersects this geometry instance\r\n        const boundingBox = model.boxes.get(sampleId);\r\n        if (!plane.intersectsBox(boundingBox)) {\r\n          continue;\r\n        }\r\n\r\n        // It intersects, so let's compute the edges and fills\r\n\r\n        // TODO: Allow user to select which categories to include\r\n        const localIDIndex = model.tiles.meshes.meshesItems(itemID)!;\r\n        const category = model.data.categories(localIDIndex);\r\n        if (category === \"IFCSPACE\") {\r\n          continue;\r\n        }\r\n\r\n        const sample = model.tiles.meshes.samples(sampleId);\r\n        if (!sample) continue;\r\n        const definitionID = sample.representation();\r\n\r\n        if (!visitedGeometries.has(definitionID)) {\r\n          // This geometry hasn't been processed yet, so let's process it\r\n\r\n          const geometries: THREE.BufferGeometry[] = [];\r\n\r\n          const sampleGeom = model.tiles.fetchSample(\r\n            sampleId,\r\n            CurrentLod.GEOMETRY,\r\n          );\r\n\r\n          MiscHelper.forEach(sampleGeom.geometries, (geometryData) => {\r\n            if (!geometryData.indexBuffer || !geometryData.positionBuffer) {\r\n              return;\r\n            }\r\n            const geometry = new THREE.BufferGeometry();\r\n            geometry.setIndex(Array.from(geometryData.indexBuffer));\r\n            geometry.setAttribute(\r\n              \"position\",\r\n              new THREE.BufferAttribute(geometryData.positionBuffer, 3),\r\n            );\r\n            geometries.push(geometry);\r\n          });\r\n\r\n          visitedGeometries.set(definitionID, geometries);\r\n        }\r\n\r\n        const geometries = visitedGeometries.get(definitionID);\r\n        if (!geometries) continue;\r\n\r\n        for (const geometry of geometries) {\r\n          const mesh = new THREE.Mesh(geometry);\r\n          const transform = model.tiles.getSampleTransform(sampleId);\r\n          mesh.applyMatrix4(transform);\r\n          mesh.updateWorldMatrix(true, true);\r\n          meshes.push(mesh);\r\n        }\r\n      }\r\n    }\r\n\r\n    // Now that we have all intersecting meshes, compute the edges and fills\r\n\r\n    // TODO: Increase this as needed?\r\n    const buffer = new Float32Array(600000);\r\n    const posAttr = new THREE.BufferAttribute(buffer, 3, false);\r\n\r\n    // meshes.length = 0;\r\n    // meshes.push(new Mesh(new BoxGeometry(1, 1, 1)));\r\n\r\n    const { index, indexes } = this._sectionGenerator.createEdges({\r\n      meshes,\r\n      posAttr,\r\n    });\r\n    const fillsIndices = this._sectionGenerator.createFills(buffer, indexes);\r\n\r\n    // console.log(performance.now() - start);\r\n\r\n    // Clean up\r\n    for (const [, geometries] of visitedGeometries) {\r\n      for (const geometry of geometries) {\r\n        geometry.dispose();\r\n      }\r\n    }\r\n\r\n    const result: ModelSection = {\r\n      buffer,\r\n      index,\r\n      fillsIndices,\r\n    };\r\n\r\n    return result;\r\n  }\r\n}\r\n","import {\r\n  ItemInformationType,\r\n  ItemSelectionType,\r\n} from \"../../model/model-types\";\r\nimport { VirtualFragmentsModel } from \"../virtual-fragments-model\";\r\n\r\nexport class SequenceHelper {\r\n  private _model: VirtualFragmentsModel;\r\n\r\n  constructor(model: VirtualFragmentsModel) {\r\n    this._model = model;\r\n  }\r\n\r\n  getSequenced(\r\n    result: ItemInformationType,\r\n    fromItems: ItemSelectionType[],\r\n    inputs?: {\r\n      selector?: Partial<Record<ItemSelectionType, any>>;\r\n      result?: any;\r\n    },\r\n  ) {\r\n    const resultFunction = this.sequenceResultFunction[result];\r\n    if (!resultFunction) return null;\r\n    let partial: number[] = [];\r\n    let iterations = 0;\r\n    for (const action of fromItems) {\r\n      const selectorFunction = this.sequenceSelectorFunction[action];\r\n      if (!selectorFunction) continue;\r\n      const input = inputs?.selector?.[action];\r\n      const data = iterations === 0 ? input : partial;\r\n      partial = selectorFunction(data);\r\n      iterations++;\r\n    }\r\n    const input = inputs?.result;\r\n    const out = resultFunction(partial, input);\r\n    return out;\r\n  }\r\n\r\n  private sequenceSelectorFunction: Record<\r\n    ItemSelectionType,\r\n    (...args: any) => number[]\r\n  > = {\r\n    withVisiblity: (_) => this._model.getItemsByVisibility(_),\r\n    highlighted: () => this._model.getHighlightItemIds(),\r\n    children: (_) => this._model.getItemsChildren(_),\r\n    ofCategory: (_) => {\r\n      const categoryIds = this._model.getItemsOfCategories(_);\r\n      return Object.values(categoryIds).flat();\r\n    },\r\n    withCondition: () => [],\r\n    withGeometry: () => this._model.getItemsWithGeometry(),\r\n  };\r\n\r\n  private sequenceResultFunction: Record<\r\n    ItemInformationType,\r\n    (ids: number[], ...args: any) => any\r\n  > = {\r\n    attributes: (ids: number[]) =>\r\n      ids.map((id) => this._model.getItemAttributes(id)),\r\n    mergedBoxes: (_) => this._model.getBBoxes(_),\r\n    category: (ids: number[]) => this._model.getItemsCategories(ids),\r\n    children: (_) => this._model.getItemsChildren(_),\r\n    data: (ids: number[], ...args) => this._model.getItemsData(ids, args[0]),\r\n    geometry: (ids: number[]) => this._model.getItemsGeometry(ids),\r\n    guid: (_) => this._model.getGuidsByLocalIds(_),\r\n    highlight: (_) => this._model.getHighlight(_),\r\n    relations: (ids: number[]) =>\r\n      ids.map((id) => this._model.getItemRelations(id)),\r\n    visibility: (_) => this._model.getVisible(_),\r\n  };\r\n}\r\n","import { VirtualFragmentsModel } from \"../virtual-fragments-model\";\r\n\r\nexport class ItemsHelper {\r\n  traverse(\r\n    model: VirtualFragmentsModel,\r\n    itemIds: number[],\r\n    onItem: (itemId: number, index: number) => void,\r\n  ) {\r\n    if (itemIds) {\r\n      this.traverseItems(itemIds, onItem);\r\n      return;\r\n    }\r\n    this.traverseAllItems(model, onItem);\r\n  }\r\n\r\n  getItemsByConfig(\r\n    model: VirtualFragmentsModel,\r\n    condition: (item: number) => boolean,\r\n  ) {\r\n    const found: number[] = [];\r\n    const count = model.data.localIdsLength();\r\n    for (let itemId = 0; itemId < count; itemId++) {\r\n      const conditionPass = condition(itemId);\r\n      if (!conditionPass) continue;\r\n      found.push(itemId);\r\n    }\r\n    return found;\r\n  }\r\n\r\n  private traverseItems(\r\n    itemIds: number[],\r\n    onItem: (itemId: number, index: number) => void,\r\n  ) {\r\n    const itemsCount = itemIds.length;\r\n    for (let id = 0; id < itemsCount; id++) {\r\n      onItem(itemIds[id], id);\r\n    }\r\n  }\r\n\r\n  private traverseAllItems(\r\n    model: VirtualFragmentsModel,\r\n    onItem: (itemId: number, index: number) => void,\r\n  ) {\r\n    const itemsCount = model.itemConfig.size;\r\n    for (let id = 0; id < itemsCount; id++) {\r\n      onItem(id, id);\r\n    }\r\n  }\r\n}\r\n","import { VirtualFragmentsModel } from \"..\";\r\nimport {\r\n  CustomDataItem,\r\n  GRID_CATEGORY,\r\n  GridData,\r\n} from \"../../model/model-types\";\r\n\r\nexport class GridsController {\r\n  private _fragments: VirtualFragmentsModel;\r\n\r\n  constructor(virtualFragmentsModel: VirtualFragmentsModel) {\r\n    this._fragments = virtualFragmentsModel;\r\n  }\r\n\r\n  async getGrids() {\r\n    const allGrids: GridData[] = [];\r\n\r\n    const gridCat = new RegExp(GRID_CATEGORY);\r\n    const allItemsIds = this._fragments.getItemsOfCategories([gridCat]);\r\n    const itemsIds = allItemsIds[GRID_CATEGORY];\r\n\r\n    if (!itemsIds) {\r\n      return [];\r\n    }\r\n\r\n    const gridsItems = this._fragments.getItemsData(\r\n      itemsIds,\r\n      {},\r\n    ) as CustomDataItem[];\r\n\r\n    for (const item of gridsItems) {\r\n      const data = JSON.parse(item.data.value) as GridData;\r\n      allGrids.push(data);\r\n    }\r\n\r\n    return allGrids;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { ByteBuffer } from \"flatbuffers\";\r\n\r\nimport pako from \"pako\";\r\n\r\n// eslint-disable-next-line import/no-extraneous-dependencies\r\nimport {\r\n  acceleratedRaycast,\r\n  computeBoundsTree,\r\n  disposeBoundsTree,\r\n} from \"three-mesh-bvh\";\r\n\r\nimport {\r\n  VirtualMaterialController,\r\n  VirtualTilesController,\r\n  VirtualPropertiesController,\r\n  RaycastController,\r\n  AlignmentsController,\r\n  ItemConfigController,\r\n} from \"./virtual-controllers\";\r\nimport {\r\n  MaterialDefinition,\r\n  SnappingClass,\r\n  VirtualModelConfig,\r\n  ItemSelectionType,\r\n  ItemInformationType,\r\n  Identifier,\r\n  ItemsQueryParams,\r\n  MeshData,\r\n  AttributesUniqueValuesParams,\r\n  CurrentLod,\r\n  ItemsQueryConfig,\r\n  LodMode,\r\n} from \"../model/model-types\";\r\n\r\nimport { VirtualBoxController } from \"../bounding-boxes\";\r\n\r\nimport { Connection } from \"../multithreading/connection\";\r\nimport { Model } from \"../../../Schema\";\r\n\r\nimport {\r\n  CoordinatesHelper,\r\n  GeometryHelper,\r\n  HighlightHelper,\r\n  ItemsHelper,\r\n  RaycastHelper,\r\n  SectionHelper,\r\n  SequenceHelper,\r\n  VisibilityHelper,\r\n} from \"./virtual-helpers\";\r\nimport { EditRequest, EditRequestType, EditUtils } from \"../../../Utils\";\r\nimport { TileData } from \"./virtual-meshes\";\r\nimport { GridsController } from \"./virtual-controllers/grids-controller\";\r\n\r\nexport class VirtualFragmentsModel {\r\n  data: Model;\r\n  view: any;\r\n  raycaster: RaycastController;\r\n  itemConfig: ItemConfigController;\r\n  properties: VirtualPropertiesController;\r\n  materials: VirtualMaterialController;\r\n  tiles: VirtualTilesController;\r\n  boxes: VirtualBoxController;\r\n\r\n  requests: EditRequest[] = [];\r\n\r\n  private _raycastHelper = new RaycastHelper();\r\n  private _coordinatesHelper = new CoordinatesHelper();\r\n  private _highlightHelper = new HighlightHelper();\r\n  private _visibilityHelper = new VisibilityHelper();\r\n  private _geometryHelper = new GeometryHelper();\r\n  private _sectionHelper = new SectionHelper();\r\n  private _itemsHelper = new ItemsHelper();\r\n  private _sequenceHelper = new SequenceHelper(this);\r\n\r\n  private _config: VirtualModelConfig = {};\r\n  private _modelId: string;\r\n\r\n  private _alignments: AlignmentsController;\r\n  private _grids: GridsController;\r\n  private _connection: Connection;\r\n\r\n  private _reprIdMap = new Map<number, number>();\r\n  private _nextId = 0;\r\n\r\n  private _requestsForRedo: EditRequest[] = [];\r\n\r\n  constructor(\r\n    modelId: string,\r\n    data: ArrayBuffer,\r\n    connection: Connection,\r\n    config?: VirtualModelConfig,\r\n  ) {\r\n    this._modelId = modelId;\r\n    this._connection = connection;\r\n    this._config = { ...this._config, ...config };\r\n    this.data = this.setupModel(data);\r\n    this.boxes = new VirtualBoxController(this.data);\r\n    this.materials = this.setupMaterials(modelId);\r\n    this._alignments = new AlignmentsController(this);\r\n    this._grids = new GridsController(this);\r\n    this.itemConfig = this.setupItemsConfig();\r\n    this.tiles = this.setupTiles();\r\n    this.properties = this.setupProperties();\r\n    this.raycaster = this.setupRaycaster();\r\n    this.setupBVH();\r\n    this._nextId = this.getMaxLocalId();\r\n  }\r\n\r\n  getItemsByConfig(condition: (item: number) => boolean) {\r\n    return this._itemsHelper.getItemsByConfig(this, condition);\r\n  }\r\n\r\n  getItemsCategories(ids: number[]) {\r\n    return this.properties.getItemsCategories(ids);\r\n  }\r\n\r\n  getItemIdsByLocalIds(localIds: number[]) {\r\n    return this.properties.getItemIdsFromLocalIds(localIds);\r\n  }\r\n\r\n  getItemAttributes(id: number) {\r\n    return this.properties.getItemAttributes(id);\r\n  }\r\n\r\n  // getItemsAttributes(ids: number[]) {\r\n  //   return this.properties.getItemsAttributes(ids);\r\n  // }\r\n\r\n  getAttributesUniqueValues(config: AttributesUniqueValuesParams[]) {\r\n    return this.properties.getAttributesUniqueValues(config);\r\n  }\r\n\r\n  getItemsData(ids: number[], config: any) {\r\n    return this.properties.getItemsData(ids, config);\r\n  }\r\n\r\n  getItemsOfCategories(categories: RegExp[]) {\r\n    return this.properties.getItemsOfCategories(categories);\r\n  }\r\n\r\n  getItemsWithGeometry() {\r\n    return this.properties.getItemsWithGeometry();\r\n  }\r\n\r\n  getItemsWithGeometryCategories() {\r\n    return this.properties.getItemsWithGeometryCategories();\r\n  }\r\n\r\n  getItemsByQuery(params: ItemsQueryParams, config?: ItemsQueryConfig) {\r\n    return this.properties.getItemsByQuery(params, config);\r\n  }\r\n\r\n  getItemRelations(id: number) {\r\n    return this.properties.getItemRelations(id);\r\n  }\r\n\r\n  getSpatialStructure() {\r\n    // If there are any changes to the spatial structure, return the changed spatial structure\r\n    const found = EditUtils.applyChangesToSpecialData(\r\n      this.requests,\r\n      \"SPATIAL_STRUCTURE\",\r\n    );\r\n    if (found) {\r\n      return found;\r\n    }\r\n    return this.properties.getSpatialStructure();\r\n  }\r\n\r\n  getMaxLocalId() {\r\n    return this.properties.getMaxLocalId();\r\n  }\r\n\r\n  getCategories() {\r\n    return this.properties.getCategories();\r\n  }\r\n\r\n  getMetadata() {\r\n    // If there are any changes to the metadata, return the changed metadata\r\n    const found = EditUtils.applyChangesToSpecialData(\r\n      this.requests,\r\n      \"METADATA\",\r\n    );\r\n    if (found) {\r\n      return found;\r\n    }\r\n\r\n    // Otherwise, return the original metadata\r\n    return this.properties.getMetadata();\r\n  }\r\n\r\n  getCRS() {\r\n    // If there are any changes to the metadata, check there too\r\n    const found = EditUtils.applyChangesToSpecialData(\r\n      this.requests,\r\n      \"METADATA\",\r\n    );\r\n    if (found && found.crs) {\r\n      return found.crs;\r\n    }\r\n\r\n    return this.properties.getCRS();\r\n  }\r\n\r\n  getLocalIdsByGuids(guids: string[]) {\r\n    return this.properties.getLocalIdsByGuids(guids);\r\n  }\r\n\r\n  getGuidsByLocalIds(localIds: number[]) {\r\n    return this.properties.getGuidsByLocalIds(localIds);\r\n  }\r\n\r\n  getSequenced(\r\n    result: ItemInformationType,\r\n    fromItems: ItemSelectionType[],\r\n    inputs?: {\r\n      selector?: Partial<Record<ItemSelectionType, any>>;\r\n      result?: any;\r\n    },\r\n  ) {\r\n    return this._sequenceHelper.getSequenced(result, fromItems, inputs);\r\n  }\r\n\r\n  highlight(items: number[], highlightMaterial: MaterialDefinition) {\r\n    this._highlightHelper.highlight(this, items, highlightMaterial);\r\n  }\r\n\r\n  setColor(items: number[], color: MaterialDefinition[\"color\"]) {\r\n    this._highlightHelper.setColor(this, items, color);\r\n  }\r\n\r\n  resetColor(items: number[]) {\r\n    this._highlightHelper.resetColor(this, items);\r\n  }\r\n\r\n  setOpacity(items: number[], opacity: number) {\r\n    this._highlightHelper.setOpacity(this, items, opacity);\r\n  }\r\n\r\n  resetOpacity(items: number[]) {\r\n    this._highlightHelper.resetOpacity(this, items);\r\n  }\r\n\r\n  getHighlight(localIds: number[]) {\r\n    return this._highlightHelper.getHighlight(this, localIds);\r\n  }\r\n\r\n  getHighlightItemIds() {\r\n    return this._highlightHelper.getHighlightItems(this);\r\n  }\r\n\r\n  resetHighlight(items: number[]) {\r\n    this._highlightHelper.resetHighlight(this, items);\r\n  }\r\n\r\n  getCoordinates() {\r\n    return this._coordinatesHelper.getCoordinates(this);\r\n  }\r\n\r\n  getPositions(localIds: number[]) {\r\n    return this._coordinatesHelper.getPositions(this, localIds);\r\n  }\r\n\r\n  getGeometriesLength(): number {\r\n    return this._geometryHelper.getGeometriesLength(this);\r\n  }\r\n\r\n  getGuids() {\r\n    return this.properties.getGuids();\r\n  }\r\n\r\n  getLocalIds() {\r\n    return this.properties.getLocalIds();\r\n  }\r\n\r\n  getItemsGeometry(localIds: number[], lod = CurrentLod.GEOMETRY) {\r\n    const indices = this.properties.getItemIdsFromLocalIds(localIds);\r\n    const geometries: MeshData[][] = [];\r\n    for (const index of indices) {\r\n      const geometry = this._geometryHelper.getSampleGeometry(this, index, lod);\r\n      geometries.push(geometry);\r\n    }\r\n    return geometries;\r\n  }\r\n\r\n  getGeometries(reprsLocalIds: number[]) {\r\n    if (this._reprIdMap.size === 0) {\r\n      const meshes = this.data.meshes()!;\r\n      for (let i = 0; i < meshes.representationsLength(); i++) {\r\n        const localId = meshes.representationIds(i)!;\r\n        this._reprIdMap.set(localId, i);\r\n      }\r\n    }\r\n\r\n    const indices = new Map<number, number>();\r\n    for (const localId of reprsLocalIds) {\r\n      if (this._reprIdMap.has(localId)) {\r\n        indices.set(localId, this._reprIdMap.get(localId)!);\r\n      }\r\n    }\r\n\r\n    const meshes = this.data.meshes()!;\r\n\r\n    const reprsIndices = Array.from(indices.values());\r\n\r\n    const result: MeshData[] = [];\r\n    for (const index of reprsIndices) {\r\n      const geoms = this.tiles.fetchGeometry(index) as TileData | TileData[];\r\n      const items = Array.isArray(geoms) ? geoms : [geoms];\r\n      for (const found of items) {\r\n        const indices = found.indexBuffer as Uint16Array;\r\n        const positions = found.positionBuffer as Float32Array;\r\n        const normals = found.normalBuffer as Int16Array;\r\n        const representationId = meshes.representationIds(index)!;\r\n        result.push({\r\n          transform: new THREE.Matrix4(),\r\n          indices,\r\n          positions,\r\n          normals,\r\n          representationId,\r\n        });\r\n      }\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  getItemsVolume(localIds: number[]) {\r\n    const indices = this.properties.getItemIdsFromLocalIds(localIds);\r\n    let volume: number = 0;\r\n    for (const index of indices) {\r\n      volume += this._geometryHelper.getVolume(this, index);\r\n    }\r\n    return volume;\r\n  }\r\n\r\n  getAttributeNames() {\r\n    const names = this.properties.getAttributeNames();\r\n    return names;\r\n  }\r\n\r\n  getAttributeValues() {\r\n    const values = this.properties.getAttributeValues();\r\n    return values;\r\n  }\r\n\r\n  getAttributeTypes() {\r\n    const types = this.properties.getAttributeTypes();\r\n    return types;\r\n  }\r\n\r\n  getRelationNames() {\r\n    const names = this.properties.getRelationNames();\r\n    return names;\r\n  }\r\n\r\n  getItemsMaterialDefinition(localIds: number[]) {\r\n    const indices = this.properties.getItemIdsFromLocalIds(localIds);\r\n    return this.materials.getItemsMaterialDefinition(\r\n      this.data,\r\n      indices,\r\n      localIds,\r\n    );\r\n  }\r\n\r\n  resetVisible() {\r\n    this._visibilityHelper.resetVisible(this);\r\n  }\r\n\r\n  getItemsByVisibility(visible: boolean) {\r\n    return this._visibilityHelper.getItemsByVisibility(this, visible);\r\n  }\r\n\r\n  raycast(ray: THREE.Ray, frustum: THREE.Frustum, returnAll?: boolean): any {\r\n    return this._raycastHelper.raycast(this, ray, frustum, returnAll);\r\n  }\r\n\r\n  snapRaycast(\r\n    ray: THREE.Ray,\r\n    frustum: THREE.Frustum,\r\n    snaps: SnappingClass[],\r\n  ): any[] {\r\n    return this._raycastHelper.snapRaycast(this, ray, frustum, snaps);\r\n  }\r\n\r\n  rectangleRaycast(frustum: THREE.Frustum, fullyIncluded: boolean): number[] {\r\n    return this._raycastHelper.rectangleRaycast(this, frustum, fullyIncluded);\r\n  }\r\n\r\n  async getSection(plane: THREE.Plane, localIds?: number[]) {\r\n    const indices = this.properties.getItemIdsFromLocalIds(localIds);\r\n    return this._sectionHelper.getSection(this, plane, indices);\r\n  }\r\n\r\n  async getAlignments() {\r\n    return this._alignments.getAlignments();\r\n  }\r\n\r\n  async getGrids() {\r\n    return this._grids.getGrids();\r\n  }\r\n\r\n  getBuffer(raw: boolean) {\r\n    const bb = this.data.bb as ByteBuffer;\r\n    const bytes = bb.bytes();\r\n    const buffer = bytes.buffer;\r\n    return raw ? buffer : pako.deflate(buffer as ArrayBuffer);\r\n  }\r\n\r\n  getSubsetBuffer(localIds: number[], raw: boolean) {\r\n    // Build localId -> item index map\r\n    const localIdToIndex = new Map<number, number>();\r\n    for (let i = 0; i < this.data.localIdsLength(); i++) {\r\n      localIdToIndex.set(this.data.localIds(i)!, i);\r\n    }\r\n\r\n    // Get item indices for the requested localIds\r\n    const itemIndices = new Set<number>();\r\n    for (const localId of localIds) {\r\n      const index = localIdToIndex.get(localId);\r\n      if (index !== undefined) {\r\n        itemIndices.add(index);\r\n      }\r\n    }\r\n\r\n    // Fetch real item data using existing utility\r\n    const items = EditUtils.getItems(this.data, itemIndices);\r\n\r\n    // Build UPDATE_ITEM requests with the real data so that\r\n    // getIdsDelta includes these items and all their associated geometry\r\n    const requests: EditRequest[] = [];\r\n    for (const [localId, itemData] of items) {\r\n      requests.push({\r\n        type: EditRequestType.UPDATE_ITEM,\r\n        localId,\r\n        data: itemData,\r\n      });\r\n    }\r\n\r\n    // Generate a delta model containing only these items + their geometry\r\n    const { model } = EditUtils.edit(this.data, requests, {\r\n      raw: true,\r\n      delta: true,\r\n    });\r\n\r\n    return raw ? model : pako.deflate(model as ArrayBuffer);\r\n  }\r\n\r\n  dispose() {\r\n    this.tiles.dispose();\r\n  }\r\n\r\n  setVisible(localIds: number[], visible: boolean) {\r\n    this._visibilityHelper.setVisible(this, localIds, visible);\r\n  }\r\n\r\n  toggleVisible(localIds: number[]) {\r\n    this._visibilityHelper.toggleVisible(this, localIds);\r\n  }\r\n\r\n  getVisible(items: number[]) {\r\n    return this._visibilityHelper.getVisible(this, items);\r\n  }\r\n\r\n  hideForEdit(localIds: number[]) {\r\n    this._visibilityHelper.hideForEdit(this, localIds);\r\n  }\r\n\r\n  clearHiddenForEdit() {\r\n    this._visibilityHelper.clearHiddenForEdit();\r\n  }\r\n\r\n  getItemsChildren(ids: Identifier[]) {\r\n    return this.properties.getItemsChildren(ids);\r\n  }\r\n\r\n  async setupData(\r\n    onProgress?: (progress: number) => void,\r\n    throwIfAborted?: () => void,\r\n  ) {\r\n    await this.tiles.generate(onProgress, throwIfAborted);\r\n  }\r\n\r\n  refreshView(view: any) {\r\n    this.view = view;\r\n    this.tiles.setupView(view);\r\n  }\r\n\r\n  getFullBBox() {\r\n    return this.boxes.fullBox;\r\n  }\r\n\r\n  getBBoxes(items: number[]) {\r\n    const box = new THREE.Box3();\r\n    this.properties.getBox(items, box);\r\n    return box;\r\n  }\r\n\r\n  traverse(itemIds: number[], onItem: (itemId: number, index: number) => void) {\r\n    this._itemsHelper.traverse(this, itemIds, onItem);\r\n  }\r\n\r\n  update(time: number): boolean {\r\n    this.tiles.update(time);\r\n    return this.tiles.tilesUpdated;\r\n  }\r\n\r\n  edit(requests: EditRequest[]) {\r\n    const ids = EditUtils.solveIds(requests, this._nextId);\r\n    this._nextId += ids.length;\r\n    for (const request of requests) {\r\n      this.requests.push(request);\r\n    }\r\n    const { model, items } = EditUtils.edit(this.data, this.requests, {\r\n      raw: true,\r\n      delta: true,\r\n    });\r\n    // Clear the previous hidden-for-edit set before applying the new one.\r\n    // Each edit() rebuilds the delta from all current requests, so `items`\r\n    // is the complete set of edited items — old entries must not persist.\r\n    this._visibilityHelper.clearHiddenForEdit();\r\n    this._visibilityHelper.hideForEdit(this, items);\r\n    return { deltaModelBuffer: model, ids };\r\n  }\r\n\r\n  reset() {\r\n    this.requests = [];\r\n    this._requestsForRedo = [];\r\n    this._nextId = this.getMaxLocalId();\r\n  }\r\n\r\n  save() {\r\n    this.requests.push({\r\n      type: EditRequestType.UPDATE_MAX_LOCAL_ID,\r\n      localId: this._nextId,\r\n    });\r\n    const { model } = EditUtils.edit(this.data, this.requests, {\r\n      raw: true,\r\n      delta: false,\r\n    });\r\n    return model;\r\n  }\r\n\r\n  undo() {\r\n    if (this.requests.length === 0) {\r\n      return;\r\n    }\r\n    const lastRequest = this.requests.pop();\r\n    if (!lastRequest) {\r\n      return;\r\n    }\r\n    this._requestsForRedo.unshift(lastRequest);\r\n  }\r\n\r\n  redo() {\r\n    if (this._requestsForRedo.length === 0) {\r\n      return;\r\n    }\r\n    const lastUndoneRequest = this._requestsForRedo.shift();\r\n    if (!lastUndoneRequest) {\r\n      return;\r\n    }\r\n    this.requests.push(lastUndoneRequest);\r\n  }\r\n\r\n  getRequests() {\r\n    return {\r\n      requests: this.requests,\r\n      undoneRequests: this._requestsForRedo,\r\n    };\r\n  }\r\n\r\n  setRequests(data: {\r\n    requests?: EditRequest[];\r\n    undoneRequests?: EditRequest[];\r\n  }) {\r\n    if (data.requests) {\r\n      this.requests = data.requests;\r\n    }\r\n    if (data.undoneRequests) {\r\n      this._requestsForRedo = data.undoneRequests;\r\n    }\r\n  }\r\n\r\n  selectRequest(index: number) {\r\n    const allRequests: EditRequest[] = [];\r\n    for (const request of this.requests) {\r\n      allRequests.push(request);\r\n    }\r\n    for (const request of this._requestsForRedo) {\r\n      allRequests.push(request);\r\n    }\r\n\r\n    this.requests = [];\r\n    this._requestsForRedo = [];\r\n\r\n    for (let i = 0; i < allRequests.length; i++) {\r\n      if (i <= index) {\r\n        this.requests.push(allRequests[i]);\r\n      } else {\r\n        this._requestsForRedo.push(allRequests[i]);\r\n      }\r\n    }\r\n  }\r\n\r\n  getMaterialsIds() {\r\n    const ids = EditUtils.getMaterialsIds(this.data);\r\n    return EditUtils.applyChangesToIds(this.requests, ids, \"MATERIAL\", true);\r\n  }\r\n\r\n  getMaterials(ids?: Iterable<number>) {\r\n    const found = EditUtils.getMaterials(this.data, ids);\r\n    EditUtils.applyChangesToRawData(this.requests, found, \"MATERIAL\");\r\n    return found;\r\n  }\r\n\r\n  getRepresentationsIds() {\r\n    const ids = EditUtils.getRepresentationsIds(this.data);\r\n    return EditUtils.applyChangesToIds(\r\n      this.requests,\r\n      ids,\r\n      \"REPRESENTATION\",\r\n      true,\r\n    );\r\n  }\r\n\r\n  getRepresentations(ids?: Iterable<number>) {\r\n    const found = EditUtils.getRepresentations(this.data, ids);\r\n    EditUtils.applyChangesToRawData(this.requests, found, \"REPRESENTATION\");\r\n    return found;\r\n  }\r\n\r\n  getLocalTransformsIds() {\r\n    const ids = EditUtils.getLocalTransformsIds(this.data);\r\n    return EditUtils.applyChangesToIds(\r\n      this.requests,\r\n      ids,\r\n      \"LOCAL_TRANSFORM\",\r\n      true,\r\n    );\r\n  }\r\n\r\n  getLocalTransforms(ids?: Iterable<number>) {\r\n    const found = EditUtils.getLocalTransforms(this.data, ids);\r\n    EditUtils.applyChangesToRawData(this.requests, found, \"LOCAL_TRANSFORM\");\r\n    return found;\r\n  }\r\n\r\n  getGlobalTransformsIds() {\r\n    const ids = EditUtils.getGlobalTransformsIds(this.data);\r\n    return EditUtils.applyChangesToIds(\r\n      this.requests,\r\n      ids,\r\n      \"GLOBAL_TRANSFORM\",\r\n      true,\r\n    );\r\n  }\r\n\r\n  getGlobalTransforms(ids?: Iterable<number>) {\r\n    const found = EditUtils.getGlobalTransforms(this.data, ids);\r\n    EditUtils.applyChangesToRawData(this.requests, found, \"GLOBAL_TRANSFORM\");\r\n    return found;\r\n  }\r\n\r\n  getSamplesIds() {\r\n    const ids = EditUtils.getSamplesIds(this.data);\r\n    return EditUtils.applyChangesToIds(this.requests, ids, \"SAMPLE\", true);\r\n  }\r\n\r\n  getSamples(ids?: Iterable<number>) {\r\n    const result = EditUtils.getSamples(this.data, ids);\r\n    EditUtils.applyChangesToRawData(this.requests, result, \"SAMPLE\");\r\n    return result;\r\n  }\r\n\r\n  getItemsIds() {\r\n    const ids = EditUtils.getItemsIds(this.data);\r\n    return EditUtils.applyChangesToIds(this.requests, ids, \"ITEM\", true);\r\n  }\r\n\r\n  getItems(ids?: Iterable<number>) {\r\n    const itemIds = this.properties.getItemIdsFromLocalIds(ids);\r\n    const found = EditUtils.getItems(this.data, itemIds);\r\n    const filter = ids ? new Set(ids) : undefined;\r\n    EditUtils.applyChangesToRawData(this.requests, found, \"ITEM\", filter);\r\n    return found;\r\n  }\r\n\r\n  getRelations(ids?: number[]) {\r\n    const found = this.properties.getRawRelations(ids);\r\n    EditUtils.applyChangesToRawData(this.requests, found, \"RELATION\");\r\n    return found;\r\n  }\r\n\r\n  getGlobalTranformsIdsOfItems(ids: number[]) {\r\n    return EditUtils.getGlobalTranformsIdsOfItems(this.data, ids);\r\n  }\r\n\r\n  getElementsData(ids: Iterable<number>) {\r\n    const filtered = new Set(ids);\r\n    EditUtils.applyChangesToIds(this.requests, filtered, \"ITEM\", false);\r\n    return EditUtils.getElementsData(this, filtered);\r\n  }\r\n\r\n  setLodMode(lodMode: LodMode) {\r\n    this.tiles.setLodMode(lodMode);\r\n  }\r\n\r\n  private setupBVH() {\r\n    // @ts-ignore\r\n    THREE.BufferGeometry.prototype.computeBoundsTree = computeBoundsTree;\r\n    // @ts-ignore\r\n    THREE.BufferGeometry.prototype.disposeBoundsTree = disposeBoundsTree;\r\n    // @ts-ignore\r\n    THREE.Mesh.prototype.raycast = acceleratedRaycast;\r\n  }\r\n\r\n  private setupProperties() {\r\n    return new VirtualPropertiesController(\r\n      this,\r\n      this.boxes,\r\n      this._config.properties,\r\n    );\r\n  }\r\n\r\n  private setupRaycaster() {\r\n    return new RaycastController(\r\n      this.data,\r\n      this.boxes,\r\n      this.tiles,\r\n      this.itemConfig,\r\n    );\r\n  }\r\n\r\n  private setupMaterials(modelId: string) {\r\n    return new VirtualMaterialController(modelId, this._onTransferMaterial);\r\n  }\r\n\r\n  private setupTiles() {\r\n    const materials = this.materials.update(this.data);\r\n    return new VirtualTilesController({\r\n      modelId: this._modelId,\r\n      connection: this._connection,\r\n      model: this.data,\r\n      boxes: this.boxes,\r\n      items: this.itemConfig,\r\n      materials,\r\n    });\r\n  }\r\n\r\n  private setupModel(data: ArrayBuffer) {\r\n    const uintArray = new Uint8Array(data);\r\n    const byteBuffer = new ByteBuffer(uintArray);\r\n    return Model.getRootAsModel(byteBuffer);\r\n  }\r\n\r\n  private _onTransferMaterial = (data: any, trans: any) => {\r\n    if (!this._connection) return undefined;\r\n    return this._connection.fetch(data, trans);\r\n  };\r\n\r\n  private setupItemsConfig() {\r\n    const itemsCount = this.data.localIdsLength();\r\n    return new ItemConfigController(itemsCount);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport pako from \"pako\";\r\nimport {\r\n  CurrentLod,\r\n  Identifier,\r\n  ItemsDataConfig,\r\n  ItemsQueryConfig,\r\n  ItemsQueryParams,\r\n} from \"../model\";\r\nimport { VirtualFragmentsModel } from \"../virtual-model/virtual-fragments-model\";\r\n\r\n/**\r\n * The main class for managing a 3D model loaded from a fragments file in a single thread. It's designed for easy data querying in the backend, so all the 3D visualization logic is not present.\r\n */\r\nexport class SingleThreadedFragmentsModel {\r\n  private readonly _modelId: string;\r\n  private _virtualModel: VirtualFragmentsModel;\r\n\r\n  /**\r\n   * The ID of the model.\r\n   */\r\n  get modelId() {\r\n    return this._modelId;\r\n  }\r\n\r\n  /**\r\n   * The constructor of the fragments model.\r\n   */\r\n  constructor(modelId: string, modelData: Uint8Array, raw = false) {\r\n    this._modelId = modelId;\r\n\r\n    let data = modelData;\r\n    if (!raw) {\r\n      data = pako.inflate(modelData);\r\n    }\r\n\r\n    this._virtualModel = new VirtualFragmentsModel(\r\n      modelId,\r\n      data as any,\r\n      undefined as any,\r\n    );\r\n\r\n    this._virtualModel.setupData();\r\n  }\r\n\r\n  /**\r\n   * Dispose the model. Use this when you're done with the model.\r\n   * If you use the {@link FragmentsModels.dispose} method, this will be called automatically for all models.\r\n   */\r\n  dispose() {\r\n    this._virtualModel.dispose();\r\n    this._virtualModel = null as any;\r\n  }\r\n\r\n  /**\r\n   * Get the spatial structure of the model.\r\n   */\r\n  getSpatialStructure() {\r\n    return this._virtualModel.getSpatialStructure();\r\n  }\r\n\r\n  /**\r\n   * Get the local IDs corresponding to the specified GUIDs.\r\n   * @param guids - Array of GUIDs to look up.\r\n   */\r\n  getLocalIdsByGuids(guids: string[]) {\r\n    return this._virtualModel.getLocalIdsByGuids(guids);\r\n  }\r\n\r\n  /**\r\n   * Get all the categories of the model.\r\n   */\r\n  getCategories() {\r\n    return this._virtualModel.getCategories();\r\n  }\r\n\r\n  /**\r\n   * Get all the items of the model that have geometry.\r\n   */\r\n  getItemsWithGeometry() {\r\n    return this._virtualModel.getItemsWithGeometry();\r\n  }\r\n\r\n  /**\r\n   * Get the metadata of the model.\r\n   */\r\n  getMetadata<T extends Record<string, any> = Record<string, any>>() {\r\n    return this._virtualModel.getMetadata() as T;\r\n  }\r\n\r\n  /**\r\n   * Get the Coordinate Reference System (CRS) data of the model, if available.\r\n   */\r\n  getCRS() {\r\n    return this._virtualModel.getCRS();\r\n  }\r\n\r\n  /**\r\n   * Get the GUIDs corresponding to the specified local IDs.\r\n   * @param localIds - Array of local IDs to look up.\r\n   */\r\n  getGuidsByLocalIds(localIds: number[]) {\r\n    return this._virtualModel.getGuidsByLocalIds(localIds);\r\n  }\r\n\r\n  /**\r\n   * Get the buffer of the model.\r\n   * @param raw - Whether to get the raw buffer. If false, it will be compressed.\r\n   */\r\n  getBuffer(raw = false) {\r\n    return this._virtualModel.getBuffer(raw);\r\n  }\r\n\r\n  /**\r\n   * Get a buffer containing only the specified items and their associated geometry.\r\n   * @param localIds - The local IDs of the items to include.\r\n   * @param raw - Whether to get the raw buffer. If false, it will be compressed.\r\n   */\r\n  getSubsetBuffer(localIds: number[], raw = false) {\r\n    return this._virtualModel.getSubsetBuffer(localIds, raw);\r\n  }\r\n\r\n  /**\r\n   * Get all the items of the model that belong to the specified category.\r\n   * @param category - The category to look up.\r\n   */\r\n  getItemsOfCategories(categories: RegExp[]) {\r\n    return this._virtualModel.getItemsOfCategories(categories);\r\n  }\r\n\r\n  /**\r\n   * Get the maximum local ID of the model.\r\n   */\r\n  getMaxLocalId() {\r\n    return this._virtualModel.getMaxLocalId();\r\n  }\r\n\r\n  /**\r\n   * Get the spatial structure children of the specified items.\r\n   * @param ids - The IDs of the items to look up.\r\n   */\r\n  getItemsChildren(ids: Identifier[]) {\r\n    this._virtualModel.getItemsChildren(ids);\r\n  }\r\n\r\n  /**\r\n   * Get all the data of the specified items.\r\n   * @param ids - The IDs of the items to look up.\r\n   * @param config - The configuration of the items data.\r\n   */\r\n  getItemsData(ids: number[], config?: Partial<ItemsDataConfig>) {\r\n    return this._virtualModel.getItemsData(ids, config);\r\n  }\r\n\r\n  /**\r\n   * Get the absolute positions of the specified items.\r\n   * @param localIds - The local IDs of the items to look up.\r\n   */\r\n  getPositions(localIds: number[]) {\r\n    return this._virtualModel.getPositions(localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets coordinates of the model.\r\n   */\r\n  getCoordinates() {\r\n    return this._virtualModel.getCoordinates();\r\n  }\r\n\r\n  /**\r\n   * Get geometry data for the specified items.\r\n   * @param localIds - The local IDs of the items to get geometry for.\r\n   * @param lod - The level of detail for the geometry (optional).\r\n   */\r\n  getItemsGeometry(localIds: number[], lod?: CurrentLod) {\r\n    return this._virtualModel.getItemsGeometry(localIds, lod);\r\n  }\r\n\r\n  /**\r\n   * Query items based on specified parameters.\r\n   * @param params - The query parameters.\r\n   * @param config - Optional query configuration.\r\n   */\r\n  getItemsByQuery(params: ItemsQueryParams, config?: ItemsQueryConfig) {\r\n    return this._virtualModel.getItemsByQuery(params, config);\r\n  }\r\n\r\n  /**\r\n   * Gets the section (edges and fills) between the model and a given clipping plane.\r\n   * @param plane - The plane to get the section of.\r\n   * @param localIds - The local IDs of the items to get the section of. If undefined, it will return the section of all items.\r\n   */\r\n  async getSection(plane: THREE.Plane, localIds?: number[]) {\r\n    return this._virtualModel.getSection(plane, localIds);\r\n  }\r\n\r\n  /**\r\n   * Get all the local IDs of the model.\r\n   */\r\n  async getLocalIds() {\r\n    return this._virtualModel.getLocalIds();\r\n  }\r\n\r\n  /**\r\n   * Gets all the materials IDs of the model.\r\n   */\r\n  async getMaterialsIds() {\r\n    return this._virtualModel.getMaterialsIds();\r\n  }\r\n\r\n  /**\r\n   * Gets the materials of the model.\r\n   * @param localIds - The local IDs of the materials to get. If undefined, it will return all materials.\r\n   */\r\n  async getMaterials(localIds?: Iterable<number>) {\r\n    return this._virtualModel.getMaterials(localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets all the representations IDs of the model.\r\n   */\r\n  async getRepresentationsIds() {\r\n    return this._virtualModel.getRepresentationsIds();\r\n  }\r\n\r\n  /**\r\n   * Gets the representations of the model.\r\n   * @param localIds - The local IDs of the representations to get. If undefined, it will return all representations.\r\n   */\r\n  async getRepresentations(localIds?: Iterable<number>) {\r\n    return this._virtualModel.getRepresentations(localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets all the local transforms IDs of the model.\r\n   */\r\n  async getLocalTransformsIds() {\r\n    return this._virtualModel.getLocalTransformsIds();\r\n  }\r\n\r\n  /**\r\n   * Gets the local transforms of the model.\r\n   * @param localIds - The local IDs of the local transforms to get. If undefined, it will return all local transforms.\r\n   */\r\n  async getLocalTransforms(localIds?: Iterable<number>) {\r\n    return this._virtualModel.getLocalTransforms(localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets all the global transforms IDs of the model.\r\n   */\r\n  async getGlobalTransformsIds() {\r\n    return this._virtualModel.getGlobalTransformsIds();\r\n  }\r\n\r\n  /**\r\n   * Gets the global transforms of the model.\r\n   * @param localIds - The local IDs of the global transforms to get. If undefined, it will return all global transforms.\r\n   */\r\n  async getGlobalTransforms(localIds?: Iterable<number>) {\r\n    return this._virtualModel.getGlobalTransforms(localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets all the samples IDs of the model.\r\n   */\r\n  async getSamplesIds() {\r\n    return this._virtualModel.getSamplesIds();\r\n  }\r\n\r\n  /**\r\n   * Gets the samples of the model.\r\n   * @param localIds - The local IDs of the samples to get. If undefined, it will return all samples.\r\n   */\r\n  async getSamples(localIds?: Iterable<number>) {\r\n    return this._virtualModel.getSamples(localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets all the items IDs of the model.\r\n   */\r\n  async getItemsIds() {\r\n    return this._virtualModel.getItemsIds();\r\n  }\r\n\r\n  /**\r\n   * Gets the items of the model.\r\n   * @param localIds - The local IDs of the items to get. If undefined, it will return all items.\r\n   */\r\n  async getItems(localIds?: Iterable<number>) {\r\n    return this._virtualModel.getItems(localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets the relations of the model.\r\n   * @param localIds - The local IDs of the relations to get. If undefined, it will return all relations.\r\n   */\r\n  async getRelations(localIds?: number[]) {\r\n    return this._virtualModel.getRelations(localIds);\r\n  }\r\n\r\n  /**\r\n   * Gets the global transforms IDs of the items of the model.\r\n   * @param ids - The local IDs of the items to get the global transforms IDs of.\r\n   */\r\n  async getGlobalTranformsIdsOfItems(ids: number[]) {\r\n    return this._virtualModel.getGlobalTranformsIdsOfItems(ids);\r\n  }\r\n}\r\n","export type ThreadHandler = (args: any) => Promise<void> | void;\r\n\r\nexport class ConnectionHandlers {\r\n  private readonly _list = new Map<number, ThreadHandler>();\r\n  private _communicationKey = 0;\r\n\r\n  setupInput(input: any) {\r\n    input.requestId = this._communicationKey++;\r\n  }\r\n\r\n  set(id: number, reject: any, resolve: any) {\r\n    const handler = this.newHandler(reject, resolve);\r\n    this._list.set(id, handler);\r\n  }\r\n\r\n  // It resolves the awaited model.threads.fetch(...)\r\n  run(data: any) {\r\n    const handler = this._list.get(data.requestId) as ThreadHandler;\r\n    this._list.delete(data.requestId);\r\n    handler(data);\r\n  }\r\n\r\n  private newHandler(reject: any, resolve: any) {\r\n    return (response: any) => {\r\n      if (response.errorInfo) {\r\n        reject(response.errorInfo);\r\n        return;\r\n      }\r\n      resolve(response);\r\n    };\r\n  }\r\n}\r\n","import { ConnectionHandlers, ThreadHandler } from \"./connection-handlers\";\r\nimport { MultithreadingHelper } from \"./multithreading-helper\";\r\n\r\nexport class Connection {\r\n  private readonly _handlers = new ConnectionHandlers();\r\n  private readonly _handleInput: ThreadHandler;\r\n  private _port?: MessagePort;\r\n\r\n  constructor(handleInput: ThreadHandler) {\r\n    this._handleInput = handleInput;\r\n  }\r\n\r\n  fetchMeshCompute(modelId: string, list: any[]) {\r\n    const helper = MultithreadingHelper;\r\n    const input = helper.getMeshComputeRequest(modelId, list);\r\n    const content = helper.getRequestContent(input);\r\n    this.fetch(input, content);\r\n  }\r\n\r\n  fetch(input: any, content?: any[]) {\r\n    this._handlers.setupInput(input);\r\n    return new Promise<any>((resolve, reject) => {\r\n      this._handlers.set(input.requestId, reject, resolve);\r\n      this.executeConnection(input, content);\r\n    });\r\n  }\r\n\r\n  init(port: MessagePort) {\r\n    this._port = port;\r\n    this.initConnection(port);\r\n  }\r\n\r\n  protected initConnection(connection: MessagePort) {\r\n    connection.onmessage = this.onInput;\r\n  }\r\n\r\n  protected async fetchConnection(_input: any) {\r\n    if (!this._port) {\r\n      throw new Error(\"Fragments: Connection not initialized\");\r\n    }\r\n    return this._port;\r\n  }\r\n\r\n  private async executeConnection(input: any, content?: any[]) {\r\n    const connectionPort = await this.fetchConnection(input);\r\n    connectionPort.postMessage(input, content as any);\r\n  }\r\n\r\n  private async manageOutput(input: any) {\r\n    const connection = await this.fetchConnection(input);\r\n    input.toMainThread = true;\r\n    connection.postMessage(input);\r\n  }\r\n\r\n  private onInput = (input: MessageEvent) => {\r\n    if (input.data.toMainThread) {\r\n      this._handlers.run(input.data);\r\n      return;\r\n    }\r\n    this.manageInput(input.data);\r\n  };\r\n\r\n  private async manageConnection(input: any) {\r\n    try {\r\n      await this._handleInput(input);\r\n    } catch (error: any) {\r\n      input.errorInfo = error.toString();\r\n      // Aborts are intentional — don't log them as unexpected errors.\r\n      if (error?.name !== \"LoadAbortedError\") {\r\n        console.error(error);\r\n      }\r\n    }\r\n  }\r\n\r\n  private async manageInput(input: any): Promise<void> {\r\n    await this.manageConnection(input);\r\n    await this.manageOutput(input);\r\n  }\r\n}\r\n","import { Thread } from \"./multithreading-helper\";\r\n\r\nexport class ThreadsData {\r\n  private readonly _modelThread = new Map<string, Thread>();\r\n  private readonly _threadsModelAmount = new Map<Thread, number>();\r\n  private readonly _threadPort = new Map<Thread, MessagePort>();\r\n  private readonly _threadPath: string;\r\n  private readonly _placeholder: Thread;\r\n\r\n  get path() {\r\n    return this._threadPath;\r\n  }\r\n\r\n  constructor(threadPath: string) {\r\n    this._placeholder = {} as Thread;\r\n    this._threadPath = threadPath;\r\n  }\r\n\r\n  usePlaceholder(id: string) {\r\n    this._modelThread.set(id, this._placeholder);\r\n  }\r\n\r\n  getAmount(thread: Thread) {\r\n    return this._threadsModelAmount.get(thread);\r\n  }\r\n\r\n  getThread(modelId: string) {\r\n    return this._modelThread.get(modelId);\r\n  }\r\n\r\n  getAndCheckThread(id: string) {\r\n    const thread = this._modelThread.get(id);\r\n    if (thread === this._placeholder) {\r\n      throw new Error(\"Fragments: Error fetching thread!\");\r\n    }\r\n    return thread;\r\n  }\r\n\r\n  set(modelId: string, thread: Thread) {\r\n    this._modelThread.set(modelId, thread);\r\n  }\r\n\r\n  deleteModel(modelId: string) {\r\n    const modelThread = this.getThreadSafe(modelId);\r\n    const threadModelAmount = this.getAmountSafe(modelThread);\r\n    const newModelAmount = threadModelAmount - 1;\r\n    this.setAmount(modelThread, newModelAmount);\r\n    this._modelThread.delete(modelId);\r\n  }\r\n\r\n  getThreadSafe(modelId: string) {\r\n    const thread = this.getThread(modelId);\r\n    if (!thread) {\r\n      throw new Error(`Fragments: Thread for model ${modelId} not found`);\r\n    }\r\n    return thread;\r\n  }\r\n\r\n  deleteThread(thread: Thread) {\r\n    this._threadsModelAmount.delete(thread);\r\n    this._threadPort.delete(thread);\r\n    thread.terminate();\r\n  }\r\n\r\n  getThreadAmount() {\r\n    return this._threadsModelAmount.size;\r\n  }\r\n\r\n  balanceThreadLoad(input: any) {\r\n    const { lessBusyThread, modelAmount } = this.getLessBusyThread();\r\n    this._threadsModelAmount.set(lessBusyThread, modelAmount + 1);\r\n    this._modelThread.set(input.modelId, lessBusyThread);\r\n    return this._threadPort.get(lessBusyThread) as MessagePort;\r\n  }\r\n\r\n  getAmountSafe(thread: Thread) {\r\n    const amount = this.getAmount(thread);\r\n    if (!amount) {\r\n      throw new Error(`Fragments: Amount for thread ${thread} not found`);\r\n    }\r\n    return amount;\r\n  }\r\n\r\n  setPort(thread: Thread, port: MessagePort) {\r\n    this._threadPort.set(thread, port);\r\n  }\r\n\r\n  setAmount(thread: Thread, amount: number) {\r\n    this._threadsModelAmount.set(thread, amount);\r\n  }\r\n\r\n  getPort(thread: Thread) {\r\n    return this._threadPort.get(thread) as MessagePort;\r\n  }\r\n\r\n  private getLessBusyThread() {\r\n    let modelAmount = Number.MAX_VALUE;\r\n    let lessBusyThread = this._threadsModelAmount.keys().next().value as Thread;\r\n    for (const [thread, amount] of this._threadsModelAmount) {\r\n      if (amount < modelAmount) {\r\n        modelAmount = amount;\r\n        lessBusyThread = thread;\r\n      }\r\n    }\r\n    return { lessBusyThread, modelAmount };\r\n  }\r\n}\r\n","import { Connection } from \"./connection\";\r\nimport { ThreadHandler } from \"./connection-handlers\";\r\nimport { MultithreadingHelper, Thread } from \"./multithreading-helper\";\r\nimport { ThreadsData } from \"./threads-data\";\r\n\r\nexport class FragmentsConnection extends Connection {\r\n  private readonly _data: ThreadsData;\r\n  private readonly _classicWorker: boolean;\r\n\r\n  constructor(handleInput: ThreadHandler, threadPath: string, classicWorker?: boolean) {\r\n    super(handleInput);\r\n    this._classicWorker = classicWorker ?? false;\r\n    this._data = new ThreadsData(threadPath);\r\n  }\r\n\r\n  delete(model: string) {\r\n    const thread = this._data.getThreadSafe(model);\r\n    const amount = this._data.getAmountSafe(thread) - 1;\r\n    this._data.deleteModel(model);\r\n    if (amount === 0) {\r\n      this._data.deleteThread(thread);\r\n    }\r\n  }\r\n\r\n  async invoke(model: string, method: string, args: any[] = []) {\r\n    const helper = MultithreadingHelper;\r\n    const requestData = helper.getExecuteRequest(model, method, args);\r\n    const response = await this.fetch(requestData);\r\n    return response.result;\r\n  }\r\n\r\n  protected override async fetchConnection(input: any): Promise<MessagePort> {\r\n    const thread = this._data.getAndCheckThread(input.modelId);\r\n    if (thread) {\r\n      return this._data.getPort(thread);\r\n    }\r\n    return this.setupNewThread(input);\r\n  }\r\n\r\n  /**\r\n   * This method either:\r\n   * - creates a new worker thread (if CPU cores are available)\r\n   * - assigns the task to an existing worker with the lowest load.\r\n   * @param input\r\n   * @returns\r\n   */\r\n  private setupNewThread(input: any): MessagePort {\r\n    const helper = MultithreadingHelper;\r\n    this._data.usePlaceholder(input.modelId);\r\n    const currentThreads = this._data.getThreadAmount();\r\n    const areCoresAvailable = helper.areCoresAvailable(currentThreads);\r\n    if (areCoresAvailable) {\r\n      return this.newThread(input, this._data.path);\r\n    }\r\n    return this._data.balanceThreadLoad(input);\r\n  }\r\n  /**\r\n   * Creates a `MessageChannel` to establish a bidirectional\r\n   * communication link between the main thread and the worker.\r\n   * - `port1` is kept on the main thread\r\n   * - `port2` is transferred to the worker via `postMessage`\r\n   * @param newThread\r\n   */\r\n  private setupThread(newThread: Thread) {\r\n    const threadChannel = new MessageChannel();\r\n    const p1 = threadChannel.port1;\r\n    const p2 = threadChannel.port2;\r\n    this.initConnection(p1);\r\n    this._data.setPort(newThread, p1);\r\n    newThread.postMessage(p2, [p2]);\r\n  }\r\n\r\n  private newThread(input: any, url: string) {\r\n    const newThread = MultithreadingHelper.newThread(url, this._classicWorker);\r\n    this.setupThread(newThread);\r\n    this._data.setAmount(newThread, 1);\r\n    this._data.set(input.modelId, newThread);\r\n    return this._data.getPort(newThread);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { MeshManager, FragmentsModel } from \"./src/model\";\r\n\r\nimport {\r\n  VirtualModelConfig,\r\n  LoadProgressEvent,\r\n  MultiThreadingRequestClass,\r\n} from \"./src\";\r\nimport { FragmentsConnection } from \"./src/multithreading/fragments-connection\";\r\nimport { ThreadHandler } from \"./src/multithreading/connection-handlers\";\r\nimport { Event } from \"../Utils\";\r\nimport { Editor } from \"./src/edit\";\r\n\r\nexport * from \"./src\";\r\n\r\ndeclare const __FRAGMENTS_VERSION__: string;\r\n\r\n/**\r\n * The main class for managing multiple 3D models loaded from fragments files. Handles loading, disposing, updating, raycasting, highlighting and coordinating multiple FragmentsModel instances. This class acts as the main entry point for working with fragments models. A FragmentsModels instance needs a worker to process fragments off the main thread. The recommended way to obtain the worker URL is via the static FragmentsModels.getWorker method, which fetches the version-matched worker from unpkg. Check the method docs for more info.\r\n */\r\nexport class FragmentsModels {\r\n  private static _workerURL: string | null = null;\r\n  private static _workerPromise: Promise<string> | null = null;\r\n\r\n  /**\r\n   * Fetches the fragments worker from unpkg for the exact version of this\r\n   * `@thatopen/fragments` package and returns a blob URL you can pass to the\r\n   * `FragmentsModels` constructor. The result is cached, so calling this\r\n   * method more than once is cheap.\r\n   *\r\n   * This is the recommended way to obtain the worker URL — it guarantees the\r\n   * worker version matches the library version and requires no copying of\r\n   * files into your project.\r\n   *\r\n   * @example\r\n   * ```ts\r\n   * const workerURL = await FragmentsModels.getWorker();\r\n   * const fragments = new FragmentsModels(workerURL);\r\n   * ```\r\n   *\r\n   * @returns A blob URL pointing to the fragments worker script.\r\n   */\r\n  static async getWorker(): Promise<string> {\r\n    if (FragmentsModels._workerURL) return FragmentsModels._workerURL;\r\n    if (FragmentsModels._workerPromise) return FragmentsModels._workerPromise;\r\n\r\n    FragmentsModels._workerPromise = (async () => {\r\n      const url = `https://unpkg.com/@thatopen/fragments@${__FRAGMENTS_VERSION__}/dist/worker/worker.mjs`;\r\n      const response = await fetch(url);\r\n      if (!response.ok) {\r\n        throw new Error(\r\n          `Failed to fetch fragments worker from ${url}: ${response.status} ${response.statusText}`,\r\n        );\r\n      }\r\n      const blob = await response.blob();\r\n      const file = new File([blob], \"worker.mjs\", { type: \"text/javascript\" });\r\n      const objectURL = URL.createObjectURL(file);\r\n      FragmentsModels._workerURL = objectURL;\r\n      return objectURL;\r\n    })();\r\n\r\n    try {\r\n      return await FragmentsModels._workerPromise;\r\n    } catch (error) {\r\n      FragmentsModels._workerPromise = null;\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Event triggered when a model is loaded.\r\n   * @event\r\n   * @type {Event<FragmentsModel>}\r\n   */\r\n  readonly onModelLoaded = new Event<FragmentsModel>();\r\n\r\n  /**\r\n   * The manager that handles all loaded fragments models.\r\n   * Provides functionality to:\r\n   * - Store and retrieve models by ID\r\n   * - Track model loading/unloading\r\n   * - Coordinate updates across models\r\n   * - Handle model disposal\r\n   */\r\n  models: MeshManager;\r\n\r\n  /** Settings that control the behavior of the FragmentsModels system */\r\n  settings = {\r\n    /** Whether to automatically coordinate model positions relative to the first loaded model */\r\n    autoCoordinate: true,\r\n    /** Maximum rate (in milliseconds) at which visual updates are performed */\r\n    maxUpdateRate: 100,\r\n    /** Graphics quality level - 0 is low quality, 1 is high quality */\r\n    graphicsQuality: 0,\r\n    /** Force update rate in milliseconds */\r\n    forceUpdateRate: 200,\r\n    /** Force update buffer time in milliseconds */\r\n    forceUpdateBuffer: 200,\r\n  };\r\n\r\n  /** Coordinates of the first loaded model, used for coordinate system alignment */\r\n  baseCoordinates: number[] | null = null;\r\n\r\n  /** The editor instance for managing model edits and changes */\r\n  editor: Editor;\r\n\r\n  private readonly _connection: FragmentsConnection;\r\n\r\n  private _progressCallbacks = new Map<\r\n    string,\r\n    (event: LoadProgressEvent) => void\r\n  >();\r\n\r\n  private _isDisposed = false;\r\n  private _autoRedrawInterval: any = null;\r\n  private _lastUpdate = 0;\r\n\r\n  /**\r\n   * Creates a new FragmentsModels instance.\r\n   * @param workerURL - The URL of the worker script that will handle the fragments processing.\r\n   * The recommended way to obtain this URL is via {@link FragmentsModels.getWorker}, which fetches\r\n   * the version-matched worker from unpkg:\r\n   * ```ts\r\n   * const workerURL = await FragmentsModels.getWorker();\r\n   * const fragments = new FragmentsModels(workerURL);\r\n   * ```\r\n   * If omitted, it falls back to the worker bundled with the package (only works with bundlers\r\n   * that can resolve `new URL(\"./Worker/worker.mjs\", import.meta.url)`).\r\n   * @param options - Optional configuration.\r\n   * @param options.classicWorker - If true, creates classic (non-module) workers. Use together with `toClassicWorker()`.\r\n   */\r\n  constructor(workerURL?: string, options?: { classicWorker?: boolean }) {\r\n    const url =\r\n      workerURL ?? new URL(\"./Worker/worker.mjs\", import.meta.url).href;\r\n    const requestEvent = this.newRequestEvent();\r\n    const updateEvent = this.newUpdateEvent();\r\n    this._connection = new FragmentsConnection(\r\n      requestEvent,\r\n      url,\r\n      options?.classicWorker,\r\n    );\r\n    this.editor = new Editor(this, this._connection);\r\n    this.models = new MeshManager(updateEvent);\r\n    this.models.list.onItemDeleted.add(() => {\r\n      if (this.models.list.size !== 0) return;\r\n      this.baseCoordinates = null;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Loads a fragments model from an ArrayBuffer.\r\n   * @param buffer - The ArrayBuffer containing the fragments data to load.\r\n   * @param options - Configuration options for loading the model.\r\n   * @param options.modelId - Unique identifier for the model.\r\n   * @param options.camera - Optional camera to use for model culling and LOD.\r\n   * @param options.raw - If true, loads raw (uncompressed) data. Default is false.\r\n   * @param options.userData - Optional custom data to attach to the model.\r\n   * @param options.virtualModelConfig - Optional configuration for virtual model setup.\r\n   * @returns Promise resolving to the loaded FragmentsModel instance.\r\n   */\r\n  async load(\r\n    buffer: ArrayBuffer | Uint8Array,\r\n    options: {\r\n      modelId: string;\r\n      camera?: THREE.PerspectiveCamera | THREE.OrthographicCamera;\r\n      raw?: boolean;\r\n      userData?: Record<string, any>;\r\n      virtualModelConfig?: VirtualModelConfig;\r\n      /** Optional callback for receiving loading progress updates. */\r\n      onProgress?: (event: LoadProgressEvent) => void;\r\n    },\r\n  ) {\r\n    const model = new FragmentsModel(\r\n      options.modelId,\r\n      this.models,\r\n      this._connection,\r\n      this.editor,\r\n    );\r\n\r\n    if (options.userData) {\r\n      model.object.userData = options.userData;\r\n    }\r\n\r\n    // Skip model updates until we have the data set\r\n    model.frozen = true;\r\n\r\n    model.graphicsQuality = this.settings.graphicsQuality;\r\n\r\n    if (options.onProgress) {\r\n      this._progressCallbacks.set(options.modelId, options.onProgress);\r\n    }\r\n\r\n    try {\r\n      this.models.list.set(model.modelId, model);\r\n      await model._setup(buffer, options.raw, options.virtualModelConfig);\r\n      if (this.settings.autoCoordinate) {\r\n        const coordinates = await model.getCoordinates();\r\n        if (this.baseCoordinates === null) {\r\n          this.baseCoordinates = coordinates;\r\n        } else {\r\n          const [px, py, pz] = coordinates;\r\n          const [baseX, baseY, baseZ] = this.baseCoordinates;\r\n          const transform = new THREE.Vector3(\r\n            baseX - px,\r\n            baseY - py,\r\n            baseZ - pz,\r\n          );\r\n          model.object.position.add(transform);\r\n        }\r\n      }\r\n    } catch (e) {\r\n      this._progressCallbacks.delete(options.modelId);\r\n      // Fully dispose partial state — this tears down the worker thread\r\n      // (if this was the last model on it), clears transferred materials,\r\n      // removes the model object from its parent, and deletes it from the\r\n      // models list. `model.dispose()` is safe on partially-loaded models\r\n      // because the worker-side `DELETE_MODEL` handler is now idempotent.\r\n      try {\r\n        await model.dispose();\r\n      } catch {\r\n        // best-effort: if disposal fails, still ensure main-thread cleanup\r\n        this.models.list.delete(model.modelId);\r\n      }\r\n      throw e;\r\n    } finally {\r\n      this._progressCallbacks.delete(options.modelId);\r\n    }\r\n\r\n    const { camera } = options;\r\n\r\n    if (camera) {\r\n      model.useCamera(camera);\r\n    }\r\n\r\n    // Model has all the data, so it can start updating\r\n    model.frozen = false;\r\n\r\n    this.onModelLoaded.trigger(model);\r\n\r\n    return model;\r\n  }\r\n\r\n  /**\r\n   * Disposes of all models managed by this FragmentsModels instance.\r\n   * After calling this method, the FragmentsModels instance should not be used anymore.\r\n   */\r\n  async dispose() {\r\n    this._isDisposed = true;\r\n    const models = Array.from(this.models.list.values());\r\n    const promises = [];\r\n    for (const model of models) {\r\n      promises.push(model.dispose());\r\n    }\r\n    await Promise.all(promises);\r\n    this.onModelLoaded.reset();\r\n  }\r\n\r\n  /**\r\n   * Disposes of a specific model by its ID.\r\n   * @param modelId - The unique identifier of the model to dispose.\r\n   */\r\n  async disposeModel(modelId: string) {\r\n    const model = this.models.list.get(modelId);\r\n    if (model) {\r\n      await model.dispose();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aborts an in-flight `load()` for the given model ID. The pending `load()`\r\n   * promise will reject with a `LoadAbortedError` and any partial state\r\n   * (on both the main thread and the worker) is disposed.\r\n   *\r\n   * Has no effect if the model finished loading or isn't currently loading.\r\n   *\r\n   * @param modelId - The unique identifier of the model to abort.\r\n   */\r\n  abort(modelId: string) {\r\n    // Fire-and-forget — the worker sets an abort flag and the in-flight\r\n    // generate() loop throws at its next yield point. The error unwinds\r\n    // through load() and its catch block cleans up on the main thread.\r\n    this._connection.fetch({\r\n      class: MultiThreadingRequestClass.ABORT_MODEL,\r\n      modelId,\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Updates all models managed by this FragmentsModels instance.\r\n   * @param force - If true, it will force all the models to finish all the pending requests.\r\n   */\r\n  async update(force = false) {\r\n    if (this._isDisposed) {\r\n      return;\r\n    }\r\n    const now = performance.now();\r\n    if (now - this._lastUpdate < this.settings.maxUpdateRate) {\r\n      return;\r\n    }\r\n    this._lastUpdate = now;\r\n\r\n    // Update the virtual view for all models\r\n    const modelUpdates: Promise<void>[] = [];\r\n    for (const model of this.models.list.values()) {\r\n      modelUpdates.push(model._refreshView());\r\n    }\r\n    await Promise.all(modelUpdates);\r\n\r\n    // This might not be ideal\r\n    if (force) {\r\n      await this.models.forceUpdateFinish(\r\n        this.settings.forceUpdateRate,\r\n        this.settings.forceUpdateBuffer,\r\n      );\r\n    } else {\r\n      this.models.update();\r\n    }\r\n  }\r\n\r\n  private async manageRequest(message: any): Promise<void> {\r\n    if (message.class === MultiThreadingRequestClass.LOAD_PROGRESS) {\r\n      const callback = this._progressCallbacks.get(message.modelId);\r\n      if (callback) {\r\n        callback({\r\n          modelId: message.modelId,\r\n          stage: message.stage,\r\n          progress: message.progress,\r\n        });\r\n      }\r\n      return;\r\n    }\r\n    const model = this.models.list.get(message.modelId);\r\n    if (model) {\r\n      await model.handleRequest(message);\r\n    }\r\n  }\r\n\r\n  private newUpdateEvent() {\r\n    return () => {\r\n      // This limits the maximum update rate to the maxUpdateRate setting\r\n      if (this._autoRedrawInterval) {\r\n        clearTimeout(this._autoRedrawInterval);\r\n      }\r\n\r\n      const offset = this.settings.maxUpdateRate + 1;\r\n      this._autoRedrawInterval = setTimeout(() => {\r\n        this.update();\r\n      }, offset);\r\n    };\r\n  }\r\n\r\n  private newRequestEvent() {\r\n    return (request: ThreadHandler) => {\r\n      this.manageRequest(request);\r\n    };\r\n  }\r\n}\r\n","import * as WEBIFC from \"web-ifc\";\r\nimport { Builder } from \"flatbuffers\";\r\nimport * as TFB from \"../../../../Schema\";\r\nimport { RawEntityAttrs } from \"./types\";\r\nimport { IfcImporter } from \"../..\";\r\nimport { FragmentsIfcUtils, ifcCategoryMap } from \"../../../../Utils\";\r\nimport { ProcessData } from \"../types\";\r\nimport {\r\n  ALIGNMENT_CATEGORY,\r\n  AlignmentData,\r\n  GRID_CATEGORY,\r\n  GridData,\r\n} from \"../../../../FragmentsModels\";\r\n\r\nexport interface PropertiesProcessData extends ProcessData {\r\n  geometryProcessedLocalIDs: number[];\r\n  alignments?: AlignmentData[];\r\n  grids?: GridData[];\r\n  maxLocalID: number;\r\n}\r\n\r\nexport class IfcPropertyProcessor {\r\n  private _lengthUnitsFactor = 1;\r\n  private _attributesOffsets: number[] = [];\r\n  private _relationsMap: Record<number, { [name: string]: number[] }> = {};\r\n  private _guids: string[] = [];\r\n  private _guidsItems: number[] = [];\r\n  private _uniqueAttributes = new Set<string>();\r\n  private _uniqueRelNames = new Set<string>();\r\n  private _maxLocalID = 0;\r\n\r\n  private _ifcApi: WEBIFC.IfcAPI | null = null;\r\n  wasm = {\r\n    path: \"/node_modules/web-ifc/\",\r\n    absolute: false,\r\n  };\r\n\r\n  webIfcSettings: WEBIFC.LoaderSettings = {};\r\n\r\n  readonly expressIDs: number[] = [];\r\n\r\n  readonly classes: string[] = [];\r\n\r\n  async getIfcApi() {\r\n    if (!this._ifcApi) {\r\n      const ifcApi = new WEBIFC.IfcAPI();\r\n      ifcApi.SetWasmPath(this.wasm.path, this.wasm.absolute);\r\n      await ifcApi.Init();\r\n      ifcApi.SetLogLevel(WEBIFC.LogLevel.LOG_LEVEL_OFF);\r\n      this._ifcApi = ifcApi;\r\n    }\r\n    return this._ifcApi;\r\n  }\r\n\r\n  private async getSchema(modelId = 0) {\r\n    const ifcApi = await this.getIfcApi();\r\n    const schema = ifcApi.GetModelSchema(modelId);\r\n    if (!schema) {\r\n      throw new Error(\"Fragments: IFC Schema not found\");\r\n    }\r\n    if (schema.startsWith(\"IFC2X3\")) {\r\n      return \"IFC2X3\";\r\n    }\r\n    if (schema.startsWith(\"IFC4\") && schema.replace(\"IFC4\", \"\") === \"\") {\r\n      return \"IFC4\";\r\n    }\r\n    if (schema.startsWith(\"IFC4X\")) {\r\n      return \"IFC4X3\";\r\n    }\r\n    return schema;\r\n  }\r\n\r\n  constructor(\r\n    private _serializer: IfcImporter,\r\n    private _builder: Builder,\r\n  ) {}\r\n\r\n  private unwrapValue(value: any): any {\r\n    if (value === null || value === undefined) {\r\n      return value;\r\n    }\r\n    if (typeof value === \"object\" && \"value\" in value) {\r\n      return this.unwrapValue(value.value);\r\n    }\r\n    return value;\r\n  }\r\n\r\n  async process(data: PropertiesProcessData) {\r\n    // Open the IFC\r\n    const ifcApi = await this.getIfcApi();\r\n    this._maxLocalID = data.maxLocalID + 1;\r\n\r\n    if (data.readFromCallback && data.readCallback) {\r\n      ifcApi.OpenModelFromCallback(data.readCallback, this.webIfcSettings);\r\n    } else if (data.bytes) {\r\n      await ifcApi.OpenModel(data.bytes, this.webIfcSettings);\r\n    } else {\r\n      throw new Error(\"Fragments: No data provided\");\r\n    }\r\n\r\n    if (this._serializer.replaceStoreyElevation) {\r\n      await this.setLengthUnitsFactor();\r\n    }\r\n\r\n    const modelClasses = ifcApi\r\n      .GetAllTypesOfModel(0)\r\n      .map((entry) => entry.typeID);\r\n\r\n    const schema = await this.getSchema();\r\n    const schemaNamespace = (WEBIFC as any)[schema];\r\n    if (!schemaNamespace) {\r\n      throw new Error(`Fragments: Model schema not recognized.`);\r\n    }\r\n\r\n    // First process items that been processed by geometry processor\r\n\r\n    const itemsWithGeom = data.geometryProcessedLocalIDs;\r\n    await this.processItems(itemsWithGeom);\r\n    const visitedItems = new Set(itemsWithGeom);\r\n    data.progressCallback?.(0.6, {\r\n      process: \"attributes\",\r\n      state: \"start\",\r\n      entitiesProcessed: itemsWithGeom.length,\r\n    });\r\n\r\n    // Now process the rest of items\r\n\r\n    const classes = new Set([\r\n      ...this._serializer.classes.abstract,\r\n      ...this._serializer.classes.elements,\r\n    ]);\r\n\r\n    const toProcess = modelClasses.filter((type) => classes.has(type));\r\n    const categoryPercentage = 0.15 / toProcess.length;\r\n\r\n    for (const [index, entityClass] of toProcess.entries()) {\r\n      const classEntities = ifcApi.GetLineIDsWithType(0, entityClass);\r\n      if (classEntities.size() === 0) continue;\r\n      const items: number[] = [];\r\n      for (let index = 0; index < classEntities.size(); index++) {\r\n        const id = classEntities.get(index);\r\n        if (visitedItems.has(id)) continue;\r\n        items.push(id);\r\n      }\r\n      if (items.length === 0) continue;\r\n      await this.processItems(items);\r\n      data.progressCallback?.(categoryPercentage * (index + 1) + 0.6, {\r\n        process: \"attributes\",\r\n        state: index + 1 === toProcess.length ? \"finish\" : \"inProgress\",\r\n        class: ifcCategoryMap[entityClass],\r\n        entitiesProcessed: items.length,\r\n      });\r\n    }\r\n\r\n    // Now process alignments\r\n\r\n    const alignments = data.alignments;\r\n    if (alignments) {\r\n      this.processCustomItems(alignments, ALIGNMENT_CATEGORY);\r\n    }\r\n\r\n    // Now process grids\r\n    const grids = data.grids;\r\n    if (grids) {\r\n      this.processCustomItems(grids, GRID_CATEGORY);\r\n    }\r\n\r\n    const relations = new Set([...this._serializer.relations.keys()]);\r\n    const relsToProcess = modelClasses.filter((type) => relations.has(type));\r\n    const relsPercentage = 0.15 / relsToProcess.length;\r\n\r\n    for (const [index, rel] of relsToProcess.entries()) {\r\n      const state = (() => {\r\n        if (index === 0) return \"start\";\r\n        if (index + 1 === relsToProcess.length) return \"finish\";\r\n        return \"inProgress\";\r\n      })();\r\n      await this.processRelations([rel]);\r\n      data.progressCallback?.(relsPercentage * (index + 1) + 0.75, {\r\n        process: \"relations\",\r\n        state,\r\n        class: ifcCategoryMap[rel],\r\n      });\r\n    }\r\n\r\n    const { relIndicesVector, relsVector } = this.getRelationsVector();\r\n    const { guidsVector, guidsItemsVector } = this.getGuidsVector();\r\n    const metadataOffset = await this.getMetadataOffset();\r\n    const attributesVector = this.getAttributesVector();\r\n    const uniqueAttributesVector = this.getUniqueAttributesVector();\r\n    const relNamesVector = this.getRelNamesVector();\r\n\r\n    const localIdsVector = TFB.Model.createLocalIdsVector(\r\n      this._builder,\r\n      this.expressIDs,\r\n    );\r\n\r\n    const categoriesVector = this.getCategoriesVector();\r\n\r\n    const spatialStrutureOffset = await this.getSpatialStructureOffset();\r\n\r\n    this.clean();\r\n\r\n    return {\r\n      relIndicesVector,\r\n      relsVector,\r\n      guidsVector,\r\n      guidsItemsVector,\r\n      metadataOffset,\r\n      attributesVector,\r\n      localIdsVector,\r\n      categoriesVector,\r\n      spatialStrutureOffset,\r\n      uniqueAttributesVector,\r\n      relNamesVector,\r\n      newMaxLocalID: this._maxLocalID,\r\n    };\r\n  }\r\n\r\n  private async processItems(items: number[]) {\r\n    const ifcApi = await this.getIfcApi();\r\n    for (let index = 0; index < items.length; index++) {\r\n      const expressID = items[index];\r\n      try {\r\n        const attrs = ifcApi.GetLine(0, expressID) as RawEntityAttrs;\r\n        if (!attrs) continue;\r\n\r\n        // @ts-ignore\r\n        const className = ifcCategoryMap[attrs.type];\r\n        this.classes.push(className);\r\n        this.expressIDs.push(expressID);\r\n        await this.serializeAttributes(expressID, attrs);\r\n      } catch (e) {\r\n        console.log(\r\n          `Problem reading properties for ${expressID}. If many items are problematic, it may be a problem with the category you are trying to process. You can remove it and try again.`,\r\n        );\r\n        console.log(e);\r\n        await new Promise((resolve) => {\r\n          setTimeout(resolve, 100);\r\n        });\r\n        continue;\r\n      }\r\n    }\r\n  }\r\n\r\n  private async processCustomItems(\r\n    customItems: AlignmentData[] | GridData[],\r\n    category: string,\r\n  ) {\r\n    for (const customItem of customItems) {\r\n      const expressID = this._maxLocalID++;\r\n      const attrValue = JSON.stringify(customItem);\r\n      const attrName = \"data\";\r\n      const attrType = \"UNDEFINED\";\r\n      const hash = JSON.stringify([attrName, attrValue, attrType]);\r\n      const attrOffset = this._builder.createSharedString(hash);\r\n      if (this._serializer.includeUniqueAttributes) {\r\n        this._uniqueAttributes.add(hash);\r\n      }\r\n\r\n      const dataVector = TFB.Attribute.createDataVector(this._builder, [\r\n        attrOffset,\r\n      ]);\r\n\r\n      const attributesOffset = TFB.Attribute.createAttribute(\r\n        this._builder,\r\n        dataVector,\r\n      );\r\n\r\n      // @ts-ignore\r\n      this.classes.push(category);\r\n      this.expressIDs.push(expressID);\r\n      this._attributesOffsets.push(attributesOffset);\r\n    }\r\n  }\r\n\r\n  private addRelation(expressID: number, relName: string, ids: number[]) {\r\n    if (!this._relationsMap[expressID]) this._relationsMap[expressID] = {};\r\n    if (!this._relationsMap[expressID][relName])\r\n      this._relationsMap[expressID][relName] = [];\r\n    for (const id of ids) {\r\n      this._relationsMap[expressID][relName].push(id);\r\n    }\r\n    if (this._serializer.includeRelationNames) {\r\n      this._uniqueRelNames.add(relName);\r\n    }\r\n  }\r\n\r\n  private async getAbsoluteElevation(\r\n    placement: number,\r\n    height: { value: number },\r\n  ) {\r\n    const ifcApi = await this.getIfcApi();\r\n\r\n    const localPlacementAttrs = ifcApi.GetLine(0, placement);\r\n\r\n    let relPlacementAttrs: RawEntityAttrs | undefined;\r\n\r\n    if (\r\n      localPlacementAttrs?.RelativePlacement &&\r\n      \"value\" in localPlacementAttrs.RelativePlacement &&\r\n      typeof localPlacementAttrs.RelativePlacement.value === \"number\"\r\n    ) {\r\n      relPlacementAttrs = ifcApi.GetLine(\r\n        0,\r\n        localPlacementAttrs.RelativePlacement.value,\r\n      );\r\n    }\r\n\r\n    let locationAttrs: RawEntityAttrs | undefined;\r\n\r\n    if (\r\n      relPlacementAttrs?.Location &&\r\n      \"value\" in relPlacementAttrs.Location &&\r\n      typeof relPlacementAttrs.Location.value === \"number\"\r\n    ) {\r\n      locationAttrs = ifcApi.GetLine(0, relPlacementAttrs.Location.value);\r\n    }\r\n\r\n    if (\r\n      locationAttrs?.Coordinates &&\r\n      Array.isArray(locationAttrs.Coordinates) &&\r\n      \"value\" in locationAttrs.Coordinates[2] &&\r\n      typeof locationAttrs.Coordinates[2].value === \"number\"\r\n    ) {\r\n      height.value += locationAttrs.Coordinates[2].value;\r\n    }\r\n\r\n    if (\r\n      localPlacementAttrs?.PlacementRelTo &&\r\n      \"value\" in localPlacementAttrs.PlacementRelTo &&\r\n      typeof localPlacementAttrs.PlacementRelTo.value === \"number\"\r\n    ) {\r\n      await this.getAbsoluteElevation(\r\n        localPlacementAttrs.PlacementRelTo.value,\r\n        height,\r\n      );\r\n    }\r\n  }\r\n\r\n  async setLengthUnitsFactor() {\r\n    const ifcApi = await this.getIfcApi();\r\n    this._lengthUnitsFactor = FragmentsIfcUtils.getUnitsFactor(ifcApi);\r\n  }\r\n\r\n  async serializeAttributes(expressID: number, attrs: RawEntityAttrs) {\r\n    const attrOffsets: number[] = [];\r\n    let guid: string | null = null;\r\n\r\n    if (\r\n      this._serializer.replaceSiteElevation &&\r\n      attrs.type &&\r\n      typeof attrs.type === \"number\" &&\r\n      attrs.type === WEBIFC.IFCSITE &&\r\n      attrs.ObjectPlacement &&\r\n      \"value\" in attrs.ObjectPlacement &&\r\n      typeof attrs.ObjectPlacement.value === \"number\"\r\n    ) {\r\n      const height = { value: 0 };\r\n      await this.getAbsoluteElevation(attrs.ObjectPlacement.value, height);\r\n      attrs.RefElevation = new WEBIFC.IFC4X3.IfcLengthMeasure(\r\n        height.value * this._lengthUnitsFactor,\r\n      );\r\n    }\r\n\r\n    if (\r\n      this._serializer.replaceStoreyElevation &&\r\n      attrs.type &&\r\n      typeof attrs.type === \"number\" &&\r\n      attrs.type === WEBIFC.IFCBUILDINGSTOREY &&\r\n      attrs.ObjectPlacement &&\r\n      \"value\" in attrs.ObjectPlacement &&\r\n      typeof attrs.ObjectPlacement.value === \"number\"\r\n    ) {\r\n      const height = { value: 0 };\r\n      await this.getAbsoluteElevation(attrs.ObjectPlacement.value, height);\r\n      attrs.Elevation = new WEBIFC.IFC4X3.IfcLengthMeasure(\r\n        height.value * this._lengthUnitsFactor,\r\n      );\r\n    }\r\n\r\n    let index = 0;\r\n    for (const [attrName, attrValue] of Object.entries(attrs)) {\r\n      if (typeof attrValue === \"number\" || typeof attrValue === \"boolean\")\r\n        continue;\r\n      if (\r\n        this._serializer.attributesToExclude.has(attrName) ||\r\n        attrValue === null ||\r\n        attrValue === undefined\r\n      ) {\r\n        index++;\r\n        continue;\r\n      }\r\n\r\n      // Array attributes are **usually** references to other entities\r\n      // They must be added as a relation\r\n      // When they are not references to other entities, the value of them all\r\n      // is taken and packed into a single array\r\n      if (Array.isArray(attrValue)) {\r\n        const noHandles = attrValue.filter((handle) => handle.type !== 5);\r\n\r\n        if (noHandles.length > 0) {\r\n          const noHandlesValue = noHandles.map((handle) =>\r\n            this.unwrapValue(handle.value),\r\n          ) as number[];\r\n\r\n          const attrData = [attrName, noHandlesValue];\r\n          const dataTypeName =\r\n            \"name\" in noHandles[0] && noHandles[0].name\r\n              ? noHandles[0].name\r\n              : noHandles[0].constructor.name.toUpperCase();\r\n          attrData.push(dataTypeName !== \"OBJECT\" ? dataTypeName : \"UNDEFINED\");\r\n\r\n          const hash = JSON.stringify(attrData);\r\n          const attrOffset = this._builder.createSharedString(hash);\r\n          attrOffsets.push(attrOffset);\r\n        }\r\n\r\n        const handles = attrValue.filter((handle) => handle.type === 5);\r\n        const ids = handles.map((handle) => handle.value) as number[];\r\n        this.addRelation(expressID, attrName, ids);\r\n        index++;\r\n        continue;\r\n      }\r\n\r\n      // Handle both wrapped values (with .value and .type) and unwrapped primitives\r\n      let value: any;\r\n      let type: number | undefined;\r\n\r\n      if (\r\n        typeof attrValue === \"object\" &&\r\n        attrValue !== null &&\r\n        \"type\" in attrValue\r\n      ) {\r\n        // Value is wrapped in an object with type information\r\n        value = attrValue.value;\r\n        type = attrValue.type;\r\n      } else if (typeof attrValue === \"string\") {\r\n        // Unwrapped string value\r\n        value = attrValue;\r\n        type = undefined;\r\n      } else {\r\n        // Other cases - treat as unwrapped value\r\n        value = attrValue;\r\n        type = undefined;\r\n      }\r\n\r\n      if (type === 5) {\r\n        // Type 5 values are references to other entities\r\n        // They must be added as a relation\r\n        if (typeof value !== \"number\") continue;\r\n        this.addRelation(expressID, attrName, [value]);\r\n      } else {\r\n        // Unwrap nested value objects (handles IFCREAL(), IFCINTEGER(), etc.)\r\n        const unwrappedValue = this.unwrapValue(value);\r\n\r\n        if (attrName === \"GlobalId\" && typeof unwrappedValue === \"string\") {\r\n          guid = unwrappedValue;\r\n          index++;\r\n          continue;\r\n        }\r\n        // name and value must always be at index 0 and 1\r\n        // other data can be set starting index 2\r\n        const attrData = [attrName, unwrappedValue];\r\n\r\n        // Infer type name from the attrValue object or from the actual value type\r\n        let dataTypeName = \"UNDEFINED\";\r\n        if (typeof attrValue === \"object\" && attrValue !== null) {\r\n          if (\"name\" in attrValue && attrValue.name) {\r\n            dataTypeName = attrValue.name;\r\n          } else if (\r\n            attrValue.constructor &&\r\n            attrValue.constructor.name !== \"Object\"\r\n          ) {\r\n            dataTypeName = attrValue.constructor.name.toUpperCase();\r\n          }\r\n        }\r\n\r\n        // If still undefined, infer from the unwrapped value's type\r\n        if (dataTypeName === \"UNDEFINED\" || dataTypeName === \"OBJECT\") {\r\n          if (typeof unwrappedValue === \"number\") {\r\n            // Check if it's an integer or real number\r\n            dataTypeName = Number.isInteger(unwrappedValue)\r\n              ? \"IFCINTEGER\"\r\n              : \"IFCREAL\";\r\n          } else if (typeof unwrappedValue === \"string\") {\r\n            dataTypeName = \"IFCLABEL\";\r\n          } else if (typeof unwrappedValue === \"boolean\") {\r\n            dataTypeName = \"IFCBOOLEAN\";\r\n          }\r\n        }\r\n\r\n        attrData.push(dataTypeName);\r\n        const hash = JSON.stringify(attrData);\r\n        const attrOffset = this._builder.createSharedString(hash);\r\n        attrOffsets.push(attrOffset);\r\n        if (this._serializer.includeUniqueAttributes) {\r\n          this._uniqueAttributes.add(hash);\r\n        }\r\n      }\r\n\r\n      index++;\r\n    }\r\n\r\n    const dataVector = TFB.Attribute.createDataVector(\r\n      this._builder,\r\n      attrOffsets,\r\n    );\r\n    const attributeOffset = TFB.Attribute.createAttribute(\r\n      this._builder,\r\n      dataVector,\r\n    );\r\n\r\n    this._attributesOffsets.push(attributeOffset);\r\n    if (guid) {\r\n      this._guids.push(guid);\r\n      this._guidsItems.push(expressID);\r\n    }\r\n  }\r\n\r\n  getAttributesVector() {\r\n    const attributesVector = TFB.Model.createAttributesVector(\r\n      this._builder,\r\n      this._attributesOffsets,\r\n    );\r\n    return attributesVector;\r\n  }\r\n\r\n  getUniqueAttributesVector() {\r\n    const offsets: number[] = [];\r\n    for (const hash of this._uniqueAttributes) {\r\n      const offset = this._builder.createSharedString(hash);\r\n      offsets.push(offset);\r\n    }\r\n    const uniqueAttributesVector = TFB.Model.createUniqueAttributesVector(\r\n      this._builder,\r\n      offsets,\r\n    );\r\n    return uniqueAttributesVector;\r\n  }\r\n\r\n  getRelNamesVector() {\r\n    const offsets: number[] = [];\r\n    for (const name of this._uniqueRelNames) {\r\n      const offset = this._builder.createSharedString(name);\r\n      offsets.push(offset);\r\n    }\r\n    const relationNamesVector = TFB.Model.createRelationNamesVector(\r\n      this._builder,\r\n      offsets,\r\n    );\r\n    return relationNamesVector;\r\n  }\r\n\r\n  getGuidsVector() {\r\n    const guidOffsets: number[] = [];\r\n    for (const guid of this._guids) {\r\n      const offset = this._builder.createString(guid);\r\n      guidOffsets.push(offset);\r\n    }\r\n    const guidsVector = TFB.Model.createGuidsVector(this._builder, guidOffsets);\r\n    const guidsItemsVector = TFB.Model.createGuidsItemsVector(\r\n      this._builder,\r\n      this._guidsItems,\r\n    );\r\n    return { guidsVector, guidsItemsVector };\r\n  }\r\n\r\n  async processRelations(rels: number[]) {\r\n    const ifcApi = await this.getIfcApi();\r\n    for (const entityClass of rels) {\r\n      const relNames = this._serializer.relations.get(entityClass);\r\n      if (!relNames) continue;\r\n      const { forRelating, forRelated } = relNames;\r\n      const classEntities = ifcApi.GetLineIDsWithType(0, entityClass);\r\n      if (classEntities.size() === 0) continue;\r\n      for (let index = 0; index < classEntities.size(); index++) {\r\n        const expressID = classEntities.get(index);\r\n        try {\r\n          const attrs = ifcApi.GetLine(0, expressID) as Record<string, any>;\r\n          if (!attrs) continue;\r\n          const attrKeys = Object.keys(attrs);\r\n          const relatingKey = attrKeys.find((attr) =>\r\n            attr.startsWith(\"Relating\"),\r\n          );\r\n          const relatedKey = attrKeys.find((attr) =>\r\n            attr.startsWith(\"Related\"),\r\n          );\r\n          if (!(relatingKey && relatedKey)) continue;\r\n          const relatingID = attrs[relatingKey].value;\r\n\r\n          const rawRelatedIDs = attrs[relatedKey];\r\n          let relatedIDs: number[] = [];\r\n          if (Array.isArray(rawRelatedIDs)) {\r\n            relatedIDs = rawRelatedIDs.map(\r\n              ({ value }: { value: number }) => value,\r\n            );\r\n          } else {\r\n            relatedIDs = [rawRelatedIDs.value];\r\n          }\r\n\r\n          this.addRelation(relatingID, forRelating, relatedIDs);\r\n          for (const relatedID of relatedIDs) {\r\n            this.addRelation(relatedID, forRelated, [relatingID]);\r\n          }\r\n        } catch (e) {\r\n          console.log(`Problem reading relations for ${expressID}`);\r\n          console.log(e);\r\n          await new Promise((resolve) => {\r\n            setTimeout(resolve, 100);\r\n          });\r\n          continue;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  getRelationsVector(clean = false) {\r\n    const rels: number[] = [];\r\n    const ids: number[] = [];\r\n    for (const [expressID, entityRels] of Object.entries(this._relationsMap)) {\r\n      if (clean && !this.expressIDs.includes(Number(expressID))) continue; // very expensive\r\n      const definitions: number[] = [];\r\n      for (const [attrName, _rels] of Object.entries(entityRels)) {\r\n        let rels = _rels;\r\n        if (clean) {\r\n          rels = _rels.filter((id) => this.expressIDs.includes(id)); // very expensive\r\n          if (rels.length === 0) continue;\r\n        }\r\n        const hash = JSON.stringify([attrName, ...rels]);\r\n        const offset = this._builder.createSharedString(hash);\r\n        definitions.push(offset);\r\n      }\r\n      if (clean && definitions.length === 0) continue;\r\n      // ids.push(this._expressIDs.indexOf(Number(expressID)))\r\n      ids.push(Number(expressID));\r\n      const dataVector = TFB.Relation.createDataVector(\r\n        this._builder,\r\n        definitions,\r\n      );\r\n      const relOffset = TFB.Relation.createRelation(this._builder, dataVector);\r\n      rels.push(relOffset);\r\n    }\r\n    const relsVector = TFB.Model.createRelationsVector(this._builder, rels);\r\n    const relIndicesVector = TFB.Model.createRelationsItemsVector(\r\n      this._builder,\r\n      ids,\r\n    );\r\n    return { relIndicesVector, relsVector };\r\n  }\r\n\r\n  getCategoriesVector() {\r\n    const classesOffset = this.classes.map((name) =>\r\n      this._builder.createSharedString(name),\r\n    );\r\n    const categoriesVector = TFB.Model.createCategoriesVector(\r\n      this._builder,\r\n      classesOffset,\r\n    );\r\n    return categoriesVector;\r\n  }\r\n\r\n  async getMetadataOffset() {\r\n    const ifcApi = await this.getIfcApi();\r\n    const schema = ifcApi.GetModelSchema(0);\r\n\r\n    const rawNames = ifcApi.GetHeaderLine(0, WEBIFC.FILE_NAME);\r\n    const rawDescription = ifcApi.GetHeaderLine(0, WEBIFC.FILE_DESCRIPTION);\r\n\r\n    const names: string[] = [];\r\n    this.getMetadataRecursively(rawNames.arguments, names);\r\n\r\n    const descriptions: string[] = [];\r\n    this.getMetadataRecursively(rawDescription.arguments, descriptions);\r\n\r\n    const crs = this.extractCRS(ifcApi);\r\n\r\n    const metadata = { schema, names, descriptions, crs } as any;\r\n\r\n    const metadataOffset = this._builder.createString(JSON.stringify(metadata));\r\n    return metadataOffset;\r\n  }\r\n\r\n  private extractCRS(ifcApi: WEBIFC.IfcAPI) {\r\n    // Try IFCPROJECTEDCRS first, then fall back to IFCCOORDINATEREFERENCESYSTEM\r\n    let crsEntity: any = null;\r\n    try {\r\n      const ids = ifcApi.GetLineIDsWithType(0, WEBIFC.IFCPROJECTEDCRS);\r\n      if (ids.size() > 0) {\r\n        crsEntity = ifcApi.GetLine(0, ids.get(0));\r\n      }\r\n    } catch {\r\n      // IFCPROJECTEDCRS may not exist in older IFC schemas\r\n    }\r\n\r\n    if (!crsEntity) {\r\n      try {\r\n        const ids = ifcApi.GetLineIDsWithType(\r\n          0,\r\n          WEBIFC.IFCCOORDINATEREFERENCESYSTEM,\r\n        );\r\n        if (ids.size() > 0) {\r\n          crsEntity = ifcApi.GetLine(0, ids.get(0));\r\n        }\r\n      } catch {\r\n        // Not available\r\n      }\r\n    }\r\n\r\n    if (!crsEntity) {\r\n      return null;\r\n    }\r\n\r\n    const name = this.unwrapValue(crsEntity.Name) ?? null;\r\n    const description = this.unwrapValue(crsEntity.Description) ?? null;\r\n    const geodeticDatum = this.unwrapValue(crsEntity.GeodeticDatum) ?? null;\r\n    const verticalDatum = this.unwrapValue(crsEntity.VerticalDatum) ?? null;\r\n    const mapProjection = this.unwrapValue(crsEntity.MapProjection) ?? null;\r\n    const mapZone = this.unwrapValue(crsEntity.MapZone) ?? null;\r\n\r\n    // Resolve MapUnit reference to get the unit name\r\n    let mapUnit: string | null = null;\r\n    try {\r\n      const unitRef = crsEntity.MapUnit;\r\n      if (unitRef && typeof unitRef === \"object\" && unitRef.type === 5) {\r\n        const unitEntity = ifcApi.GetLine(0, unitRef.value);\r\n        if (unitEntity) {\r\n          const unitName = this.unwrapValue(unitEntity.Name);\r\n          if (unitName) {\r\n            mapUnit = String(unitName);\r\n          }\r\n        }\r\n      }\r\n    } catch {\r\n      // Unit resolution failed\r\n    }\r\n\r\n    // Extract IFCMAPCONVERSION if present\r\n    let mapConversion = null;\r\n    try {\r\n      const convIds = ifcApi.GetLineIDsWithType(0, WEBIFC.IFCMAPCONVERSION);\r\n      if (convIds.size() > 0) {\r\n        const conv = ifcApi.GetLine(0, convIds.get(0));\r\n        mapConversion = {\r\n          eastings: this.unwrapValue(conv.Eastings) ?? 0,\r\n          northings: this.unwrapValue(conv.Northings) ?? 0,\r\n          orthogonalHeight: this.unwrapValue(conv.OrthogonalHeight) ?? 0,\r\n          xAxisAbscissa: this.unwrapValue(conv.XAxisAbscissa) ?? 1,\r\n          xAxisOrdinate: this.unwrapValue(conv.XAxisOrdinate) ?? 0,\r\n          scale: this.unwrapValue(conv.Scale) ?? 1,\r\n        };\r\n      }\r\n    } catch {\r\n      // IFCMAPCONVERSION may not exist\r\n    }\r\n\r\n    return {\r\n      name,\r\n      description,\r\n      geodeticDatum,\r\n      verticalDatum,\r\n      mapProjection,\r\n      mapZone,\r\n      mapUnit,\r\n      mapConversion,\r\n    };\r\n  }\r\n\r\n  private getMetadataRecursively(source: any[], target: string[]) {\r\n    for (const item of source) {\r\n      if (item === null || item === undefined) continue;\r\n      if (Array.isArray(item)) {\r\n        this.getMetadataRecursively(item, target);\r\n      }\r\n      if (\"value\" in item && typeof item.value === \"string\") {\r\n        target.push(item.value);\r\n      }\r\n    }\r\n  }\r\n\r\n  private getEntityDecomposition(\r\n    expressID: number,\r\n    inverseAttributes: string[],\r\n  ) {\r\n    const offsets: number[] = [];\r\n\r\n    for (const attrName of inverseAttributes) {\r\n      const relations = this._relationsMap[expressID]?.[attrName];\r\n      if (!relations) continue;\r\n\r\n      const entityGroups: { [type: string]: number[] } = {};\r\n      for (const expressID of relations) {\r\n        const entityIndex = this.expressIDs.indexOf(expressID);\r\n        if (entityIndex === -1) continue;\r\n        const entityClass = this.classes[entityIndex];\r\n        if (!entityClass) continue;\r\n        if (!entityGroups[entityClass]) entityGroups[entityClass] = [];\r\n        entityGroups[entityClass].push(expressID);\r\n      }\r\n\r\n      for (const category in entityGroups) {\r\n        const entities = entityGroups[category];\r\n        const childrenOffsets = entities.map((id) =>\r\n          this.getEntityDecomposition(id, inverseAttributes),\r\n        );\r\n        const childrenVector = TFB.SpatialStructure.createChildrenVector(\r\n          this._builder,\r\n          childrenOffsets,\r\n        );\r\n        const categoryOffset = this._builder.createSharedString(category);\r\n\r\n        TFB.SpatialStructure.startSpatialStructure(this._builder);\r\n        TFB.SpatialStructure.addCategory(this._builder, categoryOffset);\r\n        TFB.SpatialStructure.addChildren(this._builder, childrenVector);\r\n        const offset = TFB.SpatialStructure.endSpatialStructure(this._builder);\r\n        offsets.push(offset);\r\n      }\r\n    }\r\n\r\n    const childrenVector = TFB.SpatialStructure.createChildrenVector(\r\n      this._builder,\r\n      offsets,\r\n    );\r\n    TFB.SpatialStructure.startSpatialStructure(this._builder);\r\n    TFB.SpatialStructure.addLocalId(this._builder, expressID);\r\n    TFB.SpatialStructure.addChildren(this._builder, childrenVector);\r\n    const offset = TFB.SpatialStructure.endSpatialStructure(this._builder);\r\n\r\n    return offset;\r\n  }\r\n\r\n  async getSpatialStructureOffset() {\r\n    const ifcApi = await this.getIfcApi();\r\n    const ifcClass = WEBIFC.IFCPROJECT;\r\n    const classEntities = [...ifcApi.GetLineIDsWithType(0, ifcClass)];\r\n    const childrenOffsets = classEntities.map((id) =>\r\n      this.getEntityDecomposition(id, [\"IsDecomposedBy\", \"ContainsElements\"]),\r\n    );\r\n\r\n    const categoryOffset = this._builder.createSharedString(\"IFCPROJECT\");\r\n    const childrenVector = TFB.SpatialStructure.createChildrenVector(\r\n      this._builder,\r\n      childrenOffsets,\r\n    );\r\n    TFB.SpatialStructure.startSpatialStructure(this._builder);\r\n    TFB.SpatialStructure.addCategory(this._builder, categoryOffset);\r\n    TFB.SpatialStructure.addChildren(this._builder, childrenVector);\r\n    const offset = TFB.SpatialStructure.endSpatialStructure(this._builder);\r\n    return offset;\r\n  }\r\n\r\n  clean() {\r\n    this._ifcApi?.Dispose();\r\n    this._ifcApi = null;\r\n    this._guids = [];\r\n    this._guidsItems = [];\r\n    this._attributesOffsets = [];\r\n    this._relationsMap = {};\r\n    this._uniqueAttributes.clear();\r\n    this._uniqueRelNames.clear();\r\n    (this.expressIDs as any) = [];\r\n    (this.classes as any) = [];\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport * as WEBIFC from \"web-ifc\";\r\nimport {\r\n  AlignmentCurveType,\r\n  AlignmentData,\r\n} from \"../../../../../FragmentsModels\";\r\n\r\nexport class CivilReader {\r\n  read(webIfc: WEBIFC.IfcAPI) {\r\n    try {\r\n      const alignments = webIfc.GetAllAlignments(0);\r\n\r\n      const allAlignments: AlignmentData[] = [];\r\n\r\n      for (const alignment of alignments) {\r\n        const currentAlignment: AlignmentData = {\r\n          absolute: [],\r\n          horizontal: [],\r\n          vertical: [],\r\n        };\r\n        allAlignments.push(currentAlignment);\r\n\r\n        const noVertical = alignment.vertical.length === 0;\r\n\r\n        // When there's no vertical data, web-ifc doesn't produce a proper\r\n        // 3D curve.  We synthesize one from the horizontal points and apply\r\n        // the coordination matrix so they end up in the same space as the\r\n        // model geometry (web-ifc applies it automatically to curve3D).\r\n        // When there's no vertical data, web-ifc can't produce a proper 3D\r\n        // curve.  We synthesize one from the 2D horizontal points.  Those\r\n        // points are in alignment-local IFC space, so we apply the\r\n        // alignment's world transform (same thing web-ifc does for curve3D).\r\n        // We do NOT apply the coordination matrix — model geometry doesn't\r\n        // have it baked in either (it's stored separately).\r\n        let worldMatrix: THREE.Matrix4 | null = null;\r\n        if (noVertical && alignment.FlattenedWorldTransformMatrix) {\r\n          worldMatrix = new THREE.Matrix4();\r\n          worldMatrix.fromArray(alignment.FlattenedWorldTransformMatrix);\r\n        }\r\n\r\n        let pointsCounter = 0;\r\n        const points3d = alignment.curve3D[0]?.points;\r\n\r\n        for (let i = 0; i < alignment.horizontal.length; i++) {\r\n          const curveHorizontal = alignment.horizontal[i];\r\n\r\n          const result3d: number[] = [];\r\n          const resultHorizontal: number[] = [];\r\n\r\n          const type = this.getCurveType(curveHorizontal.data[1]);\r\n          const points3DReversed: number[][] = [];\r\n          const pointsHorizontalReversed: number[][] = [];\r\n\r\n          const tempVec = new THREE.Vector3();\r\n\r\n          for (const point of curveHorizontal.points) {\r\n            if (noVertical) {\r\n              // Work in IFC space (x=easting, y=northing, z=elevation)\r\n              tempVec.set(point.x, point.y, 0);\r\n              if (worldMatrix) tempVec.applyMatrix4(worldMatrix);\r\n              // Swizzle IFC Z-up → Three.js Y-up: (x, z, -y)\r\n              points3DReversed.push([tempVec.x, tempVec.z, -tempVec.y]);\r\n            } else {\r\n              const point3d = points3d?.[pointsCounter++];\r\n              if (point3d) {\r\n                points3DReversed.push([point3d.x, point3d.y, point3d.z]);\r\n              } else {\r\n                console.log(\"Problem reading alignment 3D points\");\r\n              }\r\n            }\r\n            pointsHorizontalReversed.push([point.x, point.y]);\r\n          }\r\n\r\n          // points3DReversed.reverse();\r\n          // pointsHorizontalReversed.reverse();\r\n\r\n          for (const [x, y, z] of points3DReversed) {\r\n            result3d.push(x, y, z);\r\n          }\r\n\r\n          for (const [x, y] of pointsHorizontalReversed) {\r\n            resultHorizontal.push(x, 0, -y);\r\n          }\r\n\r\n          if (result3d.length) {\r\n            currentAlignment.absolute.push({\r\n              points: result3d,\r\n              type,\r\n            });\r\n          }\r\n\r\n          currentAlignment.horizontal.push({\r\n            points: resultHorizontal,\r\n            type,\r\n          });\r\n        }\r\n\r\n        for (let i = 0; i < alignment.vertical.length; i++) {\r\n          const curveVertical = alignment.vertical[i];\r\n\r\n          const resultVertical: number[] = [];\r\n\r\n          const type = this.getCurveType(curveVertical.data[1]);\r\n          const pointsVerticalReversed: number[][] = [];\r\n\r\n          for (const point of curveVertical.points) {\r\n            pointsVerticalReversed.push([point.x, point.y]);\r\n          }\r\n\r\n          // pointsVerticalReversed.reverse();\r\n\r\n          for (const [x, y] of pointsVerticalReversed) {\r\n            resultVertical.push(x, y, 0);\r\n          }\r\n\r\n          currentAlignment.vertical.push({\r\n            points: resultVertical,\r\n            type,\r\n          });\r\n        }\r\n      }\r\n      return allAlignments;\r\n    } catch (error) {\r\n      console.error(\"CivilReader error:\", error);\r\n      return [];\r\n    }\r\n  }\r\n\r\n  private getCurveType(data: string) {\r\n    if (data.includes(\"CIRCULARARC\")) {\r\n      return AlignmentCurveType.ELLIPSE_ARC;\r\n    }\r\n    if (data.includes(\"LINE\") || data.includes(\"GRADIENT\")) {\r\n      return AlignmentCurveType.LINES;\r\n    }\r\n    if (data.includes(\"CLOTHOID\")) {\r\n      return AlignmentCurveType.CLOTHOID;\r\n    }\r\n    if (data.includes(\"PARABOLICARC\")) {\r\n      return AlignmentCurveType.PARABOLA;\r\n    }\r\n    throw new Error(`Fragments: Unknown curve type: ${data}`);\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport * as WEBIFC from \"web-ifc\";\r\nimport { GridAxisData, GridData } from \"../../../../FragmentsModels\";\r\nimport { FragmentsIfcUtils } from \"../../../../Utils\";\r\n\r\nexport class GridReader {\r\n  read(webIfc: WEBIFC.IfcAPI) {\r\n    try {\r\n      const result: GridData[] = [];\r\n\r\n      const coordMatrixValues = webIfc.GetCoordinationMatrix(0);\r\n      const coordMatrix = new THREE.Matrix4();\r\n      coordMatrix.fromArray(coordMatrixValues);\r\n\r\n      const units = FragmentsIfcUtils.getUnitsFactor(webIfc);\r\n\r\n      const gridsVector = webIfc.GetLineIDsWithType(0, WEBIFC.IFCGRID);\r\n      const size = gridsVector.size();\r\n      for (let i = 0; i < size; i++) {\r\n        const id = gridsVector.get(i);\r\n        const grid = webIfc.GetLine(0, id);\r\n\r\n        const transform = FragmentsIfcUtils.getAbsolutePlacement(\r\n          webIfc,\r\n          grid,\r\n          units\r\n        );\r\n\r\n        transform.premultiply(coordMatrix);\r\n\r\n        const data: GridData = {\r\n          id,\r\n          transform: transform.elements,\r\n          uAxes: this.getGridAxes(grid, webIfc, units, \"UAxes\"),\r\n          vAxes: this.getGridAxes(grid, webIfc, units, \"VAxes\"),\r\n          wAxes: this.getGridAxes(grid, webIfc, units, \"WAxes\"),\r\n        };\r\n        result.push(data);\r\n      }\r\n\r\n      return result;\r\n    } catch (error) {\r\n      console.error(error);\r\n      return [] as GridData[];\r\n    }\r\n  }\r\n\r\n  private getGridAxes(\r\n    ifcGrid: any,\r\n    webIfc: WEBIFC.IfcAPI,\r\n    units: number,\r\n    ifcKey: \"UAxes\" | \"VAxes\" | \"WAxes\"\r\n  ): GridAxisData[] {\r\n    if (!ifcGrid[ifcKey]) {\r\n      return [];\r\n    }\r\n\r\n    const axisDataArr: GridAxisData[] = [];\r\n    for (const axis of ifcGrid[ifcKey]) {\r\n      const axisCurve = webIfc.GetLine(0, axis.value);\r\n      const curveId = axisCurve.AxisCurve.value;\r\n      const curve = webIfc.GetLine(0, curveId);\r\n      const axisData: GridAxisData = {\r\n        tag: axisCurve.AxisTag.value,\r\n        curve: [],\r\n      };\r\n      if (!curve.Points) {\r\n        continue;\r\n      }\r\n\r\n      if (curve.type === WEBIFC.IFCPOLYLINE) {\r\n        for (const { value: pointId } of curve.Points) {\r\n          const ifcPoints = webIfc.GetLine(0, pointId);\r\n          if (ifcPoints.Coordinates) {\r\n            for (const coord of ifcPoints.Coordinates) {\r\n              const value = coord.value * units;\r\n              axisData.curve.push(value);\r\n            }\r\n          }\r\n        }\r\n      } else {\r\n        const pointsId = curve.Points.value;\r\n        if (!pointsId) {\r\n          continue;\r\n        }\r\n        const ifcPoints = webIfc.GetLine(0, pointsId);\r\n        if (ifcPoints.CoordList) {\r\n          for (const coordinates of ifcPoints.CoordList) {\r\n            for (const coord of coordinates) {\r\n              const value = coord.value * units;\r\n              axisData.curve.push(value);\r\n            }\r\n          }\r\n        }\r\n      }\r\n      axisDataArr.push(axisData);\r\n    }\r\n    return axisDataArr;\r\n  }\r\n}\r\n","import * as WEBIFC from \"web-ifc\";\r\nimport * as THREE from \"three\";\r\nimport { FragmentsIfcUtils, GeomsFbUtils } from \"../../../../Utils\";\r\nimport {\r\n  GeometryData,\r\n  IfcElement,\r\n  IfcGeometryInstance,\r\n} from \"./ifc-file-reader\";\r\nimport { IfcImporter } from \"../..\";\r\n\r\nexport class SpaceBoundaryReader {\r\n  read(\r\n    webIfc: WEBIFC.IfcAPI,\r\n    serializer: IfcImporter,\r\n    onGeometryLoaded: (data: { id: number; geometry: GeometryData }) => void,\r\n    onElementLoaded: (data: {\r\n      element: IfcElement;\r\n      position: number[];\r\n      xDirection: number[];\r\n      yDirection: number[];\r\n    }) => void,\r\n    getNextId: () => number,\r\n  ) {\r\n    try {\r\n      const units = FragmentsIfcUtils.getUnitsFactor(webIfc);\r\n\r\n      const coordMatrixValues = webIfc.GetCoordinationMatrix(0);\r\n      const coordMatrix = new THREE.Matrix4();\r\n      coordMatrix.fromArray(coordMatrixValues);\r\n\r\n      const boundariesVector = webIfc.GetLineIDsWithType(\r\n        0,\r\n        WEBIFC.IFCRELSPACEBOUNDARY2NDLEVEL,\r\n      );\r\n\r\n      const size = boundariesVector.size();\r\n\r\n      // Cache space transforms by expressID to avoid recomputing\r\n      const spaceTransforms = new Map<\r\n        number,\r\n        {\r\n          transform: THREE.Matrix4;\r\n          decomposed: any;\r\n        }\r\n      >();\r\n\r\n      for (let i = 0; i < size; i++) {\r\n        const id = boundariesVector.get(i);\r\n        const boundary = webIfc.GetLine(0, id);\r\n\r\n        const connectionGeometry = boundary.ConnectionGeometry;\r\n        if (!connectionGeometry) {\r\n          continue;\r\n        }\r\n\r\n        // Get the relating space and its absolute placement\r\n        const relatingSpace = boundary.RelatingSpace;\r\n        if (!relatingSpace) {\r\n          continue;\r\n        }\r\n\r\n        const spaceId = relatingSpace.value;\r\n        let spaceData = spaceTransforms.get(spaceId);\r\n        if (!spaceData) {\r\n          const space = webIfc.GetLine(0, spaceId);\r\n          // getAbsolutePlacement handles IFC Z-up → Three.js Y-up\r\n          // premultiply with coordMatrix to handle COORDINATE_TO_ORIGIN offset\r\n          const transform = FragmentsIfcUtils.getAbsolutePlacement(\r\n            webIfc,\r\n            space,\r\n            units,\r\n          );\r\n          transform.premultiply(coordMatrix);\r\n          const decomposed = this.decompose(transform);\r\n          spaceData = { transform, decomposed };\r\n          spaceTransforms.set(spaceId, spaceData);\r\n        }\r\n\r\n        const surfaceGeometry = webIfc.GetLine(0, connectionGeometry.value);\r\n\r\n        const surfaceOnRelating = surfaceGeometry.SurfaceOnRelatingElement;\r\n        if (!surfaceOnRelating) {\r\n          continue;\r\n        }\r\n\r\n        // Vertices stay in local space (just scaled by units, no transform)\r\n        const buffers = this.getFaceBuffers(\r\n          webIfc,\r\n          surfaceOnRelating.value,\r\n          units,\r\n        );\r\n\r\n        if (!buffers) {\r\n          continue;\r\n        }\r\n\r\n        const { position, normals, index } = buffers;\r\n\r\n        let geomData;\r\n        try {\r\n          geomData = GeomsFbUtils.getShellData({\r\n            position,\r\n            normals,\r\n            index,\r\n            raw: false,\r\n            settings: serializer.geometryProcessSettings,\r\n          });\r\n        } catch {\r\n          console.log(\r\n            `Fragments: Could not process space boundary geometry for #${id}`,\r\n          );\r\n          continue;\r\n        }\r\n\r\n        const geometryId = getNextId();\r\n\r\n        onGeometryLoaded({\r\n          id: geometryId,\r\n          geometry: geomData,\r\n        });\r\n\r\n        const geometryInstance: IfcGeometryInstance = {\r\n          id: geometryId,\r\n          color: [0.5, 0.5, 0.8, 0.5],\r\n          localTransformID: null,\r\n        };\r\n\r\n        const element: IfcElement = {\r\n          id: boundary.expressID,\r\n          type: WEBIFC.IFCRELSPACEBOUNDARY2NDLEVEL,\r\n          guid: boundary.GlobalId.value,\r\n          geometries: [geometryInstance],\r\n        };\r\n\r\n        // Pass the space's absolute placement as the element transform,\r\n        // same pattern as the main pipeline's flatTransformation decomposition\r\n        const { px, py, pz, dxx, dxy, dxz, dyx, dyy, dyz } =\r\n          spaceData.decomposed;\r\n\r\n        onElementLoaded({\r\n          element,\r\n          position: [px, py, pz],\r\n          xDirection: [dxx, dxy, dxz],\r\n          yDirection: [dyx, dyy, dyz],\r\n        });\r\n      }\r\n    } catch (error) {\r\n      console.error(\"Fragments: Error reading space boundaries\", error);\r\n    }\r\n  }\r\n\r\n  private getFaceBuffers(webIfc: WEBIFC.IfcAPI, faceId: number, units: number) {\r\n    const face = webIfc.GetLine(0, faceId);\r\n\r\n    if (!face.Bounds) {\r\n      return null;\r\n    }\r\n\r\n    const points: THREE.Vector3[] = [];\r\n\r\n    for (const boundRef of face.Bounds) {\r\n      const bound = webIfc.GetLine(0, boundRef.value);\r\n      const loop = webIfc.GetLine(0, bound.Bound.value);\r\n\r\n      if (!loop.Polygon) {\r\n        continue;\r\n      }\r\n\r\n      for (const pointRef of loop.Polygon) {\r\n        const point = webIfc.GetLine(0, pointRef.value);\r\n        const coords = point.Coordinates;\r\n        const x = coords[0].value * units;\r\n        const y = coords[1].value * units;\r\n        const z = coords[2].value * units;\r\n        points.push(new THREE.Vector3(x, y, z));\r\n      }\r\n    }\r\n\r\n    if (points.length < 3) {\r\n      return null;\r\n    }\r\n\r\n    // Compute face normal from the first 3 points\r\n    const v1 = new THREE.Vector3().subVectors(points[1], points[0]);\r\n    const v2 = new THREE.Vector3().subVectors(points[2], points[0]);\r\n    const normal = new THREE.Vector3().crossVectors(v1, v2).normalize();\r\n\r\n    // Fan triangulation for a convex planar polygon\r\n    const triangleCount = points.length - 2;\r\n    const position = new Float32Array(points.length * 3);\r\n    const normals = new Float32Array(points.length * 3);\r\n    const index = new Uint32Array(triangleCount * 3);\r\n\r\n    for (let i = 0; i < points.length; i++) {\r\n      position[i * 3] = points[i].x;\r\n      position[i * 3 + 1] = points[i].y;\r\n      position[i * 3 + 2] = points[i].z;\r\n      normals[i * 3] = normal.x;\r\n      normals[i * 3 + 1] = normal.y;\r\n      normals[i * 3 + 2] = normal.z;\r\n    }\r\n\r\n    for (let i = 0; i < triangleCount; i++) {\r\n      index[i * 3] = 0;\r\n      index[i * 3 + 1] = i + 1;\r\n      index[i * 3 + 2] = i + 2;\r\n    }\r\n\r\n    return { position, normals, index };\r\n  }\r\n\r\n  private decompose(transform: THREE.Matrix4) {\r\n    const e = transform.elements;\r\n    const p = 1000;\r\n    const ap = 100000;\r\n    const dxx = GeomsFbUtils.round(e[0], p);\r\n    const dxy = GeomsFbUtils.round(e[1], p);\r\n    const dxz = GeomsFbUtils.round(e[2], p);\r\n    const dyx = GeomsFbUtils.round(e[4], ap);\r\n    const dyy = GeomsFbUtils.round(e[5], ap);\r\n    const dyz = GeomsFbUtils.round(e[6], ap);\r\n    const px = GeomsFbUtils.round(e[12], ap);\r\n    const py = GeomsFbUtils.round(e[13], ap);\r\n    const pz = GeomsFbUtils.round(e[14], ap);\r\n    return { dxx, dxy, dxz, dyx, dyy, dyz, px, py, pz };\r\n  }\r\n}\r\n","import * as WEBIFC from \"web-ifc\";\r\nimport * as THREE from \"three\";\r\nimport { ShellData, ifcCategoryMap, GeomsFbUtils } from \"../../../../Utils\";\r\n\r\nimport * as TFB from \"../../../../Schema\";\r\n\r\nimport { CivilReader } from \"./ifc/civil-reader\";\r\nimport { AlignmentData, GridData } from \"../../../../FragmentsModels\";\r\nimport { IfcImporter } from \"../..\";\r\nimport { ProcessData } from \"../types\";\r\nimport { GridReader } from \"./grid-reader\";\r\nimport { SpaceBoundaryReader } from \"./space-boundary-reader\";\r\n\r\nexport type CircleExtrusionData = {\r\n  type: TFB.RepresentationClass.CIRCLE_EXTRUSION;\r\n  indicesArray: number[];\r\n  typesArray: number[];\r\n  circleCurveData: number[][];\r\n  segments: number[][];\r\n  radius: number;\r\n  bbox: {\r\n    min: { x: number; y: number; z: number };\r\n    max: { x: number; y: number; z: number };\r\n  };\r\n};\r\n\r\nexport type GeometryData = ShellData | CircleExtrusionData;\r\n\r\nexport type IfcLocalTransform = {\r\n  id: number;\r\n  data: number[]; // [px, py, pz, dxx, dxy, dxz, dyx, dyy, dyz]\r\n};\r\n\r\nexport type IfcGeometryInstance = {\r\n  id: number;\r\n  color: number[];\r\n  localTransformID: number | null;\r\n};\r\n\r\nexport type IfcElement = {\r\n  id: number;\r\n  guid: string;\r\n  type: number;\r\n  geometries: IfcGeometryInstance[];\r\n};\r\n\r\nexport type TransformData = {\r\n  dxx: number;\r\n  dxy: number;\r\n  dxz: number;\r\n  dyx: number;\r\n  dyy: number;\r\n  dyz: number;\r\n  px: number;\r\n  py: number;\r\n  pz: number;\r\n};\r\n\r\n// For each item:\r\n// - use the position of the first geometry as the item position\r\n// - for the rest of the geometries:\r\n//   - if the geometry is new, apply a transformation to its vertices so that its local transform is 0\r\n//   - if the geometry was previously found, check the local space to see if it needs a local transform, and return it if so\r\n\r\nexport class IfcFileReader {\r\n  private _ifcAPI: WEBIFC.IfcAPI | null = null;\r\n  wasm = {\r\n    path: \"../../../../node_modules/web-ifc/\",\r\n    absolute: false,\r\n  };\r\n\r\n  webIfcSettings: WEBIFC.LoaderSettings = {};\r\n\r\n  private _tempObject1 = new THREE.Object3D();\r\n  private _tempObject2 = new THREE.Object3D();\r\n  private _tempMatrix1 = new THREE.Matrix4();\r\n\r\n  private _previousGeometries = new Map<string, number>();\r\n  private _previousGeometriesIDs = new Map<number, number>();\r\n  private _previousGeometriesScales = new Map<number, string>();\r\n  private _previousLocalTransforms = new Map<string, IfcLocalTransform>();\r\n\r\n  private _problematicGeometries = new Set<number>();\r\n  private _problematicGeometriesHashes = new Set<string>();\r\n\r\n  private _coordinatesInitialized = false;\r\n\r\n  private _civilReader = new CivilReader();\r\n  private _gridReader = new GridReader();\r\n  private _spaceBoundaryReader = new SpaceBoundaryReader();\r\n\r\n  private _nextId = 0;\r\n\r\n  private _rawCategories = new Set<number>([\r\n    WEBIFC.IFCEARTHWORKSFILL,\r\n    WEBIFC.IFCEARTHWORKSCUT,\r\n  ]);\r\n\r\n  scene: THREE.Scene | null = null;\r\n\r\n  isolatedMeshes: Set<number> | null = null;\r\n\r\n  constructor(private _serializer: IfcImporter) {}\r\n\r\n  onElementLoaded: (data: {\r\n    element: IfcElement;\r\n    position: number[];\r\n    xDirection: number[];\r\n    yDirection: number[];\r\n  }) => void = () => {};\r\n\r\n  onGeometryLoaded: (data: { id: number; geometry: GeometryData }) => void =\r\n    () => {};\r\n\r\n  onLocalTransformLoaded: (localTransform: IfcLocalTransform) => void =\r\n    () => {};\r\n\r\n  onNextIdFound: (maxId: number) => void = () => {};\r\n\r\n  onCoordinatesLoaded: (data: TransformData) => void = () => {};\r\n\r\n  onAlignmentsLoaded: (data: AlignmentData[]) => void = () => {};\r\n\r\n  onGridsLoaded: (data: GridData[]) => void = () => {};\r\n\r\n  async load(data: ProcessData) {\r\n    data.progressCallback?.(0, {\r\n      process: \"conversion\",\r\n      state: \"start\",\r\n    });\r\n\r\n    this._previousGeometriesIDs.clear();\r\n\r\n    this._ifcAPI = new WEBIFC.IfcAPI();\r\n    this._ifcAPI.SetWasmPath(this.wasm.path, this.wasm.absolute);\r\n    await this._ifcAPI.Init();\r\n\r\n    let modelID = 0;\r\n\r\n    if (data.readFromCallback && data.readCallback) {\r\n      modelID = this._ifcAPI.OpenModelFromCallback(\r\n        data.readCallback,\r\n        this.webIfcSettings,\r\n      );\r\n    } else if (data.bytes) {\r\n      modelID = await this._ifcAPI.OpenModel(data.bytes, this.webIfcSettings);\r\n    } else {\r\n      throw new Error(\"Fragments: No data provided\");\r\n    }\r\n\r\n    this._ifcAPI.SetLogLevel(WEBIFC.LogLevel.LOG_LEVEL_OFF);\r\n\r\n    this._nextId = this._ifcAPI.GetMaxExpressID(modelID) + 1;\r\n\r\n    // First local transform is the no-transform\r\n\r\n    // prettier-ignore\r\n    this.onLocalTransformLoaded({\r\n      id: 0,\r\n      data: [0, 0, 0, 1, 0, 0, 0, 1, 0]\r\n    });\r\n\r\n    const tempPosition = new THREE.Vector3();\r\n\r\n    let currentCategory = 0;\r\n\r\n    const callback = (mesh: WEBIFC.FlatMesh) => {\r\n      if (this._ifcAPI === null) {\r\n        throw new Error(\"Fragments: IfcAPI not initialized\");\r\n      }\r\n\r\n      if (!this._coordinatesInitialized) {\r\n        const coordinates = this._ifcAPI.GetCoordinationMatrix(modelID);\r\n        this._tempMatrix1.fromArray(coordinates);\r\n        const coordinatesData = this.decompose(this._tempMatrix1);\r\n        this.onCoordinatesLoaded(coordinatesData);\r\n        this._coordinatesInitialized = true;\r\n      }\r\n\r\n      const properties = this._ifcAPI.GetLine(0, mesh.expressID);\r\n\r\n      const element: IfcElement = {\r\n        id: mesh.expressID,\r\n        type: properties.type,\r\n        guid: properties.GlobalId.value,\r\n        geometries: [],\r\n      };\r\n\r\n      const geometryCount = mesh.geometries.size();\r\n\r\n      // Use the position of the first geometry as the entity position\r\n      const firstGeometryRef = mesh.geometries.get(0);\r\n      const transformArray = firstGeometryRef.flatTransformation;\r\n      const { transformWithoutScale } = this.removeScale(transformArray);\r\n\r\n      // Check that the object is not too far away\r\n      const distanceThreshold = this._serializer.distanceThreshold;\r\n      if (distanceThreshold !== null) {\r\n        tempPosition.set(0, 0, 0);\r\n        tempPosition.applyMatrix4(transformWithoutScale);\r\n        if (\r\n          tempPosition.x > distanceThreshold ||\r\n          tempPosition.y > distanceThreshold ||\r\n          tempPosition.z > distanceThreshold\r\n        ) {\r\n          console.log(\r\n            `Fragments: Object ${element.id} is more than ${distanceThreshold} meters away from the origin and will be skipped.`,\r\n          );\r\n          return;\r\n        }\r\n      }\r\n\r\n      for (let i = 0; i < geometryCount; i++) {\r\n        let geometryMode: \"Shell\" | \"CircleExtrusion\" = \"Shell\";\r\n\r\n        if (element.type === WEBIFC.IFCREINFORCINGBAR) {\r\n          // Rebars can be SweptDiskSolid, FacetedBrep, Tessellated, ...\r\n          // if it doesn't have a directrix, it's not a SweptDiskSolid shape representation\r\n          if (this.hasSweptDiskDirectrix(modelID, mesh, i))\r\n            geometryMode = \"CircleExtrusion\";\r\n        }\r\n        if (geometryMode === \"Shell\") {\r\n          this.loadShellGeometry(\r\n            modelID,\r\n            element,\r\n            mesh,\r\n            i,\r\n            transformWithoutScale.elements,\r\n            currentCategory,\r\n          );\r\n        } else if (geometryMode === \"CircleExtrusion\") {\r\n          this.loadCircleExtrusionGeometry(\r\n            modelID,\r\n            element,\r\n            mesh,\r\n            i,\r\n            transformWithoutScale.elements,\r\n          );\r\n        }\r\n      }\r\n\r\n      const { dxx, dxy, dxz, dyx, dyy, dyz, px, py, pz } = this.decompose(\r\n        transformWithoutScale,\r\n      );\r\n\r\n      if (element.geometries.length > 0) {\r\n        this.onElementLoaded({\r\n          element,\r\n          position: [px, py, pz],\r\n          xDirection: [dxx, dxy, dxz],\r\n          yDirection: [dyx, dyy, dyz],\r\n        });\r\n      }\r\n    };\r\n\r\n    if (this.isolatedMeshes?.size) {\r\n      this._ifcAPI.StreamMeshes(\r\n        modelID,\r\n        Array.from(this.isolatedMeshes),\r\n        callback,\r\n      );\r\n    } else {\r\n      const modelClasses = this._ifcAPI\r\n        .GetAllTypesOfModel(modelID)\r\n        .map((entry) => entry.typeID);\r\n\r\n      const toProcess = modelClasses.filter((type) =>\r\n        this._serializer.classes.elements.has(type),\r\n      );\r\n\r\n      // Force ifc annotations to be processed last because\r\n      // they can cause some problems with coordination matrix\r\n      // e.g. when there is an annotation at the 0,0\r\n      if (toProcess.includes(WEBIFC.IFCANNOTATION)) {\r\n        toProcess.splice(toProcess.indexOf(WEBIFC.IFCANNOTATION), 1);\r\n        toProcess.push(WEBIFC.IFCANNOTATION);\r\n      }\r\n\r\n      const categoryPercentage = 0.5 / toProcess.length;\r\n      for (const [index, category] of toProcess.entries()) {\r\n        currentCategory = category;\r\n        const state = (() => {\r\n          if (index === 0) return \"start\";\r\n          if (index + 1 === toProcess.length) return \"finish\";\r\n          return \"inProgress\";\r\n        })();\r\n        const idsVector = this._ifcAPI.GetLineIDsWithType(modelID, category);\r\n        const ids: number[] = [];\r\n        for (let i = 0; i < idsVector.size(); i++) {\r\n          ids.push(idsVector.get(i));\r\n        }\r\n        if (ids.length > 0) {\r\n          this._ifcAPI.StreamMeshes(modelID, ids, callback);\r\n          data.progressCallback?.(categoryPercentage * (index + 1), {\r\n            process: \"geometries\",\r\n            state,\r\n            class: ifcCategoryMap[category],\r\n            entitiesProcessed: ids.length,\r\n          });\r\n        }\r\n      }\r\n    }\r\n\r\n    const alignments = this._civilReader.read(this._ifcAPI);\r\n    this.onAlignmentsLoaded(alignments);\r\n\r\n    const grids = this._gridReader.read(this._ifcAPI);\r\n    this.onGridsLoaded(grids);\r\n\r\n    if (this._serializer.geometryProcessSettings.processIfcRelSpaceBoundarySecondLevel) {\r\n      this._spaceBoundaryReader.read(\r\n        this._ifcAPI,\r\n        this._serializer,\r\n        (data) => this.onGeometryLoaded(data),\r\n        (data) => this.onElementLoaded(data),\r\n        () => this._nextId++,\r\n      );\r\n    }\r\n\r\n    this.onNextIdFound(this._nextId);\r\n\r\n    this._ifcAPI.Dispose();\r\n    this._ifcAPI = null;\r\n    this._ifcAPI = new WEBIFC.IfcAPI();\r\n    this._ifcAPI.SetWasmPath(this.wasm.path, this.wasm.absolute);\r\n    await this._ifcAPI.Init();\r\n\r\n    this._previousGeometries.clear();\r\n    this._previousGeometriesIDs.clear();\r\n    this._previousGeometriesScales.clear();\r\n    this._nextId = 0;\r\n    this._previousLocalTransforms.clear();\r\n    this._problematicGeometries.clear();\r\n    this._problematicGeometriesHashes.clear();\r\n  }\r\n\r\n  // @ts-ignore\r\n  private loadCircleExtrusionGeometry(\r\n    modelID: number,\r\n    element: IfcElement,\r\n    mesh: WEBIFC.FlatMesh,\r\n    geometryIndex: number,\r\n    elementTransform: number[],\r\n  ) {\r\n    if (this._ifcAPI === null) {\r\n      throw new Error(\"Fragments: IfcAPI not initialized\");\r\n    }\r\n\r\n    const geometryRef = mesh.geometries.get(geometryIndex);\r\n\r\n    // We need to get the units here because each geometry can have different units\r\n    const transformArray = geometryRef.flatTransformation;\r\n    const { units } = this.removeScale(transformArray);\r\n\r\n    const { x, y, z, w } = geometryRef.color;\r\n\r\n    const geometryData: IfcGeometryInstance = {\r\n      id: geometryRef.geometryExpressID,\r\n      color: [x, y, z, w],\r\n      localTransformID: null,\r\n    };\r\n\r\n    element.geometries.push(geometryData);\r\n\r\n    const { transformWithoutScale } = this.removeScale(\r\n      geometryRef.flatTransformation,\r\n    );\r\n\r\n    if (this._previousGeometriesIDs.has(geometryData.id)) {\r\n      // This geometry was already computed according to the IFC\r\n      // Just save its transform and ID and return\r\n\r\n      this.getLocalTransform(\r\n        elementTransform,\r\n        transformWithoutScale,\r\n        geometryData,\r\n      );\r\n\r\n      // We need to recover the ID, in case this geometry was previously deduplicated\r\n      geometryData.id = this._previousGeometriesIDs.get(geometryData.id)!;\r\n      return;\r\n    }\r\n\r\n    this.getLocalTransform(\r\n      elementTransform,\r\n      transformWithoutScale,\r\n      geometryData,\r\n    );\r\n\r\n    const geometry = this._ifcAPI.GetGeometry(modelID, geometryData.id);\r\n\r\n    // @ts-ignore\r\n    const circleExtrusion = geometry.GetSweptDiskSolid();\r\n    const circleCurves: number[][] = [];\r\n    const axisPoints: any[][] = [];\r\n\r\n    // @ts-ignore\r\n    const axisSize = circleExtrusion.axis.size();\r\n\r\n    for (let i = 0; i < axisSize; i++) {\r\n      // @ts-ignore\r\n      const axis = circleExtrusion.axis.get(i);\r\n\r\n      const circleCurveTemp: number[] = [];\r\n      for (let j = 0; j < axis.arcSegments.size(); j++) {\r\n        circleCurveTemp.push(axis.arcSegments.get(j));\r\n      }\r\n      circleCurves.push(circleCurveTemp);\r\n      const axisTemp: any[] = [];\r\n      for (let j = 0; j < axis.points.size(); j++) {\r\n        const p = axis.points.get(j);\r\n        axisTemp.push({ x: p.x * units.x, y: p.y * units.y, z: p.z * units.z });\r\n      }\r\n      axisPoints.push(axisTemp);\r\n    }\r\n\r\n    // Now we create serialized circle curve data\r\n\r\n    const indicesArray: number[] = [];\r\n    const typesArray: number[] = [];\r\n    const segments: number[][] = [];\r\n    const circleCurveData: number[][] = [];\r\n\r\n    for (let i = 0; i < axisPoints.length; i++) {\r\n      const axisPointsList: any[] = axisPoints[i];\r\n      const curves: number[] = circleCurves[i];\r\n      const pointsSize = axisPointsList.length;\r\n      for (let j = 0; j < pointsSize - 1; j++) {\r\n        let startCircleCurve = -1;\r\n        let endCircleCurve = -1;\r\n        for (let k = 0; k < curves.length; k += 2) {\r\n          if (curves[k] === j) {\r\n            startCircleCurve = j;\r\n            endCircleCurve = curves[k + 1];\r\n            break;\r\n          }\r\n        }\r\n        if (startCircleCurve === -1) {\r\n          const newSegment: number[] = [];\r\n          const currentPoint = axisPointsList[j];\r\n          const nextPoint = axisPointsList[j + 1];\r\n          const currentX = currentPoint.x;\r\n          const currentY = currentPoint.y;\r\n          const currentZ = currentPoint.z;\r\n          const nextX = nextPoint.x;\r\n          const nextY = nextPoint.y;\r\n          const nextZ = nextPoint.z;\r\n          indicesArray.push(segments.length);\r\n          newSegment.push(currentX, currentY, currentZ, nextX, nextY, nextZ);\r\n          segments.push(newSegment);\r\n          typesArray.push(TFB.AxisPartClass.WIRE);\r\n        } else {\r\n          const newCircleCurve: number[] = [];\r\n          const firstPointIndex = startCircleCurve;\r\n          const midPointIndex = Math.round(\r\n            (startCircleCurve + endCircleCurve) / 2,\r\n          );\r\n          const lastPointIndex = endCircleCurve;\r\n          const point1 = axisPointsList[firstPointIndex];\r\n          const point2 = axisPointsList[midPointIndex];\r\n          const point3 = axisPointsList[lastPointIndex];\r\n          const circleCurveProperties = this.computeCircleCurveProperties(\r\n            point1,\r\n            point2,\r\n            point3,\r\n          );\r\n          const dx = point1.x - circleCurveProperties.center.x;\r\n          const dy = point1.y - circleCurveProperties.center.y;\r\n          const dz = point1.z - circleCurveProperties.center.z;\r\n          let dd = Math.sqrt(dx * dx + dy * dy + dz * dz);\r\n          if (dd === 0) {\r\n            dd = 1;\r\n          }\r\n          const dx1 = dx / dd;\r\n          const dy1 = dy / dd;\r\n          const dz1 = dz / dd;\r\n          const dxb = point2.x - circleCurveProperties.center.x;\r\n          const dyb = point2.y - circleCurveProperties.center.y;\r\n          const dzb = point2.z - circleCurveProperties.center.z;\r\n          let dd2 = Math.sqrt(dxb * dxb + dyb * dyb + dzb * dzb);\r\n          if (dd2 === 0) {\r\n            dd2 = 1;\r\n          }\r\n          const dx2 = dxb / dd2;\r\n          const dy2 = dyb / dd2;\r\n          const dz2 = dzb / dd2;\r\n          let v3 = this.crossProduct(\r\n            { x: dx1, y: dy1, z: dz1 },\r\n            { x: dx2, y: dy2, z: dz2 },\r\n          );\r\n          dd = Math.sqrt(v3.x * v3.x + v3.y * v3.y + v3.z * v3.z);\r\n          if (dd === 0) {\r\n            dd = 1;\r\n          }\r\n          v3 = { x: v3.x / dd, y: v3.y / dd, z: v3.z / dd };\r\n          indicesArray.push(circleCurveData.length);\r\n          newCircleCurve.push(\r\n            circleCurveProperties.center.x,\r\n            circleCurveProperties.center.y,\r\n            circleCurveProperties.center.z,\r\n            circleCurveProperties.radius,\r\n            circleCurveProperties.angle,\r\n            dx1,\r\n            dy1,\r\n            dz1,\r\n            v3.x,\r\n            v3.y,\r\n            v3.z,\r\n          );\r\n          circleCurveData.push(newCircleCurve);\r\n          typesArray.push(TFB.AxisPartClass.CIRCLE_CURVE);\r\n          j = lastPointIndex - 1;\r\n        }\r\n      }\r\n    }\r\n\r\n    // TODO: Deduplicate the bars with a geometry hash, like with shells\r\n\r\n    const buffers = this.getGeometryBuffers(modelID, geometryRef);\r\n    if (buffers === null) {\r\n      // console.log(`Fragments: Zero length geometry: ${geometryData.id}`);\r\n      element.geometries.pop();\r\n      this._problematicGeometries.add(geometryData.id);\r\n      return;\r\n    }\r\n\r\n    const { position } = buffers;\r\n\r\n    for (let i = 0; i < position.length - 2; i += 3) {\r\n      position[i] *= units.x;\r\n      position[i + 1] *= units.y;\r\n      position[i + 2] *= units.z;\r\n    }\r\n\r\n    const bbox = GeomsFbUtils.getAABB(position);\r\n\r\n    // TODO: This might fail? What units should we use?\r\n    const radius = circleExtrusion.profileRadius * units.x;\r\n\r\n    this._previousGeometriesIDs.set(geometryData.id, geometryData.id);\r\n\r\n    this.onGeometryLoaded({\r\n      id: geometryData.id,\r\n      geometry: {\r\n        type: TFB.RepresentationClass.CIRCLE_EXTRUSION,\r\n        indicesArray,\r\n        typesArray,\r\n        segments,\r\n        circleCurveData,\r\n        radius,\r\n        bbox,\r\n      },\r\n    });\r\n\r\n    geometry.delete();\r\n  }\r\n\r\n  private loadShellGeometry(\r\n    modelID: number,\r\n    element: IfcElement,\r\n    mesh: WEBIFC.FlatMesh,\r\n    geometryIndex: number,\r\n    elementTransform: number[],\r\n    category: number,\r\n  ) {\r\n    if (this._ifcAPI === null) {\r\n      throw new Error(\"Fragments: IfcAPI not initialized\");\r\n    }\r\n\r\n    // First, let's get the geometry data from web-ifc\r\n\r\n    const geometryRef = mesh.geometries.get(geometryIndex);\r\n\r\n    // We need to get the units here because each geometry can have different units\r\n    const transformArray = geometryRef.flatTransformation;\r\n    const { units } = this.removeScale(transformArray);\r\n\r\n    if (this._problematicGeometries.has(geometryRef.geometryExpressID)) {\r\n      console.log(\r\n        `Fragments: Problematic geometry: ${geometryRef.geometryExpressID}`,\r\n      );\r\n      return;\r\n    }\r\n\r\n    const { x, y, z } = geometryRef.color;\r\n    let w = geometryRef.color.w;\r\n\r\n    if (\r\n      this._serializer.geometryProcessSettings.forceTransparentSpaces &&\r\n      category === WEBIFC.IFCSPACE &&\r\n      w === 1\r\n    ) {\r\n      w = 0.5;\r\n    }\r\n\r\n    const geometryData: IfcGeometryInstance = {\r\n      id: geometryRef.geometryExpressID,\r\n      color: [x, y, z, w],\r\n      localTransformID: null,\r\n    };\r\n\r\n    element.geometries.push(geometryData);\r\n\r\n    const { transformWithoutScale } = this.removeScale(\r\n      geometryRef.flatTransformation,\r\n    );\r\n\r\n    if (this._previousGeometriesIDs.has(geometryData.id)) {\r\n      // This geometry was already computed according to the IFC\r\n      // Just save its transform and ID and return\r\n\r\n      // Some files have geometries with different scales\r\n      // Fragments transforms dont have scale, so we have to consider them new geometries\r\n      const scaleHash = this.getScaleHash(units);\r\n      const previousScaleHash = this._previousGeometriesScales.get(\r\n        geometryData.id,\r\n      );\r\n      const sameScale = previousScaleHash === scaleHash;\r\n\r\n      if (sameScale) {\r\n        this.getLocalTransform(\r\n          elementTransform,\r\n          transformWithoutScale,\r\n          geometryData,\r\n        );\r\n\r\n        // We need to recover the ID, in case this geometry was previously deduplicated\r\n        geometryData.id = this._previousGeometriesIDs.get(geometryData.id)!;\r\n        return;\r\n      }\r\n      // This geometry has a different scale, so we need to consider it as a new geometry\r\n      const newId = this._nextId++;\r\n      this._previousGeometriesScales.set(newId, scaleHash);\r\n      geometryData.id = newId;\r\n    }\r\n\r\n    // Now we need to determine if this geometry is duplicated or not\r\n    // To do that, we'll collect the geometry buffers data\r\n\r\n    const buffers = this.getGeometryBuffers(modelID, geometryRef);\r\n    if (buffers === null) {\r\n      // console.log(`Fragments: Zero length geometry: ${geometryData.id}`);\r\n      element.geometries.pop();\r\n      this._problematicGeometries.add(geometryData.id);\r\n      return;\r\n    }\r\n\r\n    const { position, normals, index } = buffers;\r\n\r\n    for (let i = 0; i < position.length - 2; i += 3) {\r\n      position[i] *= units.x;\r\n      position[i + 1] *= units.y;\r\n      position[i + 2] *= units.z;\r\n    }\r\n\r\n    // Determine whether the geometry is duplicated by computing some properties\r\n    // Like areas, volumes, and some vertices\r\n    // We'll just deduplicate exact geometries, without taking transforms into account\r\n\r\n    const vertexCount = position.length / 3;\r\n    const triangleCount = index.length / 3;\r\n\r\n    let biggestArea = 0;\r\n    let areaSum = 0;\r\n\r\n    const triangle = new THREE.Triangle();\r\n\r\n    const v1 = new THREE.Vector3();\r\n    const v2 = new THREE.Vector3();\r\n    const v3 = new THREE.Vector3();\r\n\r\n    // Compute volume, area and biggest/smallest triangles\r\n\r\n    const volume = this.getVolume(index, position);\r\n\r\n    const centroid = new THREE.Vector3();\r\n\r\n    for (let i = 0; i < index.length - 2; i += 3) {\r\n      const i1 = index[i];\r\n      const i2 = index[i + 1];\r\n      const i3 = index[i + 2];\r\n\r\n      v1.set(position[i1 * 3], position[i1 * 3 + 1], position[i1 * 3 + 2]);\r\n      v2.set(position[i2 * 3], position[i2 * 3 + 1], position[i2 * 3 + 2]);\r\n      v3.set(position[i3 * 3], position[i3 * 3 + 1], position[i3 * 3 + 2]);\r\n\r\n      centroid.add(v1);\r\n      centroid.add(v2);\r\n      centroid.add(v3);\r\n\r\n      triangle.set(v1, v2, v3);\r\n      const area = triangle.getArea();\r\n\r\n      if (area > biggestArea) {\r\n        biggestArea = area;\r\n      }\r\n\r\n      areaSum += area;\r\n    }\r\n\r\n    centroid.divideScalar(index.length);\r\n\r\n    v1.set(position[0], position[1], position[2]);\r\n    v2.set(position[3], position[4], position[5]);\r\n    v3.set(position[6], position[7], position[8]);\r\n\r\n    const p = 10000;\r\n    const hashAreaSum = GeomsFbUtils.round(areaSum, p);\r\n    const hashBigArea = GeomsFbUtils.round(biggestArea, p);\r\n    const hashVolume = GeomsFbUtils.round(volume, p);\r\n\r\n    const x1 = GeomsFbUtils.round(v1.x, p);\r\n    const y1 = GeomsFbUtils.round(v1.y, p);\r\n    const z1 = GeomsFbUtils.round(v1.z, p);\r\n\r\n    const cx = GeomsFbUtils.round(centroid.x, p);\r\n    const cy = GeomsFbUtils.round(centroid.y, p);\r\n    const cz = GeomsFbUtils.round(centroid.z, p);\r\n\r\n    const hash = `${vertexCount}-${triangleCount}-${hashAreaSum}-${hashBigArea}-${hashVolume}-${cx}-${cy}-${cz}-${x1}-${y1}-${z1}`;\r\n\r\n    if (this._problematicGeometriesHashes.has(hash)) {\r\n      console.log(`Fragments: Problematic geometry: ${geometryData.id}`);\r\n      element.geometries.pop();\r\n      this._problematicGeometries.add(geometryData.id);\r\n      this._problematicGeometriesHashes.add(hash);\r\n      return;\r\n    }\r\n\r\n    const isNewGeometry = !this._previousGeometries.has(hash);\r\n\r\n    const geomID = geometryData.id;\r\n\r\n    if (isNewGeometry) {\r\n      // New geometry: save its ID for future deduplication\r\n      this._previousGeometries.set(hash, geomID);\r\n      this._previousGeometriesIDs.set(geomID, geomID);\r\n    } else {\r\n      // When deduplicated, just use the previously found geometry id\r\n      const previousGeometryID = this._previousGeometries.get(hash);\r\n      if (previousGeometryID === undefined) {\r\n        throw new Error(\"Fragments: Previous geometry not found\");\r\n      }\r\n\r\n      this._previousGeometriesIDs.set(geomID, previousGeometryID);\r\n      geometryData.id = previousGeometryID;\r\n    }\r\n\r\n    this.getLocalTransform(\r\n      elementTransform,\r\n      transformWithoutScale,\r\n      geometryData,\r\n    );\r\n\r\n    const raw = this._rawCategories.has(element.type);\r\n\r\n    // Only compute geometry data that hasn't been computed before\r\n    if (isNewGeometry) {\r\n      try {\r\n        const geomData = GeomsFbUtils.getShellData({\r\n          position,\r\n          normals,\r\n          index,\r\n          raw,\r\n          settings: this._serializer.geometryProcessSettings,\r\n          category,\r\n        });\r\n        this.onGeometryLoaded({\r\n          id: geometryData.id,\r\n          geometry: geomData,\r\n        });\r\n      } catch (error) {\r\n        console.log(`Fragments: Problematic geometry: ${geometryData.id}`);\r\n        element.geometries.pop();\r\n        this._problematicGeometries.add(geometryData.id);\r\n        this._problematicGeometriesHashes.add(hash);\r\n      }\r\n    }\r\n  }\r\n\r\n  private getScaleHash(units: THREE.Vector3) {\r\n    return `${units.x}-${units.y}-${units.z}`;\r\n  }\r\n\r\n  private getLocalTransform(\r\n    elementTransform: number[],\r\n    transformWithoutScale: THREE.Matrix4,\r\n    geometryData: IfcGeometryInstance,\r\n  ) {\r\n    this._tempObject1.position.set(0, 0, 0);\r\n    this._tempObject1.rotation.set(0, 0, 0);\r\n    this._tempObject1.scale.set(1, 1, 1);\r\n    this._tempObject1.updateMatrix();\r\n    this._tempMatrix1.fromArray(elementTransform);\r\n    this._tempObject1.applyMatrix4(this._tempMatrix1);\r\n\r\n    this._tempObject2.position.set(0, 0, 0);\r\n    this._tempObject2.rotation.set(0, 0, 0);\r\n    this._tempObject2.scale.set(1, 1, 1);\r\n    this._tempObject2.updateMatrix();\r\n    this._tempObject2.applyMatrix4(transformWithoutScale);\r\n\r\n    this._tempObject1.attach(this._tempObject2);\r\n\r\n    const { px, py, pz, dxx, dxy, dxz, dyx, dyy, dyz } = this.decompose(\r\n      this._tempObject2.matrix,\r\n    );\r\n\r\n    this._tempObject2.removeFromParent();\r\n\r\n    // prettier-ignore\r\n    const isOrigin = px === 0 && py === 0 && pz === 0 &&\r\n    dxx === 1 && dxy === 0 && dxz === 0 &&\r\n    dyx === 0 && dyy === 1 && dyz === 0;\r\n\r\n    if (!isOrigin) {\r\n      // Deduplicate local transforms for smaller files\r\n      const hash = `${px}-${py}-${pz}-${dxx}-${dxy}-${dxz}-${dyx}-${dyy}-${dyz}`;\r\n\r\n      const previousLocalTransform = this._previousLocalTransforms.get(hash);\r\n\r\n      if (previousLocalTransform) {\r\n        geometryData.localTransformID = previousLocalTransform.id;\r\n      } else {\r\n        // We add 1 because the local transform 0 is the no-transform\r\n        const id = this._previousLocalTransforms.size + 1;\r\n        const localTransform: IfcLocalTransform = {\r\n          id,\r\n          data: [px, py, pz, dxx, dxy, dxz, dyx, dyy, dyz],\r\n        };\r\n\r\n        this._previousLocalTransforms.set(hash, localTransform);\r\n        geometryData.localTransformID = localTransform.id;\r\n\r\n        this.onLocalTransformLoaded(localTransform);\r\n      }\r\n    }\r\n  }\r\n\r\n  private removeScale(elements: number[]) {\r\n    const matrix = new THREE.Matrix4().fromArray(elements);\r\n    const position = new THREE.Vector3();\r\n    const quaternion = new THREE.Quaternion();\r\n    const scale = new THREE.Vector3();\r\n    matrix.decompose(position, quaternion, scale);\r\n\r\n    // To convert models to meters\r\n\r\n    const units = scale;\r\n\r\n    const transformWithoutScale = new THREE.Matrix4();\r\n    transformWithoutScale.compose(\r\n      position,\r\n      quaternion,\r\n      new THREE.Vector3(1, 1, 1),\r\n    );\r\n\r\n    return { units, transformWithoutScale };\r\n  }\r\n\r\n  private decompose(transform: THREE.Matrix4) {\r\n    const p = 1000;\r\n    const ap = 100000;\r\n    const dxx = GeomsFbUtils.round(transform.elements[0], p);\r\n    const dxy = GeomsFbUtils.round(transform.elements[1], p);\r\n    const dxz = GeomsFbUtils.round(transform.elements[2], p);\r\n    const dyx = GeomsFbUtils.round(transform.elements[4], ap);\r\n    const dyy = GeomsFbUtils.round(transform.elements[5], ap);\r\n    const dyz = GeomsFbUtils.round(transform.elements[6], ap);\r\n    const dzx = GeomsFbUtils.round(transform.elements[8], ap);\r\n    const dzy = GeomsFbUtils.round(transform.elements[9], ap);\r\n    const dzz = GeomsFbUtils.round(transform.elements[10], ap);\r\n    const px = GeomsFbUtils.round(transform.elements[12], ap);\r\n    const py = GeomsFbUtils.round(transform.elements[13], ap);\r\n    const pz = GeomsFbUtils.round(transform.elements[14], ap);\r\n    return { dxx, dxy, dxz, dyx, dyy, dyz, dzx, dzy, dzz, px, py, pz };\r\n  }\r\n\r\n  // https://stackoverflow.com/a/1568551\r\n  private getVolume(index: Uint32Array, pos: Float32Array) {\r\n    let volume = 0;\r\n    const p1 = new THREE.Vector3();\r\n    const p2 = new THREE.Vector3();\r\n    const p3 = new THREE.Vector3();\r\n\r\n    for (let i = 0; i < index.length - 2; i += 3) {\r\n      const i1 = index[i] * 3;\r\n      const i2 = index[i + 1] * 3;\r\n      const i3 = index[i + 2] * 3;\r\n      p1.set(pos[i1], pos[i1 + 1], pos[i1 + 2]);\r\n      p2.set(pos[i2], pos[i2 + 1], pos[i2 + 2]);\r\n      p3.set(pos[i3], pos[i3 + 1], pos[i3 + 2]);\r\n      volume += this.getSignedVolumeOfTriangle(p1, p2, p3);\r\n    }\r\n\r\n    return Math.abs(volume);\r\n  }\r\n\r\n  private getSignedVolumeOfTriangle(\r\n    p1: THREE.Vector3,\r\n    p2: THREE.Vector3,\r\n    p3: THREE.Vector3,\r\n  ) {\r\n    const v321 = p3.x * p2.y * p1.z;\r\n    const v231 = p2.x * p3.y * p1.z;\r\n    const v312 = p3.x * p1.y * p2.z;\r\n    const v132 = p1.x * p3.y * p2.z;\r\n    const v213 = p2.x * p1.y * p3.z;\r\n    const v123 = p1.x * p2.y * p3.z;\r\n    return (1.0 / 6.0) * (-v321 + v231 + v312 - v132 - v213 + v123);\r\n  }\r\n\r\n  private getGeometryBuffers(\r\n    modelID: number,\r\n    geometryRef: WEBIFC.PlacedGeometry,\r\n  ) {\r\n    if (!this._ifcAPI) {\r\n      throw new Error(\"Fragments: IfcAPI not initialized\");\r\n    }\r\n\r\n    const geometry = this._ifcAPI.GetGeometry(\r\n      modelID,\r\n      geometryRef.geometryExpressID,\r\n    );\r\n\r\n    const index = this._ifcAPI.GetIndexArray(\r\n      geometry.GetIndexData(),\r\n      geometry.GetIndexDataSize(),\r\n    ) as Uint32Array;\r\n\r\n    const vertexData = this._ifcAPI.GetVertexArray(\r\n      geometry.GetVertexData(),\r\n      geometry.GetVertexDataSize(),\r\n    ) as Float32Array;\r\n\r\n    if (index.length === 0 || vertexData.length === 0) {\r\n      geometry.delete();\r\n      return null;\r\n    }\r\n\r\n    const position = new Float32Array(vertexData.length / 2);\r\n    const normals = new Float32Array(vertexData.length / 2);\r\n\r\n    for (let i = 0; i < vertexData.length; i += 6) {\r\n      position[i / 2] = vertexData[i];\r\n      position[i / 2 + 1] = vertexData[i + 1];\r\n      position[i / 2 + 2] = vertexData[i + 2];\r\n\r\n      normals[i / 2] = vertexData[i + 3];\r\n      normals[i / 2 + 1] = vertexData[i + 4];\r\n      normals[i / 2 + 2] = vertexData[i + 5];\r\n    }\r\n\r\n    geometry.delete();\r\n\r\n    return { position, normals, index };\r\n  }\r\n\r\n  // private exportGeometry(\r\n  //   position: Float32Array,\r\n  //   normals: Float32Array,\r\n  //   index: Uint32Array,\r\n  // ) {\r\n  //   // Create Three.js geometry and mesh\r\n  //   const geometry = new THREE.BufferGeometry();\r\n  //   geometry.setAttribute(\"position\", new THREE.BufferAttribute(position, 3));\r\n  //   geometry.setAttribute(\"normal\", new THREE.BufferAttribute(normals, 3));\r\n  //   geometry.setIndex(new THREE.BufferAttribute(index, 1));\r\n\r\n  //   const material = new THREE.MeshStandardMaterial();\r\n  //   const mesh = new THREE.Mesh(geometry, material);\r\n\r\n  //   // Export to GLTF\r\n  //   const exporter = new GLTFExporter();\r\n  //   exporter.parse(\r\n  //     mesh,\r\n  //     (gltf) => {\r\n  //       const output = JSON.stringify(gltf, null, 2);\r\n  //       const blob = new Blob([output], { type: \"application/json\" });\r\n  //       const url = URL.createObjectURL(blob);\r\n\r\n  //       // Create download link\r\n  //       const link = document.createElement(\"a\");\r\n  //       link.href = url;\r\n  //       link.download = `geometry.gltf`;\r\n  //       link.click();\r\n\r\n  //       URL.revokeObjectURL(url);\r\n  //     },\r\n  //     { binary: false },\r\n  //   );\r\n  // }\r\n\r\n  // Function to compute cross product\r\n  private crossProduct(v1: any, v2: any): any {\r\n    return {\r\n      x: v1.y * v2.z - v1.z * v2.y,\r\n      y: v1.z * v2.x - v1.x * v2.z,\r\n      z: v1.x * v2.y - v1.y * v2.x,\r\n    };\r\n  }\r\n\r\n  private computeCircleCurveProperties(point1: any, point2: any, point3: any) {\r\n    function computeCircleCenter(point1: any, point2: any, point3: any): any {\r\n      // Compute D21 = P2 - P1\r\n      const D21x = point2.x - point1.x;\r\n      const D21y = point2.y - point1.y;\r\n      const D21z = point2.z - point1.z;\r\n\r\n      // Compute D31 = P3 - P1\r\n      const D31x = point3.x - point1.x;\r\n      const D31y = point3.y - point1.y;\r\n      const D31z = point3.z - point1.z;\r\n\r\n      // Compute F2 and F3\r\n      const F2 = 0.5 * (D21x ** 2 + D21y ** 2 + D21z ** 2);\r\n      const F3 = 0.5 * (D31x ** 2 + D31y ** 2 + D31z ** 2);\r\n\r\n      // Compute cross products M23xy, M23yz, M23xz\r\n      const M23xy = D21x * D31y - D21y * D31x;\r\n      const M23yz = D21y * D31z - D21z * D31y;\r\n      const M23xz = D21z * D31x - D21x * D31z;\r\n\r\n      // Compute F23 components\r\n      const F23x = F2 * D31x - F3 * D21x;\r\n      const F23y = F2 * D31y - F3 * D21y;\r\n      const F23z = F2 * D31z - F3 * D21z;\r\n\r\n      // Compute denominator (magnitude squared of M23 vector)\r\n      const m23magsq = M23xy ** 2 + M23yz ** 2 + M23xz ** 2;\r\n\r\n      if (m23magsq === 0) {\r\n        throw new Error(\r\n          \"Fragments: Points are collinear, no unique circle exists.\",\r\n        );\r\n      }\r\n\r\n      // Compute the center (Cx, Cy, Cz)\r\n      const Cx = point1.x + (M23xy * F23y - M23xz * F23z) / m23magsq;\r\n      const Cy = point1.y + (M23yz * F23z - M23xy * F23x) / m23magsq;\r\n      const Cz = point1.z + (M23xz * F23x - M23yz * F23y) / m23magsq;\r\n\r\n      return { x: Cx, y: Cy, z: Cz };\r\n    }\r\n\r\n    // Function to compute vector subtraction\r\n    function subtract(p1: any, p2: any): any {\r\n      return { x: p1.x - p2.x, y: p1.y - p2.y, z: p1.z - p2.z };\r\n    }\r\n\r\n    // Function to compute vector length\r\n    function length(v: any): number {\r\n      return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z);\r\n    }\r\n\r\n    // Direction vectors of the segments\r\n    const dirAB = subtract(point2, point1);\r\n    const dirBC = subtract(point3, point2);\r\n\r\n    // Normal to the plane\r\n    const normal = this.crossProduct(dirAB, dirBC);\r\n    const center = computeCircleCenter(point1, point2, point3);\r\n\r\n    const dirAcen = subtract(point1, center);\r\n    const dirBcen = subtract(point3, center);\r\n\r\n    // Compute radius\r\n    const radius = length(subtract(center, point1));\r\n\r\n    // Compute initial tangent (direction from center to first point)\r\n    const initialTangent = subtract(point1, center);\r\n    const tangentMagnitude = length(initialTangent);\r\n    initialTangent.x /= tangentMagnitude;\r\n    initialTangent.y /= tangentMagnitude;\r\n    initialTangent.z /= tangentMagnitude;\r\n\r\n    // Compute angle subtended by circle curve\r\n    const angle = Math.acos(\r\n      (dirAcen.x * dirBcen.x + dirAcen.y * dirBcen.y + dirAcen.z * dirBcen.z) /\r\n        (length(dirAcen) * length(dirBcen)),\r\n    );\r\n\r\n    return {\r\n      center,\r\n      radius,\r\n      normal,\r\n      initialTangent,\r\n      angle: (angle * 180) / Math.PI, // Convert to degrees\r\n    };\r\n  }\r\n\r\n  private hasSweptDiskDirectrix(\r\n    modelID: number,\r\n    mesh: any,\r\n    geometryIndex: number,\r\n  ): boolean {\r\n    try {\r\n      if (!this._ifcAPI) return false;\r\n\r\n      const geometryRef = mesh.geometries.get(geometryIndex);\r\n      if (!geometryRef) return false;\r\n\r\n      const geometry = this._ifcAPI.GetGeometry(\r\n        modelID,\r\n        geometryRef.geometryExpressID,\r\n      );\r\n\r\n      if (!geometry?.GetSweptDiskSolid) return false;\r\n\r\n      const swept = geometry.GetSweptDiskSolid();\r\n      // @ts-ignore\r\n      return !!swept?.axis && swept.axis.size() > 0;\r\n    } catch {\r\n      return false;\r\n    }\r\n  }\r\n}\r\n","import * as FB from \"flatbuffers\";\r\nimport * as THREE from \"three\";\r\nimport * as WEBIFC from \"web-ifc\";\r\nimport * as TFB from \"../../../../Schema\";\r\nimport {\r\n  GeometryData,\r\n  IfcElement,\r\n  IfcFileReader,\r\n  IfcLocalTransform,\r\n  TransformData,\r\n} from \"./ifc-file-reader\";\r\nimport { ifcCategoryMap } from \"../../../../Utils\";\r\nimport { AlignmentData, GridData } from \"../../../../FragmentsModels\";\r\nimport { IfcImporter } from \"../..\";\r\nimport { ProcessData } from \"../types\";\r\nimport { GeomsFbUtils } from \"../../../../Utils/shells\";\r\n\r\ninterface GeometriesProcessData extends ProcessData {\r\n  builder: FB.Builder;\r\n}\r\n\r\nexport class IfcGeometryProcessor {\r\n  wasm = {\r\n    path: \"../../../../node_modules/web-ifc/\",\r\n    absolute: false,\r\n  };\r\n\r\n  webIfcSettings: WEBIFC.LoaderSettings = {};\r\n\r\n  private _serializer: IfcImporter;\r\n\r\n  constructor(_serializer: IfcImporter) {\r\n    this._serializer = _serializer;\r\n  }\r\n\r\n  async process(data: GeometriesProcessData) {\r\n    const { builder } = data;\r\n\r\n    let nextId = 0;\r\n\r\n    const localIDs: number[] = [];\r\n\r\n    // prettier-ignore\r\n    let coordinates: TransformData = {\r\n      dxx: 1, dxy: 0, dxz: 0,\r\n      dyx: 0, dyy: 1, dyz: 0,\r\n      px: 0, py: 0, pz: 0,\r\n    };\r\n\r\n    const geometries: {\r\n      geometry: GeometryData;\r\n      id: number;\r\n    }[] = [];\r\n\r\n    const alignments: AlignmentData[] = [];\r\n    const grids: GridData[] = [];\r\n\r\n    const items: {\r\n      element: IfcElement;\r\n      position: number[];\r\n      xDirection: number[];\r\n      yDirection: number[];\r\n    }[] = [];\r\n\r\n    const localTransforms: IfcLocalTransform[] = [];\r\n\r\n    const itemIDMap = new Map<number, number>();\r\n    const geometryIDMap = new Map<number, number>();\r\n    const materialIDMap = new Map<string, { id: number; color: number[] }>();\r\n\r\n    const reader = new IfcFileReader(this._serializer);\r\n    reader.wasm = this.wasm;\r\n    reader.webIfcSettings = this.webIfcSettings;\r\n\r\n    // reader.isolatedMeshes = new Set([22835]);\r\n\r\n    reader.onGeometryLoaded = (geometry) => {\r\n      geometries.push(geometry);\r\n    };\r\n\r\n    reader.onElementLoaded = (element) => {\r\n      items.push(element);\r\n    };\r\n\r\n    reader.onLocalTransformLoaded = (localTransform) => {\r\n      localTransforms.push(localTransform);\r\n    };\r\n\r\n    reader.onCoordinatesLoaded = (coords) => {\r\n      coordinates = coords;\r\n    };\r\n\r\n    reader.onNextIdFound = (foundNextId) => {\r\n      nextId = foundNextId;\r\n    };\r\n\r\n    reader.onAlignmentsLoaded = (data) => {\r\n      for (const alignment of data) {\r\n        alignments.push(alignment);\r\n      }\r\n    };\r\n\r\n    reader.onGridsLoaded = (data: GridData[]) => {\r\n      for (const grid of data) {\r\n        grids.push(grid);\r\n      }\r\n    };\r\n\r\n    await reader.load(data);\r\n\r\n    // Create geometry\r\n\r\n    const geometriesItems: number[] = [];\r\n    let itemCounter = 0;\r\n\r\n    TFB.Meshes.startGlobalTransformsVector(builder, items.length);\r\n\r\n    const gtLocalIds: number[] = [];\r\n\r\n    const itemCategories = new Map<string, number>();\r\n    const categoriesIds: number[] = [];\r\n    const localIds: number[] = [];\r\n\r\n    for (let i = 0; i < items.length; i++) {\r\n      const currentItem = items[items.length - 1 - i];\r\n\r\n      geometriesItems.push(itemCounter++);\r\n\r\n      const { position, xDirection, yDirection } = currentItem;\r\n      const [px, py, pz] = position;\r\n      const [dxx, dxy, dxz] = xDirection;\r\n      const [dyx, dyy, dyz] = yDirection;\r\n\r\n      localIDs.push(items[i].element.id);\r\n\r\n      const itemIndex = items.length - 1 - i;\r\n\r\n      const categoryId = currentItem.element.type;\r\n\r\n      const category = ifcCategoryMap[categoryId];\r\n      if (!itemCategories.has(category)) {\r\n        itemCategories.set(category, itemCategories.size);\r\n      }\r\n\r\n      gtLocalIds.unshift(nextId++);\r\n\r\n      // prettier-ignore\r\n      TFB.Transform.createTransform(\r\n        builder,\r\n        px, py, pz,\r\n        dxx,dxy,dxz,\r\n        dyx,dyy,dyz\r\n      );\r\n\r\n      const categoryIndex = itemCategories.get(category)!;\r\n      categoriesIds.unshift(categoryIndex);\r\n      localIds.unshift(currentItem.element.id);\r\n      itemIDMap.set(currentItem.element.id, itemIndex);\r\n    }\r\n\r\n    const globalTransforms = builder.endVector();\r\n\r\n    // Create Shells\r\n\r\n    const shellsOffsets: number[] = [];\r\n\r\n    for (let g = 0; g < geometries.length; g++) {\r\n      const geometryData = geometries[g];\r\n\r\n      if (geometryData.geometry.type !== TFB.RepresentationClass.SHELL) {\r\n        continue;\r\n      }\r\n\r\n      const { points, profiles, holes, profilesFaceIds } =\r\n        geometryData.geometry;\r\n\r\n      const isBigShell = points.length > GeomsFbUtils.ushortMaxValue;\r\n\r\n      const shellType = isBigShell ? TFB.ShellType.BIG : TFB.ShellType.NONE;\r\n\r\n      TFB.Shell.startPointsVector(builder, points.length);\r\n      for (let i = 0; i < points.length; i++) {\r\n        const [x, y, z] = points[points.length - 1 - i];\r\n        TFB.FloatVector.createFloatVector(builder, x, y, z);\r\n      }\r\n      const pointsOffset = builder.endVector();\r\n\r\n      const profilesOffsets: number[] = [];\r\n      const holesOffsets: number[] = [];\r\n      const bigProfilesOffsets: number[] = [];\r\n      const bigHolesOffsets: number[] = [];\r\n\r\n      for (const [, indices] of profiles) {\r\n        if (isBigShell) {\r\n          const indicesOffset = TFB.BigShellProfile.createIndicesVector(\r\n            builder,\r\n            indices,\r\n          );\r\n          const bigProfileOffset = TFB.BigShellProfile.createBigShellProfile(\r\n            builder,\r\n            indicesOffset,\r\n          );\r\n          bigProfilesOffsets.push(bigProfileOffset);\r\n          continue;\r\n        }\r\n\r\n        const indicesOffset = TFB.ShellProfile.createIndicesVector(\r\n          builder,\r\n          indices,\r\n        );\r\n        const profileOffset = TFB.ShellProfile.createShellProfile(\r\n          builder,\r\n          indicesOffset,\r\n        );\r\n        profilesOffsets.push(profileOffset);\r\n      }\r\n\r\n      const bigShellProfilesOffset = TFB.Shell.createBigProfilesVector(\r\n        builder,\r\n        bigProfilesOffsets,\r\n      );\r\n\r\n      const shellProfilesOffset = TFB.Shell.createProfilesVector(\r\n        builder,\r\n        profilesOffsets,\r\n      );\r\n\r\n      for (const [holeId, indicesSets] of holes) {\r\n        if (isBigShell) {\r\n          for (const indices of indicesSets) {\r\n            const indicesOffset = TFB.BigShellHole.createIndicesVector(\r\n              builder,\r\n              indices,\r\n            );\r\n\r\n            const holeOffset = TFB.BigShellHole.createBigShellHole(\r\n              builder,\r\n              indicesOffset,\r\n              holeId,\r\n            );\r\n\r\n            bigHolesOffsets.push(holeOffset); // Flattening the structure\r\n          }\r\n          continue;\r\n        }\r\n\r\n        for (const indices of indicesSets) {\r\n          const indicesOffset = TFB.ShellHole.createIndicesVector(\r\n            builder,\r\n            indices,\r\n          );\r\n\r\n          const holeOffset = TFB.ShellHole.createShellHole(\r\n            builder,\r\n            indicesOffset,\r\n            holeId,\r\n          );\r\n\r\n          holesOffsets.push(holeOffset); // Flattening the structure\r\n        }\r\n      }\r\n\r\n      const bigShellHolesOffset = TFB.Shell.createBigHolesVector(\r\n        builder,\r\n        bigHolesOffsets,\r\n      );\r\n\r\n      const shellHolesOffset = TFB.Shell.createHolesVector(\r\n        builder,\r\n        holesOffsets,\r\n      );\r\n\r\n      const shellFaceIdsOffset = TFB.Shell.createProfilesFaceIdsVector(\r\n        builder,\r\n        profilesFaceIds,\r\n      );\r\n\r\n      const shellOffset = TFB.Shell.createShell(\r\n        builder,\r\n        shellProfilesOffset,\r\n        shellHolesOffset,\r\n        pointsOffset,\r\n        bigShellProfilesOffset,\r\n        bigShellHolesOffset,\r\n        shellType,\r\n        shellFaceIdsOffset,\r\n      );\r\n\r\n      shellsOffsets.push(shellOffset);\r\n    }\r\n\r\n    const shells = TFB.Meshes.createShellsVector(builder, shellsOffsets);\r\n\r\n    // Create circle extrusions\r\n\r\n    const circleExtrusionsOffsets: number[] = [];\r\n\r\n    for (let g = 0; g < geometries.length; g++) {\r\n      const geometryData = geometries[g];\r\n\r\n      if (\r\n        geometryData.geometry.type !== TFB.RepresentationClass.CIRCLE_EXTRUSION\r\n      ) {\r\n        continue;\r\n      }\r\n\r\n      const axisOffsets: number[] = [];\r\n      const { radius, indicesArray, typesArray, segments, circleCurveData } =\r\n        geometryData.geometry;\r\n\r\n      TFB.Axis.startCircleCurvesVector(builder, circleCurveData.length);\r\n      for (let i = 0; i < circleCurveData.length; i++) {\r\n        const [x1, y1, z1, radius, angle, dx1, dy1, dz1, dx3, dy3, dz3] =\r\n          circleCurveData[i];\r\n\r\n        TFB.CircleCurve.createCircleCurve(\r\n          builder,\r\n          (angle / 360) * 2 * Math.PI,\r\n          x1,\r\n          y1,\r\n          z1,\r\n          radius,\r\n          dx3,\r\n          dy3,\r\n          dz3,\r\n          dx1,\r\n          dy1,\r\n          dz1,\r\n        );\r\n      }\r\n\r\n      const circleCurvesOffset = builder.endVector();\r\n\r\n      TFB.Axis.startWiresVector(builder, segments.length);\r\n\r\n      for (let i = 0; i < segments.length; i++) {\r\n        const [x1, y1, z1, x2, y2, z2] = segments[i];\r\n        TFB.Wire.createWire(builder, x1, y1, z1, x2, y2, z2);\r\n      }\r\n\r\n      const wiresOffset = builder.endVector();\r\n\r\n      const ordersOffset = TFB.Axis.createOrderVector(builder, indicesArray);\r\n      const axisPartsOffset = TFB.Axis.createPartsVector(builder, typesArray);\r\n\r\n      TFB.Axis.startWireSetsVector(builder, 0);\r\n      const wireSetOffset = builder.endVector();\r\n\r\n      TFB.Axis.startAxis(builder);\r\n      TFB.Axis.addCircleCurves(builder, circleCurvesOffset);\r\n      TFB.Axis.addOrder(builder, ordersOffset);\r\n      TFB.Axis.addWires(builder, wiresOffset);\r\n      TFB.Axis.addWireSets(builder, wireSetOffset);\r\n      TFB.Axis.addParts(builder, axisPartsOffset);\r\n      const axisOffset = TFB.Axis.endAxis(builder);\r\n      axisOffsets.push(axisOffset);\r\n\r\n      const axisVectorOffset = TFB.CircleExtrusion.createAxesVector(\r\n        builder,\r\n        axisOffsets,\r\n      );\r\n\r\n      const radiusOffset = TFB.CircleExtrusion.createRadiusVector(builder, [\r\n        radius,\r\n      ]);\r\n\r\n      TFB.CircleExtrusion.startCircleExtrusion(builder);\r\n      TFB.CircleExtrusion.addAxes(builder, axisVectorOffset);\r\n      TFB.CircleExtrusion.addRadius(builder, radiusOffset);\r\n      const ceOffset = TFB.CircleExtrusion.endCircleExtrusion(builder);\r\n\r\n      circleExtrusionsOffsets.push(ceOffset);\r\n    }\r\n\r\n    const circleExtrusions = TFB.Meshes.createCircleExtrusionsVector(\r\n      builder,\r\n      circleExtrusionsOffsets,\r\n    );\r\n\r\n    // Create representations\r\n\r\n    const representationsLocalIds: number[] = [];\r\n\r\n    TFB.Meshes.startRepresentationsVector(builder, geometries.length);\r\n\r\n    const geometryClassesCounter = new Map<number, number>();\r\n\r\n    for (let g = 0; g < geometries.length; g++) {\r\n      const index = geometries.length - 1 - g;\r\n      const currentGeometry = geometries[index];\r\n      const geometryClass = currentGeometry.geometry.type;\r\n\r\n      let previousCount = geometryClassesCounter.get(geometryClass);\r\n      if (previousCount === undefined) {\r\n        previousCount = -1;\r\n      }\r\n      geometryClassesCounter.set(geometryClass, previousCount + 1);\r\n    }\r\n\r\n    const tempMin = new THREE.Vector3();\r\n    const tempMax = new THREE.Vector3();\r\n\r\n    for (let g = 0; g < geometries.length; g++) {\r\n      const index = geometries.length - 1 - g;\r\n      const currentGeometry = geometries[index];\r\n      const { bbox } = currentGeometry.geometry;\r\n      geometryIDMap.set(currentGeometry.id, index);\r\n\r\n      const geometryClass = currentGeometry.geometry.type;\r\n      const geomIndex = geometryClassesCounter.get(geometryClass);\r\n      if (geomIndex === undefined) {\r\n        throw new Error(\"Fragments: Malformed geometry definition\");\r\n      }\r\n      geometryClassesCounter.set(geometryClass, geomIndex - 1);\r\n\r\n      tempMin.set(bbox.min.x, bbox.min.y, bbox.min.z);\r\n      tempMax.set(bbox.max.x, bbox.max.y, bbox.max.z);\r\n      const distance = tempMin.distanceTo(tempMax);\r\n\r\n      // 1000 kilometers as max bounding box\r\n      if (distance > 999999) {\r\n        console.log(`Infinity bounding box: ${currentGeometry.id}`);\r\n        bbox.min.x = 0;\r\n        bbox.min.y = 0;\r\n        bbox.min.z = 0;\r\n        bbox.max.x = 0.1;\r\n        bbox.max.y = 0.1;\r\n        bbox.max.z = 0.1;\r\n      }\r\n\r\n      representationsLocalIds.unshift(nextId++);\r\n\r\n      // prettier-ignore\r\n      TFB.Representation.createRepresentation(\r\n        builder,\r\n        geomIndex, \r\n        bbox.min.x, bbox.min.y, bbox.min.z,\r\n        bbox.max.x, bbox.max.y, bbox.max.z,  \r\n        currentGeometry.geometry.type,\r\n      );\r\n    }\r\n\r\n    const representationsOffsets = builder.endVector();\r\n\r\n    let materialCounter = 0;\r\n    for (const item of items) {\r\n      for (const geometry of item.element.geometries) {\r\n        const colorID = geometry.color.toString();\r\n        if (!materialIDMap.has(colorID)) {\r\n          const color = geometry.color.map((n) => n * 255);\r\n          materialIDMap.set(colorID, { id: materialCounter++, color });\r\n        }\r\n      }\r\n    }\r\n\r\n    TFB.Meshes.startMaterialsVector(builder, materialIDMap.size);\r\n\r\n    const materialsLocalIds: number[] = [];\r\n\r\n    const materialMapKeys = Array.from(materialIDMap.keys());\r\n\r\n    for (let i = 0; i < materialMapKeys.length; i++) {\r\n      const key = materialMapKeys[materialMapKeys.length - 1 - i];\r\n      const { color } = materialIDMap.get(key)!;\r\n      const [r, g, b, a] = color;\r\n\r\n      materialsLocalIds.push(nextId++);\r\n\r\n      TFB.Material.createMaterial(\r\n        builder,\r\n        r,\r\n        g,\r\n        b,\r\n        a,\r\n        TFB.RenderedFaces.ONE,\r\n        0,\r\n      );\r\n    }\r\n\r\n    const materials = builder.endVector();\r\n\r\n    let sampleCount = 0;\r\n    for (const item of items) {\r\n      sampleCount += item.element.geometries.length;\r\n    }\r\n\r\n    TFB.Meshes.startSamplesVector(builder, sampleCount);\r\n\r\n    const samplesLocalIds: number[] = [];\r\n\r\n    for (let g = 0; g < items.length; g++) {\r\n      const currentItem = items[items.length - 1 - g];\r\n\r\n      const itemID = itemIDMap.get(currentItem.element.id)!;\r\n\r\n      const geoms = currentItem.element.geometries;\r\n      for (let i = 0; i < geoms.length; i++) {\r\n        const geometry = geoms[geoms.length - i - 1];\r\n        const geometryID = geometryIDMap.get(geometry.id)!;\r\n        const materialID = materialIDMap.get(geometry.color.toString())!.id;\r\n        const transformID = geometry.localTransformID || 0;\r\n\r\n        samplesLocalIds.push(nextId++);\r\n\r\n        TFB.Sample.createSample(\r\n          builder,\r\n          itemID,\r\n          materialID,\r\n          geometryID,\r\n          transformID,\r\n        );\r\n      }\r\n    }\r\n\r\n    const samplesOffset = builder.endVector();\r\n\r\n    TFB.Meshes.startLocalTransformsVector(builder, localTransforms.length);\r\n\r\n    const localTransformsLocalIds: number[] = [];\r\n\r\n    for (let i = 0; i < localTransforms.length; i++) {\r\n      const transform = localTransforms[localTransforms.length - 1 - i];\r\n      const [ox, oy, oz, x1, x2, x3, y1, y2, y3] = transform.data;\r\n\r\n      localTransformsLocalIds.push(nextId++);\r\n\r\n      // prettier-ignore\r\n      TFB.Transform.createTransform(\r\n        builder,\r\n        ox,oy,oz,\r\n        x1,x2,x3,\r\n        y1,y2,y3\r\n      );\r\n    }\r\n\r\n    const localTransformRef = builder.endVector();\r\n\r\n    const meshesItemsOffset = TFB.Meshes.createMeshesItemsVector(\r\n      builder,\r\n      geometriesItems,\r\n    );\r\n\r\n    const reprLocalIdsOffset = TFB.Meshes.createRepresentationIdsVector(\r\n      builder,\r\n      representationsLocalIds,\r\n    );\r\n\r\n    const sampleLocalIdsOffset = TFB.Meshes.createSampleIdsVector(\r\n      builder,\r\n      samplesLocalIds,\r\n    );\r\n\r\n    const materialLocalIdsOffset = TFB.Meshes.createMaterialIdsVector(\r\n      builder,\r\n      materialsLocalIds,\r\n    );\r\n\r\n    const ltLocalIdsOffset = TFB.Meshes.createLocalTransformIdsVector(\r\n      builder,\r\n      localTransformsLocalIds,\r\n    );\r\n\r\n    const gtLocalIdsOffset = TFB.Meshes.createGlobalTransformIdsVector(\r\n      builder,\r\n      gtLocalIds,\r\n    );\r\n\r\n    // prettier-ignore\r\n    const coordinatesOffset = TFB.Transform.createTransform(builder,\r\n      coordinates.px, coordinates.py, coordinates.pz, \r\n      coordinates.dxx, coordinates.dxy, coordinates.dxz, \r\n      coordinates.dyx, coordinates.dyy, coordinates.dyz);\r\n\r\n    TFB.Meshes.startMeshes(builder);\r\n    TFB.Meshes.addCoordinates(builder, coordinatesOffset);\r\n    TFB.Meshes.addGlobalTransforms(builder, globalTransforms);\r\n    TFB.Meshes.addShells(builder, shells);\r\n    TFB.Meshes.addRepresentations(builder, representationsOffsets);\r\n    TFB.Meshes.addSamples(builder, samplesOffset);\r\n    TFB.Meshes.addLocalTransforms(builder, localTransformRef);\r\n    TFB.Meshes.addMaterials(builder, materials);\r\n    TFB.Meshes.addCircleExtrusions(builder, circleExtrusions);\r\n    TFB.Meshes.addMeshesItems(builder, meshesItemsOffset);\r\n    TFB.Meshes.addRepresentationIds(builder, reprLocalIdsOffset);\r\n    TFB.Meshes.addSampleIds(builder, sampleLocalIdsOffset);\r\n    TFB.Meshes.addMaterialIds(builder, materialLocalIdsOffset);\r\n    TFB.Meshes.addLocalTransformIds(builder, ltLocalIdsOffset);\r\n    TFB.Meshes.addGlobalTransformIds(builder, gtLocalIdsOffset);\r\n    const modelMesh = TFB.Meshes.endMeshes(builder);\r\n\r\n    // GEOMETRY\r\n\r\n    // For now we are just saving alignments as lines\r\n    // When we save other implicit data, we might need to move this\r\n    // to a different file and sort things better\r\n\r\n    return {\r\n      modelMesh,\r\n      localIDs,\r\n      maxLocalID: nextId,\r\n      alignments,\r\n      grids,\r\n    };\r\n  }\r\n}\r\n","import * as WEBIFC from \"web-ifc\";\r\n\r\nexport const ifcClasses = {\r\n  base: new Set([\r\n    WEBIFC.IFCPROJECT,\r\n    WEBIFC.IFCSITE,\r\n    WEBIFC.IFCBUILDING,\r\n    WEBIFC.IFCBUILDINGSTOREY,\r\n  ]),\r\n  units: new Set([\r\n    WEBIFC.IFCUNITASSIGNMENT,\r\n    WEBIFC.IFCSIUNIT,\r\n    WEBIFC.IFCNAMEDUNIT,\r\n    WEBIFC.IFCDERIVEDUNIT,\r\n    WEBIFC.IFCMONETARYUNIT,\r\n  ]),\r\n  materials: new Set([\r\n    WEBIFC.IFCMATERIAL,\r\n    WEBIFC.IFCMATERIALLIST,\r\n    WEBIFC.IFCMATERIALCONSTITUENT,\r\n    WEBIFC.IFCMATERIALCONSTITUENTSET,\r\n    WEBIFC.IFCMATERIALLAYER,\r\n    WEBIFC.IFCMATERIALLAYERSET,\r\n    WEBIFC.IFCMATERIALLAYERSETUSAGE,\r\n    WEBIFC.IFCMATERIALPROFILE,\r\n    WEBIFC.IFCMATERIALPROFILESET,\r\n    WEBIFC.IFCMATERIALPROFILESETUSAGE,\r\n  ]),\r\n  properties: new Set([\r\n    WEBIFC.IFCPROPERTYSET,\r\n    WEBIFC.IFCPROPERTYSINGLEVALUE,\r\n    WEBIFC.IFCELEMENTQUANTITY,\r\n    WEBIFC.IFCQUANTITYAREA,\r\n    WEBIFC.IFCQUANTITYCOUNT,\r\n    WEBIFC.IFCQUANTITYLENGTH,\r\n    WEBIFC.IFCQUANTITYNUMBER,\r\n    WEBIFC.IFCQUANTITYTIME,\r\n    WEBIFC.IFCQUANTITYVOLUME,\r\n    WEBIFC.IFCQUANTITYWEIGHT,\r\n  ]),\r\n  types: new Set([\r\n    // IfcBuiltElementType\r\n    WEBIFC.IFCBEAMTYPE,\r\n    WEBIFC.IFCBEARINGTYPE,\r\n    WEBIFC.IFCBUILDINGELEMENTPROXYTYPE,\r\n    WEBIFC.IFCCHIMNEYTYPE,\r\n    WEBIFC.IFCCOLUMNTYPE,\r\n    WEBIFC.IFCCOURSETYPE,\r\n    WEBIFC.IFCCOVERINGTYPE,\r\n    WEBIFC.IFCCURTAINWALLTYPE,\r\n    WEBIFC.IFCDEEPFOUNDATIONTYPE,\r\n    WEBIFC.IFCDOORTYPE,\r\n    WEBIFC.IFCFOOTINGTYPE,\r\n    WEBIFC.IFCKERBTYPE,\r\n    WEBIFC.IFCMEMBERTYPE,\r\n    WEBIFC.IFCMOORINGDEVICETYPE,\r\n    WEBIFC.IFCNAVIGATIONELEMENTTYPE,\r\n    WEBIFC.IFCPAVEMENTTYPE,\r\n    WEBIFC.IFCPLATETYPE,\r\n    WEBIFC.IFCRAILTYPE,\r\n    WEBIFC.IFCRAILINGTYPE,\r\n    WEBIFC.IFCRAMPFLIGHTTYPE,\r\n    WEBIFC.IFCRAMPTYPE,\r\n    WEBIFC.IFCROOFTYPE,\r\n    WEBIFC.IFCSHADINGDEVICETYPE,\r\n    WEBIFC.IFCSLABTYPE,\r\n    WEBIFC.IFCSTAIRFLIGHTTYPE,\r\n    WEBIFC.IFCSTAIRTYPE,\r\n    WEBIFC.IFCTRACKELEMENTTYPE,\r\n    WEBIFC.IFCWALLTYPE,\r\n    WEBIFC.IFCWINDOWTYPE,\r\n  ]),\r\n  elements: new Set([\r\n    WEBIFC.IFCPROJECT,\r\n    WEBIFC.IFCSITE,\r\n    WEBIFC.IFCBUILDING,\r\n    WEBIFC.IFCBUILDINGSTOREY,\r\n    WEBIFC.IFCSPACE,\r\n    WEBIFC.IFCANNOTATION,\r\n    WEBIFC.IFCCONTROLLER,\r\n    WEBIFC.IFCBOILER,\r\n    WEBIFC.IFCLAMP,\r\n    WEBIFC.IFCPUMP,\r\n    WEBIFC.IFCAIRTERMINALBOX,\r\n    WEBIFC.IFCFLOWINSTRUMENT,\r\n    WEBIFC.IFCFURNISHINGELEMENT,\r\n    WEBIFC.IFCELECTRICGENERATOR,\r\n    WEBIFC.IFCAUDIOVISUALAPPLIANCE,\r\n    WEBIFC.IFCPIPEFITTING,\r\n    WEBIFC.IFCSTAIR,\r\n    WEBIFC.IFCDUCTFITTING,\r\n    WEBIFC.IFCMECHANICALFASTENER,\r\n    WEBIFC.IFCDOOR,\r\n    WEBIFC.IFCELECTRICMOTOR,\r\n    WEBIFC.IFCSYSTEMFURNITUREELEMENT,\r\n    WEBIFC.IFCEVAPORATOR,\r\n    WEBIFC.IFCWINDOWSTANDARDCASE,\r\n    WEBIFC.IFCLIGHTFIXTURE,\r\n    WEBIFC.IFCUNITARYCONTROLELEMENT,\r\n    WEBIFC.IFCCABLECARRIERFITTING,\r\n    WEBIFC.IFCCOIL,\r\n    WEBIFC.IFCFASTENER,\r\n    WEBIFC.IFCFLOWSTORAGEDEVICE,\r\n    WEBIFC.IFCPROTECTIVEDEVICE,\r\n    WEBIFC.IFCBEAM,\r\n    WEBIFC.IFCTANK,\r\n    WEBIFC.IFCFILTER,\r\n    WEBIFC.IFCCOLUMN,\r\n    WEBIFC.IFCELECTRICDISTRIBUTIONBOARD,\r\n    WEBIFC.IFCFOOTING,\r\n    WEBIFC.IFCCOLUMNSTANDARDCASE,\r\n    WEBIFC.IFCVOIDINGFEATURE,\r\n    WEBIFC.IFCREINFORCINGBAR,\r\n    WEBIFC.IFCFLOWSEGMENT,\r\n    WEBIFC.IFCELECTRICTIMECONTROL,\r\n    WEBIFC.IFCCABLEFITTING,\r\n    WEBIFC.IFCDISTRIBUTIONCHAMBERELEMENT,\r\n    WEBIFC.IFCDISTRIBUTIONCONTROLELEMENT,\r\n    WEBIFC.IFCMEMBER,\r\n    WEBIFC.IFCBUILDINGELEMENTPROXY,\r\n    WEBIFC.IFCPLATESTANDARDCASE,\r\n    WEBIFC.IFCSWITCHINGDEVICE,\r\n    WEBIFC.IFCSHADINGDEVICE,\r\n    WEBIFC.IFCDISCRETEACCESSORY,\r\n    WEBIFC.IFCDUCTSILENCER,\r\n    WEBIFC.IFCSTACKTERMINAL,\r\n    WEBIFC.IFCFIRESUPPRESSIONTERMINAL,\r\n    WEBIFC.IFCMEDICALDEVICE,\r\n    WEBIFC.IFCFURNITURE,\r\n    WEBIFC.IFCSLAB,\r\n    WEBIFC.IFCTRANSPORTELEMENT,\r\n    WEBIFC.IFCAIRTERMINAL,\r\n    WEBIFC.IFCENERGYCONVERSIONDEVICE,\r\n    WEBIFC.IFCCIVILELEMENT,\r\n    WEBIFC.IFCPILE,\r\n    WEBIFC.IFCELECTRICAPPLIANCE,\r\n    WEBIFC.IFCMEMBERSTANDARDCASE,\r\n    WEBIFC.IFCDISTRIBUTIONELEMENT,\r\n    WEBIFC.IFCCOVERING,\r\n    WEBIFC.IFCSPACEHEATER,\r\n    WEBIFC.IFCROOF,\r\n    WEBIFC.IFCAIRTOAIRHEATRECOVERY,\r\n    WEBIFC.IFCFLOWCONTROLLER,\r\n    WEBIFC.IFCHUMIDIFIER,\r\n    WEBIFC.IFCJUNCTIONBOX,\r\n    WEBIFC.IFCFLOWMETER,\r\n    WEBIFC.IFCFLOWTERMINAL,\r\n    WEBIFC.IFCRAILING,\r\n    WEBIFC.IFCCONDENSER,\r\n    WEBIFC.IFCPROTECTIVEDEVICETRIPPINGUNIT,\r\n    WEBIFC.IFCREINFORCINGMESH,\r\n    WEBIFC.IFCTENDONANCHOR,\r\n    WEBIFC.IFCVIBRATIONISOLATOR,\r\n    WEBIFC.IFCWALL,\r\n    WEBIFC.IFCMOTORCONNECTION,\r\n    WEBIFC.IFCVIRTUALELEMENT,\r\n    WEBIFC.IFCENGINE,\r\n    WEBIFC.IFCBEAMSTANDARDCASE,\r\n    WEBIFC.IFCBURNER,\r\n    WEBIFC.IFCBUILDINGELEMENTPART,\r\n    WEBIFC.IFCRAMP,\r\n    WEBIFC.IFCTUBEBUNDLE,\r\n    WEBIFC.IFCSLABSTANDARDCASE,\r\n    WEBIFC.IFCDISTRIBUTIONFLOWELEMENT,\r\n    WEBIFC.IFCSANITARYTERMINAL,\r\n    WEBIFC.IFCOPENINGSTANDARDCASE,\r\n    WEBIFC.IFCALARM,\r\n    WEBIFC.IFCSURFACEFEATURE,\r\n    WEBIFC.IFCSLABELEMENTEDCASE,\r\n    WEBIFC.IFCFLOWMOVINGDEVICE,\r\n    WEBIFC.IFCPLATE,\r\n    WEBIFC.IFCCOMMUNICATIONSAPPLIANCE,\r\n    WEBIFC.IFCDOORSTANDARDCASE,\r\n    WEBIFC.IFCRAMPFLIGHT,\r\n    WEBIFC.IFCCHIMNEY,\r\n    WEBIFC.IFCWINDOW,\r\n    WEBIFC.IFCELECTRICFLOWSTORAGEDEVICE,\r\n    WEBIFC.IFCHEATEXCHANGER,\r\n    WEBIFC.IFCFAN,\r\n    WEBIFC.IFCSOLARDEVICE,\r\n    WEBIFC.IFCGEOGRAPHICELEMENT,\r\n    WEBIFC.IFCCURTAINWALL,\r\n    WEBIFC.IFCFLOWTREATMENTDEVICE,\r\n    WEBIFC.IFCWALLSTANDARDCASE,\r\n    WEBIFC.IFCDUCTSEGMENT,\r\n    WEBIFC.IFCCOMPRESSOR,\r\n    // WEBIFC.IFCOPENINGELEMENT,\r\n    WEBIFC.IFCPIPESEGMENT,\r\n    WEBIFC.IFCCOOLINGTOWER,\r\n    WEBIFC.IFCPROJECTIONELEMENT,\r\n    WEBIFC.IFCOUTLET,\r\n    WEBIFC.IFCEVAPORATIVECOOLER,\r\n    WEBIFC.IFCCABLECARRIERSEGMENT,\r\n    WEBIFC.IFCTENDON,\r\n    WEBIFC.IFCTRANSFORMER,\r\n    WEBIFC.IFCCHILLER,\r\n    WEBIFC.IFCDAMPER,\r\n    WEBIFC.IFCSENSOR,\r\n    WEBIFC.IFCELEMENTASSEMBLY,\r\n    WEBIFC.IFCCOOLEDBEAM,\r\n    WEBIFC.IFCWALLELEMENTEDCASE,\r\n    WEBIFC.IFCINTERCEPTOR,\r\n    WEBIFC.IFCVALVE,\r\n    WEBIFC.IFCCABLESEGMENT,\r\n    WEBIFC.IFCWASTETERMINAL,\r\n    WEBIFC.IFCSTAIRFLIGHT,\r\n    WEBIFC.IFCFLOWFITTING,\r\n    WEBIFC.IFCACTUATOR,\r\n    WEBIFC.IFCUNITARYEQUIPMENT,\r\n    WEBIFC.IFCGRID,\r\n    WEBIFC.IFCBUILTELEMENT,\r\n    WEBIFC.IFCCOURSE,\r\n    WEBIFC.IFCEARTHWORKSCUT,\r\n    WEBIFC.IFCEARTHWORKSFILL,\r\n    WEBIFC.IFCTRACKELEMENT,\r\n    WEBIFC.IFCRAIL,\r\n    WEBIFC.IFCSIGN,\r\n    WEBIFC.IFCPAVEMENT,\r\n    WEBIFC.IFCROAD,\r\n    WEBIFC.IFCBRIDGEPART,\r\n  ]),\r\n};\r\n","import * as fb from \"flatbuffers\";\r\nimport { MathUtils } from \"three\";\r\nimport pako from \"pako\";\r\nimport * as WEBIFC from \"web-ifc\";\r\nimport * as TFB from \"../../Schema\";\r\nimport {\r\n  IfcPropertyProcessor,\r\n  IfcGeometryProcessor,\r\n  ifcClasses,\r\n  ProcessData,\r\n} from \"./src\";\r\nimport {\r\n  DataSet,\r\n  GeometryProcessSettings,\r\n  ifcCategoryMap,\r\n  ifcRelationsMap,\r\n  geometryTypes,\r\n} from \"../../Utils\";\r\n\r\n/**\r\n * An objet to convert IFC files into fragments.\r\n */\r\nexport class IfcImporter {\r\n  private _builder: fb.Builder | null = null;\r\n\r\n  /** Configuration for the web-ifc WASM module\r\n   * @property {string} path - The path to the web-ifc WASM files\r\n   * @property {boolean} absolute - Whether the path is absolute or relative\r\n   */\r\n  wasm = {\r\n    path: \"/node_modules/web-ifc/\",\r\n    absolute: false,\r\n  };\r\n\r\n  webIfcSettings: WEBIFC.LoaderSettings = {\r\n    COORDINATE_TO_ORIGIN: true,\r\n  };\r\n\r\n  /** A set of attribute names to exclude from serialization.\r\n   */\r\n  attributesToExclude = new Set([\r\n    \"Representation\",\r\n    \"ObjectPlacement\",\r\n    \"CompositionType\",\r\n    \"OwnerHistory\",\r\n  ]);\r\n\r\n  geometryProcessSettings: GeometryProcessSettings = {\r\n    // TODO: Test to see if this is the correct threshold\r\n    // if not applied, some geometries take too long to process\r\n    threshold: 3000,\r\n    precision: 1000000,\r\n    normalPrecision: 10000000,\r\n    planePrecision: 1000,\r\n    faceThreshold: 0.6,\r\n    forceTransparentSpaces: true,\r\n  };\r\n\r\n  /**\r\n   * @summary Defines the relationships between IFC entities.\r\n   * @description This map defines the relationships between IFC entities, specifying the relationship type,\r\n   * and the properties that define the relationship in both directions.\r\n   *\r\n   * The keys of the map are IFC relationship types (e.g., `IFCRELDEFINESBYPROPERTIES`).\r\n   * The values are objects that define the properties for relating and related entities.\r\n   *\r\n   * - `forRelating`: The property name on the relating entity.\r\n   * - `forRelated`: The property name on the related entity.\r\n   */\r\n  relations = new Map([\r\n    [\r\n      WEBIFC.IFCRELDEFINESBYPROPERTIES,\r\n      { forRelating: \"DefinesOcurrence\", forRelated: \"IsDefinedBy\" },\r\n    ],\r\n    [\r\n      WEBIFC.IFCRELASSOCIATESMATERIAL,\r\n      { forRelated: \"HasAssociations\", forRelating: \"AssociatedTo\" },\r\n    ],\r\n    [\r\n      WEBIFC.IFCRELAGGREGATES,\r\n      { forRelated: \"Decomposes\", forRelating: \"IsDecomposedBy\" },\r\n    ],\r\n    [\r\n      WEBIFC.IFCRELCONTAINEDINSPATIALSTRUCTURE,\r\n      { forRelated: \"ContainedInStructure\", forRelating: \"ContainsElements\" },\r\n    ],\r\n  ]);\r\n\r\n  /**\r\n   * @summary A map containing sets of IFC classes, categorized into 'elements' and 'abstract'.\r\n   * @remarks The 'elements' category contains a set of IFC classes representing physical elements.\r\n   * The 'abstract' category contains a set of abstract IFC classes, including materials, properties, classifications, etc.\r\n   */\r\n  classes = {\r\n    elements: new DataSet<number>([...ifcClasses.elements]),\r\n    abstract: new DataSet<number>([\r\n      ...ifcClasses.base,\r\n      ...ifcClasses.materials,\r\n      ...ifcClasses.properties,\r\n      ...ifcClasses.units,\r\n    ]),\r\n  };\r\n\r\n  /**\r\n   * Whether to include unique attributes from the imported IFC data.\r\n   */\r\n  includeUniqueAttributes = false;\r\n\r\n  /**\r\n   * Whether to include relation names from the imported IFC data.\r\n   */\r\n  includeRelationNames = false;\r\n\r\n  /**\r\n   * Whether to replace the IfcBuildingStorey.Elevation with the absolute storey elevation.\r\n   * @remarks The value is calculated taking into consideration the relative positions between entities\r\n   * and it is always given in meters.\r\n   */\r\n  replaceStoreyElevation = true;\r\n\r\n  /**\r\n   * Whether to replace the IfcSite.RefElevation with the absolute site elevation.\r\n   * @remarks The value is calculated taking into consideration the relative positions between entities\r\n   * and it is always given in meters.\r\n   */\r\n  replaceSiteElevation = true;\r\n\r\n  /**\r\n   * If set, ignores the items that are further away to the origin than this value.\r\n   * Keep in mind that if your IFC is correctly georreferenced, this value should never\r\n   * be too high. If it's too high, it's either because your file uses absolute coordinates,\r\n   * (which is a very bad idea, and usually due to a poor IFC export) or because there are\r\n   * objects that are very, very far away (very unlikely).\r\n   */\r\n  distanceThreshold: number | null = 100000;\r\n\r\n  private get builder() {\r\n    if (!this._builder) {\r\n      throw new Error(\"Fragments: Builder not initialized\");\r\n    }\r\n    return this._builder;\r\n  }\r\n\r\n  /**\r\n   * Processes IFC data and converts it into a fragments format.\r\n   * @param data Configuration object for processing.\r\n   * @param data.bytes Raw IFC file data as Uint8Array.\r\n   * @param data.raw Whether to return raw uncompressed data. If false, the output fragments will be smaller.\r\n   * @param data.readFromCallback Whether to read data from a callback function. Useful for node.js.\r\n   * @param data.readCallback Callback function to read IFC data. Useful for node.js.\r\n   */\r\n  async process(data: ProcessData) {\r\n    this._builder = new fb.Builder(1024);\r\n\r\n    // Get geometry\r\n\r\n    const geometryProcessor = new IfcGeometryProcessor(this);\r\n    geometryProcessor.wasm = this.wasm;\r\n    geometryProcessor.webIfcSettings = this.webIfcSettings;\r\n    const geomData = { ...data, builder: this.builder };\r\n    const geoms = await geometryProcessor.process(geomData);\r\n    const { modelMesh, maxLocalID, localIDs, alignments, grids } = geoms;\r\n\r\n    // Get properties\r\n\r\n    const properties = new IfcPropertyProcessor(this, this.builder);\r\n    properties.wasm = this.wasm;\r\n    properties.webIfcSettings = this.webIfcSettings;\r\n    const propsArgs = {\r\n      ...data,\r\n      geometryProcessedLocalIDs: localIDs,\r\n      alignments,\r\n      grids,\r\n      maxLocalID,\r\n    };\r\n    const propsData = await properties.process(propsArgs);\r\n    const {\r\n      relIndicesVector,\r\n      relsVector,\r\n      guidsVector,\r\n      guidsItemsVector,\r\n      metadataOffset,\r\n      localIdsVector,\r\n      spatialStrutureOffset,\r\n      attributesVector,\r\n      categoriesVector,\r\n      uniqueAttributesVector,\r\n      relNamesVector,\r\n      newMaxLocalID,\r\n    } = propsData;\r\n\r\n    const guid = data.id ?? MathUtils.generateUUID();\r\n    const guidRef = this.builder.createString(guid);\r\n\r\n    TFB.Model.startModel(this.builder);\r\n    TFB.Model.addMeshes(this.builder, modelMesh);\r\n    TFB.Model.addMetadata(this.builder, metadataOffset);\r\n    TFB.Model.addAttributes(this.builder, attributesVector);\r\n    TFB.Model.addUniqueAttributes(this.builder, uniqueAttributesVector);\r\n    TFB.Model.addRelationNames(this.builder, relNamesVector);\r\n    TFB.Model.addLocalIds(this.builder, localIdsVector);\r\n    TFB.Model.addCategories(this.builder, categoriesVector);\r\n    TFB.Model.addRelationsItems(this.builder, relIndicesVector);\r\n    TFB.Model.addRelations(this.builder, relsVector);\r\n    TFB.Model.addGuidsItems(this.builder, guidsItemsVector);\r\n    TFB.Model.addGuids(this.builder, guidsVector);\r\n    TFB.Model.addSpatialStructure(this.builder, spatialStrutureOffset);\r\n    TFB.Model.addGuid(this.builder, guidRef);\r\n    TFB.Model.addMaxLocalId(this.builder, newMaxLocalID);\r\n    const outData = TFB.Model.endModel(this.builder);\r\n\r\n    this.builder.finish(outData);\r\n    const outBytes = this.builder.asUint8Array();\r\n    this.clean();\r\n\r\n    const content = data.raw ? outBytes : pako.deflate(outBytes);\r\n\r\n    data.progressCallback?.(1, {\r\n      process: \"conversion\",\r\n      state: \"finish\",\r\n    });\r\n\r\n    return content;\r\n  }\r\n\r\n  /**\r\n   * Adds all attributes to the classes. Use this with precaution because it can increase the size of the output fragments.\r\n   */\r\n  addAllAttributes() {\r\n    for (const categoryString in ifcCategoryMap) {\r\n      const category = parseInt(categoryString, 10);\r\n      if (geometryTypes.has(category)) {\r\n        continue;\r\n      }\r\n      this.classes.abstract.add(category);\r\n    }\r\n    this.attributesToExclude = new Set();\r\n  }\r\n\r\n  /**\r\n   * Adds all relations to the relations map. Use this with precaution because it can increase the size of the output fragments.\r\n   */\r\n  addAllRelations() {\r\n    this.relations = new Map(ifcRelationsMap);\r\n  }\r\n\r\n  private clean() {\r\n    this._builder?.clear();\r\n    this._builder = null;\r\n  }\r\n}\r\n\r\nexport * from \"./src/types\";\r\n","import * as WEBIFC from \"web-ifc\";\r\n// import * as THREE from \"three\";\r\n// import { ImplicitGeometry } from \"./implicit-geometry\";\r\n// import { Profile } from \"./profile\";\r\n\r\nexport type ExtrusionData = {\r\n  profilePoints?: number[];\r\n  profileHoles?: number[][];\r\n  direction?: number[];\r\n  cuttingPlaneNormal?: number[];\r\n  cuttingPlanePosition?: number[];\r\n  length?: number;\r\n  cap?: boolean;\r\n};\r\n\r\nexport class Extrusion {\r\n  core: WEBIFC.Extrusion;\r\n\r\n  constructor(api: WEBIFC.IfcAPI) {\r\n    this.core = api.CreateExtrusion() as WEBIFC.Extrusion;\r\n  }\r\n\r\n  get(api: WEBIFC.IfcAPI, data: ExtrusionData) {\r\n    // Convert all data to DoubleVectors\r\n\r\n    // prettier-ignore\r\n    const inputProfilePoints = data.profilePoints ?? [\r\n      0, 0, 0,\r\n      1, 0, 0,\r\n      1, 1, 0,\r\n      0, 1, 0,\r\n    ];\r\n\r\n    const inputProfileHoles = data.profileHoles ?? [];\r\n    const inputDirection = data.direction ?? [0, 0, 1];\r\n    const inputCutPlaneNor = data.cuttingPlaneNormal ?? [0, 0, 0];\r\n    const inputCutPlanePos = data.cuttingPlanePosition ?? [0, 0, 0];\r\n    const inputLength = data.length ?? 1;\r\n    const inputCap = data.cap ?? true;\r\n\r\n    // Profile points\r\n\r\n    const profilePoints = new api.wasmModule.DoubleVector(); // Flat vector\r\n    for (const coord of inputProfilePoints) {\r\n      profilePoints.push_back(coord);\r\n    }\r\n\r\n    // Profile holes\r\n\r\n    for (const hole of inputProfileHoles) {\r\n      const holeVector = new api.wasmModule.DoubleVector();\r\n\r\n      for (const coord of hole) {\r\n        holeVector.push_back(coord);\r\n      }\r\n\r\n      // Send the hole to the core extrusion\r\n      this.core.SetHoles(holeVector);\r\n    }\r\n\r\n    // Direction\r\n\r\n    const dirPoint = new api.wasmModule.DoubleVector();\r\n    for (const coord of inputDirection) {\r\n      dirPoint.push_back(coord);\r\n    }\r\n\r\n    // Cutting plane normal\r\n\r\n    const cuttingPlaneNormal = new api.wasmModule.DoubleVector();\r\n    for (const coord of inputCutPlaneNor) {\r\n      cuttingPlaneNormal.push_back(coord);\r\n    }\r\n\r\n    // Cutting plane position\r\n\r\n    const cuttingPlanePos = new api.wasmModule.DoubleVector();\r\n    for (const coord of inputCutPlanePos) {\r\n      cuttingPlanePos.push_back(coord);\r\n    }\r\n\r\n    // Apply\r\n\r\n    this.core.SetValues(\r\n      profilePoints,\r\n      dirPoint,\r\n      inputLength,\r\n      cuttingPlaneNormal,\r\n      cuttingPlanePos,\r\n      inputCap,\r\n    );\r\n\r\n    // Get geometry buffers\r\n\r\n    const result = this.core.GetBuffers();\r\n\r\n    this.core.ClearHoles();\r\n\r\n    return result;\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport { ProfileSection } from \"web-ifc\";\r\nimport * as WEBIFC from \"web-ifc\";\r\n\r\nexport enum ProfileType {\r\n  \"H\" = 0,\r\n  \"C\" = 1,\r\n  \"Z\" = 2,\r\n  \"T\" = 3,\r\n  \"L\" = 4,\r\n}\r\n\r\nexport type ProfileData = {\r\n  type?: ProfileType;\r\n  width?: number;\r\n  depth?: number;\r\n  thickness?: number;\r\n  flangeThickness?: number;\r\n  hasFillet?: boolean;\r\n  filletRadius?: number;\r\n  radius?: number;\r\n  slope?: number;\r\n  circleSegments?: 20;\r\n  placement?: THREE.Matrix4;\r\n};\r\n\r\nexport class Profile {\r\n  core: ProfileSection;\r\n\r\n  static map = new Map<string, ProfileType>([\r\n    [\"H\", ProfileType.H],\r\n    [\"C\", ProfileType.C],\r\n    [\"Z\", ProfileType.Z],\r\n    [\"T\", ProfileType.T],\r\n    [\"L\", ProfileType.L],\r\n  ]);\r\n\r\n  constructor(api: WEBIFC.IfcAPI) {\r\n    this.core = api.CreateProfile() as ProfileSection;\r\n  }\r\n\r\n  get(api: WEBIFC.IfcAPI, data: ProfileData) {\r\n    const type = data.type ?? 0;\r\n    const width = data.width ?? 0.2;\r\n    const depth = data.depth ?? 0.2;\r\n    const thickness = data.thickness ?? 0.002;\r\n    const flangeThickness = data.flangeThickness ?? 0.002;\r\n    const hasFillet = data.hasFillet ?? false;\r\n    const filletRadius = data.filletRadius ?? 0.001;\r\n    const radius = data.radius ?? 0.01;\r\n    const slope = data.slope ?? 0.001;\r\n    const circleSegments = data.circleSegments ?? 20;\r\n\r\n    const formattedPlacement = new api.wasmModule.DoubleVector(); // Flat vector\r\n\r\n    const mat = data.placement ?? new THREE.Matrix4().identity();\r\n    for (const element of mat.elements) {\r\n      formattedPlacement.push_back(element);\r\n    }\r\n\r\n    const core = this.core as WEBIFC.ProfileSection;\r\n    core.SetValues(\r\n      type,\r\n      width,\r\n      depth,\r\n      thickness,\r\n      flangeThickness,\r\n      hasFillet,\r\n      filletRadius,\r\n      radius,\r\n      slope,\r\n      circleSegments,\r\n      // @ts-ignore\r\n      formattedPlacement,\r\n    );\r\n\r\n    return core.GetBuffers();\r\n  }\r\n}\r\n","import * as WEBIFC from \"web-ifc\";\r\nimport * as THREE from \"three\";\r\n\r\nexport type BooleanOperationData = {\r\n  type: \"DIFFERENCE\" | \"UNION\";\r\n  target: THREE.Mesh;\r\n  operands: THREE.Mesh[];\r\n};\r\n\r\nexport class BooleanOperation {\r\n  core: WEBIFC.BooleanOperator;\r\n\r\n  constructor(api: WEBIFC.IfcAPI) {\r\n    this.core = api.CreateBooleanOperator() as WEBIFC.BooleanOperator;\r\n  }\r\n\r\n  get(api: WEBIFC.IfcAPI, data: BooleanOperationData) {\r\n    const targetGeom = data.target.geometry;\r\n    const firstData: number[] = [];\r\n    const pos = targetGeom.attributes.position.array;\r\n    const index = targetGeom.index!.array;\r\n\r\n    const tempVector = new THREE.Vector3();\r\n\r\n    for (let i = 0; i < index.length - 2; i += 3) {\r\n      const i1 = index[i];\r\n      const i2 = index[i + 1];\r\n      const i3 = index[i + 2];\r\n      tempVector.set(pos[i1 * 3], pos[i1 * 3 + 1], pos[i1 * 3 + 2]);\r\n      tempVector.applyMatrix4(data.target.matrixWorld);\r\n      firstData.push(tempVector.x);\r\n      firstData.push(tempVector.y);\r\n      firstData.push(tempVector.z);\r\n\r\n      tempVector.set(pos[i2 * 3], pos[i2 * 3 + 1], pos[i2 * 3 + 2]);\r\n      tempVector.applyMatrix4(data.target.matrixWorld);\r\n      firstData.push(tempVector.x);\r\n      firstData.push(tempVector.y);\r\n      firstData.push(tempVector.z);\r\n\r\n      tempVector.set(pos[i3 * 3], pos[i3 * 3 + 1], pos[i3 * 3 + 2]);\r\n      tempVector.applyMatrix4(data.target.matrixWorld);\r\n      firstData.push(tempVector.x);\r\n      firstData.push(tempVector.y);\r\n      firstData.push(tempVector.z);\r\n    }\r\n\r\n    const secondData = [];\r\n\r\n    for (const operand of data.operands) {\r\n      const oDataEntry: number[] = [];\r\n      const oIndex = operand.geometry.index!.array;\r\n      const oPos = operand.geometry.attributes.position.array;\r\n\r\n      for (let i = 0; i < oIndex.length - 2; i += 3) {\r\n        const i1 = oIndex[i];\r\n        const i2 = oIndex[i + 1];\r\n        const i3 = oIndex[i + 2];\r\n\r\n        tempVector.set(oPos[i1 * 3], oPos[i1 * 3 + 1], oPos[i1 * 3 + 2]);\r\n        tempVector.applyMatrix4(operand.matrixWorld);\r\n        oDataEntry.push(tempVector.x);\r\n        oDataEntry.push(tempVector.y);\r\n        oDataEntry.push(tempVector.z);\r\n\r\n        tempVector.set(oPos[i2 * 3], oPos[i2 * 3 + 1], oPos[i2 * 3 + 2]);\r\n        tempVector.applyMatrix4(operand.matrixWorld);\r\n        oDataEntry.push(tempVector.x);\r\n        oDataEntry.push(tempVector.y);\r\n        oDataEntry.push(tempVector.z);\r\n\r\n        tempVector.set(oPos[i3 * 3], oPos[i3 * 3 + 1], oPos[i3 * 3 + 2]);\r\n        tempVector.applyMatrix4(operand.matrixWorld);\r\n        oDataEntry.push(tempVector.x);\r\n        oDataEntry.push(tempVector.y);\r\n        oDataEntry.push(tempVector.z);\r\n      }\r\n      secondData.push(oDataEntry);\r\n    }\r\n\r\n    this.core.clear();\r\n\r\n    const solidPoints = new api.wasmModule.DoubleVector(); // Flat vector\r\n\r\n    for (const p of firstData) {\r\n      solidPoints.push_back(p);\r\n    }\r\n\r\n    this.core.SetValues(solidPoints, data.type);\r\n\r\n    for (const s of secondData) {\r\n      const secondPoints = new api.wasmModule.DoubleVector(); // Flat vector\r\n      for (const p of s) {\r\n        secondPoints.push_back(p);\r\n      }\r\n      this.core.SetSecond(secondPoints);\r\n    }\r\n\r\n    return this.core.GetBuffers();\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport * as WEBIFC from \"web-ifc\";\r\n\r\nexport type ArcData = {\r\n  startPosition?: THREE.Vector3;\r\n  radiusX?: number;\r\n  radiusY?: number;\r\n  numSegments?: number;\r\n  placement?: THREE.Matrix3; // 3x3 matrix equivalent of glm::dmat3\r\n  start?: number;\r\n  end?: number;\r\n  swap?: boolean;\r\n  endingNormalToCenter?: boolean;\r\n};\r\n\r\nexport class Arc {\r\n  core: WEBIFC.Arc;\r\n\r\n  constructor(api: WEBIFC.IfcAPI) {\r\n    this.core = api.CreateArc() as WEBIFC.Arc;\r\n  }\r\n\r\n  get(api: WEBIFC.IfcAPI, data: ArcData) {\r\n    const placement = data.placement ?? new THREE.Matrix3();\r\n\r\n    // Create a flat vector for the matrix values\r\n    const placementValues = new api.wasmModule.DoubleVector();\r\n\r\n    // THREE.Matrix3 stores values in a flat 1D array\r\n    placement.elements.forEach((value) => {\r\n      placementValues.push_back(value);\r\n    });\r\n\r\n    const radiusX = data.radiusX ?? 1;\r\n    const radiusY = data.radiusY ?? 1;\r\n    const numSegments = data.numSegments ?? 12;\r\n    const startRad = data.start ?? 0;\r\n    const endRad = data.end ?? Math.PI;\r\n    const swap = data.swap ?? false;\r\n    const normalToCenterEnding = data.endingNormalToCenter ?? false;\r\n\r\n    this.core.SetValues(\r\n      radiusX,\r\n      radiusY,\r\n      numSegments,\r\n      placementValues,\r\n      startRad,\r\n      endRad,\r\n      swap,\r\n      normalToCenterEnding,\r\n    );\r\n\r\n    return this.core.GetBuffers();\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport * as WEBIFC from \"web-ifc\";\r\n\r\nexport type BboxData = {\r\n  min?: THREE.Vector3;\r\n  max?: THREE.Vector3;\r\n};\r\n\r\nexport class Bbox {\r\n  core: WEBIFC.AABB;\r\n\r\n  constructor(api: WEBIFC.IfcAPI) {\r\n    this.core = api.CreateAABB() as WEBIFC.AABB;\r\n  }\r\n\r\n  get(data: BboxData) {\r\n    const min = data.min ?? new THREE.Vector3(0, 0, 0);\r\n    const max = data.max ?? new THREE.Vector3(1, 1, 1);\r\n    const { x: minX, y: minY, z: minZ } = min;\r\n    const { x: maxX, y: maxY, z: maxZ } = max;\r\n    this.core.SetValues(minX, minY, minZ, maxX, maxY, maxZ);\r\n    return this.core.GetBuffers();\r\n  }\r\n}\r\n","import * as WEBIFC from \"web-ifc\";\r\n\r\nexport type CircularSweepData = {\r\n  profilePoints?: number[];\r\n  directrix?: number[];\r\n  initNormal?: number[];\r\n  scale?: number;\r\n  closed?: boolean;\r\n  radius?: number;\r\n  rotate?: boolean; // Rotate 90º\r\n};\r\n\r\nexport class CircularSweep {\r\n  core: WEBIFC.CircularSweep;\r\n\r\n  constructor(api: WEBIFC.IfcAPI) {\r\n    this.core = api.CreateCircularSweep() as WEBIFC.CircularSweep;\r\n  }\r\n\r\n  get(api: WEBIFC.IfcAPI, data: CircularSweepData) {\r\n    const doubleProfilePoints = new api.wasmModule.DoubleVector(); // Flat vector\r\n    const profilePoints = data.profilePoints ?? [];\r\n    for (const p of profilePoints) {\r\n      doubleProfilePoints.push_back(p);\r\n    }\r\n\r\n    const doubleDirPoint = new api.wasmModule.DoubleVector();\r\n    const directrix = data.directrix ?? [];\r\n    for (const p of directrix) {\r\n      doubleDirPoint.push_back(p);\r\n    }\r\n\r\n    const doubleInitNormal = new api.wasmModule.DoubleVector();\r\n    const initNormal = data.initNormal ?? [0, 0, 0];\r\n    for (const p of initNormal) {\r\n      doubleInitNormal.push_back(p);\r\n    }\r\n\r\n    const scale = data.scale ?? 1;\r\n    const closed = data.closed ?? false;\r\n    const radius = data.radius ?? 10;\r\n    const rotate = data.rotate ?? false;\r\n\r\n    this.core.SetValues(\r\n      scale,\r\n      closed,\r\n      doubleProfilePoints,\r\n      radius,\r\n      doubleDirPoint,\r\n      doubleInitNormal,\r\n      rotate\r\n    );\r\n\r\n    return this.core.GetBuffers();\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport * as WEBIFC from \"web-ifc\";\r\n\r\nexport type CylindricalRevolveData = {\r\n  transformation?: number[];\r\n  startAngle?: number;\r\n  endAngle?: number;\r\n  minZ?: number;\r\n  maxZ?: number;\r\n  segmentCount?: number;\r\n  radius?: number;\r\n};\r\n\r\nexport class CylindricalRevolve {\r\n  core: WEBIFC.CylindricalRevolve;\r\n\r\n  constructor(api: WEBIFC.IfcAPI) {\r\n    this.core = api.CreateCylindricalRevolution() as WEBIFC.CylindricalRevolve;\r\n  }\r\n\r\n  get(api: WEBIFC.IfcAPI, data: CylindricalRevolveData) {\r\n    const transformation = new api.wasmModule.DoubleVector(); // Flat vector\r\n\r\n    const transform =\r\n      data.transformation ?? new THREE.Matrix4().identity().elements;\r\n\r\n    for (const element of transform) {\r\n      transformation.push_back(element);\r\n    }\r\n\r\n    const startAngle = data.startAngle ?? 0;\r\n    const endAngle = data.endAngle ?? 180;\r\n    const minZ = data.minZ ?? -10;\r\n    const maxZ = data.maxZ ?? 10;\r\n    const numRots = data.segmentCount ?? 12;\r\n    const radius = data.radius ?? 4;\r\n\r\n    this.core.SetValues(\r\n      transformation,\r\n      startAngle,\r\n      endAngle,\r\n      minZ,\r\n      maxZ,\r\n      numRots,\r\n      radius,\r\n    );\r\n    return this.core.GetBuffers();\r\n  }\r\n}\r\n","import * as WEBIFC from \"web-ifc\";\r\n\r\nexport type ParabolaData = {\r\n  segmentCount?: number;\r\n  start?: number[];\r\n  horizontalLength?: number;\r\n  startHeight?: number;\r\n  startGradient?: number;\r\n  endGradient?: number;\r\n};\r\n\r\nexport class Parabola {\r\n  core: WEBIFC.Parabola;\r\n\r\n  constructor(api: WEBIFC.IfcAPI) {\r\n    this.core = api.CreateParabola() as WEBIFC.Parabola;\r\n  }\r\n\r\n  get(data: ParabolaData) {\r\n    const segments = data.segmentCount ?? 12;\r\n    const [x, y, z] = data.start ?? [0, 0, 0];\r\n    const horLen = data.horizontalLength ?? 10;\r\n    const startHeight = data.startHeight ?? 2;\r\n    const startGrad = data.startGradient ?? 5;\r\n    const endGrad = data.endGradient ?? 0;\r\n\r\n    this.core.SetValues(\r\n      segments,\r\n      x,\r\n      y,\r\n      z,\r\n      horLen,\r\n      startHeight,\r\n      startGrad,\r\n      endGrad,\r\n    );\r\n\r\n    return this.core.GetBuffers();\r\n  }\r\n}\r\n","import * as WEBIFC from \"web-ifc\";\r\nimport * as THREE from \"three\";\r\n\r\nexport type RevolveData = {\r\n  transform?: number[];\r\n  profile?: number[];\r\n  start?: number;\r\n  end?: number;\r\n  segmentCount?: number;\r\n};\r\n\r\nexport class Revolve {\r\n  core: WEBIFC.Revolution;\r\n\r\n  constructor(api: WEBIFC.IfcAPI) {\r\n    this.core = api.CreateRevolution() as WEBIFC.Revolution;\r\n  }\r\n\r\n  get(api: WEBIFC.IfcAPI, data: RevolveData) {\r\n    const doubleProfile = new api.wasmModule.DoubleVector(); // Flat vector\r\n    const profile = data.profile ?? [];\r\n    for (const p of profile) {\r\n      doubleProfile.push_back(p);\r\n    }\r\n\r\n    const doubleTrans = new api.wasmModule.DoubleVector(); // Flat vector\r\n    const transform = data.transform ?? new THREE.Matrix4().identity().elements;\r\n    for (const p of transform) {\r\n      doubleTrans.push_back(p);\r\n    }\r\n\r\n    const start = data.start ?? 0;\r\n    const end = data.end ?? 180;\r\n    const count = data.segmentCount ?? 12;\r\n\r\n    this.core.SetValues(doubleProfile, doubleTrans, start, end, count);\r\n\r\n    return this.core.GetBuffers();\r\n  }\r\n}\r\n","import * as WEBIFC from \"web-ifc\";\r\n\r\nexport type SweepData = {\r\n  profilePoints?: number[];\r\n  curvePoints?: number[];\r\n  startNormal?: number[];\r\n  scale?: number;\r\n  close?: boolean;\r\n  rotate90?: boolean;\r\n  optimize?: boolean;\r\n};\r\n\r\nexport class Sweep {\r\n  core: WEBIFC.Sweep;\r\n\r\n  constructor(api: WEBIFC.IfcAPI) {\r\n    this.core = api.CreateSweep() as WEBIFC.Sweep;\r\n  }\r\n\r\n  get(api: WEBIFC.IfcAPI, data: SweepData) {\r\n    const inputProfilePoints = data.profilePoints ?? [];\r\n    const inputCurvePoints = data.curvePoints ?? [];\r\n    const inputStartNormal = data.startNormal ?? [0, 0, 0];\r\n    const scale = data.scale ?? 1;\r\n    const close = data.close ?? false;\r\n    const rotate90 = data.rotate90 ?? false;\r\n    const optimize = data.optimize ?? false;\r\n\r\n    const profilePoints = new api.wasmModule.DoubleVector(); // Flat vector\r\n\r\n    for (const p of inputProfilePoints) {\r\n      profilePoints.push_back(p);\r\n    }\r\n\r\n    const dirPoint = new api.wasmModule.DoubleVector();\r\n    for (const p of inputCurvePoints) {\r\n      dirPoint.push_back(p);\r\n    }\r\n\r\n    const iniNormal = new api.wasmModule.DoubleVector();\r\n\r\n    for (const p of inputStartNormal) {\r\n      iniNormal.push_back(p);\r\n    }\r\n\r\n    this.core.SetValues(\r\n      scale,\r\n      close,\r\n      profilePoints,\r\n      dirPoint,\r\n      iniNormal,\r\n      rotate90,\r\n      optimize,\r\n    );\r\n\r\n    // Get geometry buffers\r\n\r\n    const result = this.core.GetBuffers();\r\n\r\n    return result;\r\n  }\r\n}\r\n","import * as WEBIFC from \"web-ifc\";\r\nimport * as THREE from \"three\";\r\n\r\nexport type WallData = {\r\n  start?: number[];\r\n  end?: number[];\r\n  elevation?: number;\r\n  height?: number;\r\n  offset?: number;\r\n  thickness?: number;\r\n  direction?: number[];\r\n  cuttingPlaneNormal?: number[];\r\n  cuttingPlanePosition?: number[];\r\n};\r\n\r\nexport class Wall {\r\n  core: WEBIFC.Extrusion;\r\n\r\n  constructor(api: WEBIFC.IfcAPI) {\r\n    this.core = api.CreateExtrusion() as WEBIFC.Extrusion;\r\n  }\r\n\r\n  get(api: WEBIFC.IfcAPI, data: WallData) {\r\n    // Convert all data to DoubleVectors\r\n\r\n    const start = data.start ?? [0, 0, 0];\r\n    const end = data.end ?? [1, 0, 0];\r\n    const elevation = data.elevation ?? 0;\r\n    const offset = data.offset ?? 0;\r\n    const thickness = data.thickness ?? 0.1;\r\n    const direction = data.direction ?? [0, 1, 0];\r\n    const inputCuttingPlaneNormal = data.cuttingPlaneNormal ?? [0, 0, 0];\r\n    const inputCuttingPlanePosition = data.cuttingPlanePosition ?? [0, 0, 0];\r\n    const height = data.height ?? 3;\r\n\r\n    const [startX, , startZ] = start;\r\n    const [endX, , endZ] = end;\r\n\r\n    const endVec = new THREE.Vector3(endX, elevation, endZ);\r\n    const startVec = new THREE.Vector3(startX, elevation, startZ);\r\n\r\n    const horizontalVec = new THREE.Vector3(\r\n      endX - startX,\r\n      elevation,\r\n      endZ - startZ,\r\n    );\r\n\r\n    const yAxis = new THREE.Vector3(0, 1, 0);\r\n    const thicknessDir = new THREE.Vector3()\r\n      .crossVectors(horizontalVec, yAxis)\r\n      .normalize();\r\n\r\n    const offsetVec = thicknessDir.clone().multiplyScalar(offset);\r\n    endVec.add(offsetVec);\r\n    startVec.add(offsetVec);\r\n\r\n    const delta = thicknessDir.clone().multiplyScalar(thickness / 2);\r\n    const rectanglePoints = [\r\n      startVec.clone().add(delta),\r\n      endVec.clone().add(delta),\r\n      endVec.clone().sub(delta),\r\n      startVec.clone().sub(delta),\r\n    ];\r\n\r\n    rectanglePoints.push(rectanglePoints[0]); // Close the loop\r\n\r\n    const profilePoints = new api.wasmModule.DoubleVector(); // Flat vector\r\n\r\n    for (const p of rectanglePoints) {\r\n      profilePoints.push_back(p.x);\r\n      profilePoints.push_back(p.y);\r\n      profilePoints.push_back(p.z);\r\n    }\r\n\r\n    const dirPoint = new api.wasmModule.DoubleVector();\r\n    for (const p of direction) {\r\n      dirPoint.push_back(p);\r\n    }\r\n\r\n    const cuttingPlaneNormal = new api.wasmModule.DoubleVector();\r\n    for (const p of inputCuttingPlaneNormal) {\r\n      cuttingPlaneNormal.push_back(p);\r\n    }\r\n\r\n    // ✅ Convert `cuttingPlanePos` to a `DoubleVector`\r\n    const cuttingPlanePos = new api.wasmModule.DoubleVector();\r\n    for (const p of inputCuttingPlanePosition) {\r\n      cuttingPlanePos.push_back(p);\r\n    }\r\n\r\n    this.core.SetValues(\r\n      profilePoints,\r\n      dirPoint,\r\n      height,\r\n      cuttingPlaneNormal,\r\n      cuttingPlanePos,\r\n      true,\r\n    );\r\n\r\n    const result = this.core.GetBuffers();\r\n\r\n    this.core.ClearHoles();\r\n\r\n    return result;\r\n  }\r\n}\r\n","import * as WEBIFC from \"web-ifc\";\r\n\r\nexport type ClothoidData = {\r\n  startPoint?: number[];\r\n  startDirection?: number;\r\n  segments?: number;\r\n  startRadius?: number;\r\n  endRadius?: number;\r\n  segmentLength?: number;\r\n};\r\n\r\nexport class Clothoid {\r\n  core: WEBIFC.Clothoid;\r\n\r\n  constructor(api: WEBIFC.IfcAPI) {\r\n    this.core = api.CreateClothoid() as WEBIFC.Clothoid;\r\n  }\r\n\r\n  get(data: ClothoidData) {\r\n\r\n    // segments: number = 12;\r\n    // startPoint = new THREE.Vector3(0, 0, 0);\r\n    // ifcStartDirection: number = 0.5;\r\n    // StartRadiusOfCurvature: number = 5;\r\n    // EndRadiusOfCurvature: number = 0;\r\n    // SegmentLength: number = 5;\r\n\r\n    const start = data.startPoint ?? [0, 0, 0];\r\n    const startDir = data.startDirection ?? 0.5;\r\n    const segments = data.segments ?? 12;\r\n    const startRadius = data.startRadius ?? 5;\r\n    const endRadius = data.endRadius ?? 0;\r\n    const segmentLength = data.segmentLength ?? 5;\r\n\r\n    const [startX, startY, startZ] = start;\r\n\r\n    this.core.SetValues(\r\n      segments,\r\n      startX,\r\n      startY,\r\n      startZ,\r\n      startDir,\r\n      startRadius,\r\n      endRadius,\r\n      segmentLength,\r\n    );\r\n\r\n    return this.core.GetBuffers();\r\n  }\r\n}\r\n","import * as THREE from \"three\";\r\nimport * as WEBIFC from \"web-ifc\";\r\nimport * as GE from \"./src\";\r\n\r\nexport * from \"./src\";\r\n\r\n/**\r\n * The geometry engine is responsible for generating geometry using web-ifc. It provides a high-level API to generate common BIM shapes like extrusions, sweeps, walls, and profiles.\r\n */\r\nexport class GeometryEngine {\r\n  /**\r\n   * The WebIFC API instance that contains the geometry engine.\r\n   */\r\n  api: WEBIFC.IfcAPI;\r\n\r\n  private _arc: GE.Arc;\r\n  private _parabola: GE.Parabola;\r\n  private _extrusion: GE.Extrusion;\r\n  private _profile: GE.Profile;\r\n  private _booleanOperation: GE.BooleanOperation;\r\n  private _bbox: GE.Bbox;\r\n  private _circularSweep: GE.CircularSweep;\r\n  private _clothoid: GE.Clothoid;\r\n  private _cylindricalRevolve: GE.CylindricalRevolve;\r\n  private _revolve: GE.Revolve;\r\n  private _sweep: GE.Sweep;\r\n  private _wall: GE.Wall;\r\n\r\n  /**\r\n   * Creates a new geometry engine instance.\r\n   * @param api - The WebIFC API instance that contains the geometry engine.\r\n   */\r\n  constructor(api: WEBIFC.IfcAPI) {\r\n    this.api = api;\r\n    this._extrusion = new GE.Extrusion(api);\r\n    this._profile = new GE.Profile(api);\r\n    this._booleanOperation = new GE.BooleanOperation(api);\r\n    this._arc = new GE.Arc(api);\r\n    this._bbox = new GE.Bbox(api);\r\n    this._clothoid = new GE.Clothoid(api);\r\n    this._circularSweep = new GE.CircularSweep(api);\r\n    this._cylindricalRevolve = new GE.CylindricalRevolve(api);\r\n    this._revolve = new GE.Revolve(api);\r\n    this._parabola = new GE.Parabola(api);\r\n    this._sweep = new GE.Sweep(api);\r\n    this._wall = new GE.Wall(api);\r\n  }\r\n\r\n  /**\r\n   * Generates an extrusion geometry from the given data.\r\n   * @param geometry - The geometry to store the result.\r\n   * @param data - The data to generate the extrusion.\r\n   */\r\n  getExtrusion(geometry: THREE.BufferGeometry, data: GE.ExtrusionData) {\r\n    const buffers = this._extrusion.get(this.api, data);\r\n    this.applyMesh(geometry, buffers);\r\n  }\r\n\r\n  /**\r\n   * Generates a sweep geometry from the given data.\r\n   * @param geometry - The geometry to store the result.\r\n   * @param data - The data to generate the sweep.\r\n   */\r\n  getSweep(geometry: THREE.BufferGeometry, data: GE.SweepData) {\r\n    const buffers = this._sweep.get(this.api, data);\r\n    this.applyMesh(geometry, buffers);\r\n  }\r\n\r\n  /**\r\n   * Generates a wall geometry from the given data.\r\n   * @param geometry - The geometry to store the result.\r\n   * @param data - The data to generate the wall.\r\n   */\r\n  getWall(geometry: THREE.BufferGeometry, data: GE.WallData) {\r\n    const buffers = this._wall.get(this.api, data);\r\n    this.applyMesh(geometry, buffers);\r\n  }\r\n\r\n  /**\r\n   * Generates a profile geometry from the given data.\r\n   * @param geometry - The geometry to store the result.\r\n   * @param data - The data to generate the profile.\r\n   */\r\n  getProfile(geometry: THREE.BufferGeometry, data: GE.ProfileData) {\r\n    const buffers = this._profile.get(this.api, data);\r\n    this.applyCurve(geometry, buffers);\r\n  }\r\n\r\n  /**\r\n   * Generates a boolean operation geometry from the given data.\r\n   * @param geometry - The geometry to store the result.\r\n   * @param data - The data to generate the boolean operation.\r\n   */\r\n  getBooleanOperation(\r\n    geometry: THREE.BufferGeometry,\r\n    data: GE.BooleanOperationData,\r\n  ) {\r\n    const buffers = this._booleanOperation.get(this.api, data);\r\n    this.applyMesh(geometry, buffers);\r\n  }\r\n\r\n  /**\r\n   * Generates a bounding box geometry from the given data.\r\n   * @param geometry - The geometry to store the result.\r\n   * @param data - The data to generate the bounding box.\r\n   */\r\n  getBbox(geometry: THREE.BufferGeometry, data: GE.BboxData) {\r\n    const buffers = this._bbox.get(data);\r\n    this.applyMesh(geometry, buffers);\r\n  }\r\n\r\n  /**\r\n   * Generates a circular sweep geometry from the given data.\r\n   * @param geometry - The geometry to store the result.\r\n   * @param data - The data to generate the circular sweep.\r\n   */\r\n  getCircularSweep(geometry: THREE.BufferGeometry, data: GE.CircularSweepData) {\r\n    const buffers = this._circularSweep.get(this.api, data);\r\n    this.applyMesh(geometry, buffers);\r\n  }\r\n\r\n  /**\r\n   * Generates a revolve geometry from the given data.\r\n   * @param geometry - The geometry to store the result.\r\n   * @param data - The data to generate the revolve.\r\n   */\r\n  getRevolve(geometry: THREE.BufferGeometry, data: GE.RevolveData) {\r\n    const buffers = this._revolve.get(this.api, data);\r\n    this.applyMesh(geometry, buffers);\r\n  }\r\n\r\n  /**\r\n   * Generates a cylindrical revolve geometry from the given data.\r\n   * @param geometry - The geometry to store the result.\r\n   * @param data - The data to generate the cylindrical revolve.\r\n   */\r\n  getCylindricalRevolve(\r\n    geometry: THREE.BufferGeometry,\r\n    data: GE.CylindricalRevolveData,\r\n  ) {\r\n    const buffers = this._cylindricalRevolve.get(this.api, data);\r\n    this.applyMesh(geometry, buffers);\r\n  }\r\n\r\n  /**\r\n   * Generates an arc geometry from the given data.\r\n   * @param geometry - The geometry to store the result.\r\n   * @param data - The data to generate the arc.\r\n   */\r\n  getArc(geometry: THREE.BufferGeometry, data: GE.ArcData) {\r\n    const buffers = this._arc.get(this.api, data);\r\n    this.applyCurve(geometry, buffers);\r\n  }\r\n\r\n  /**\r\n   * Generates a parabola geometry from the given data.\r\n   * @param geometry - The geometry to store the result.\r\n   * @param data - The data to generate the parabola.\r\n   */\r\n  getParabola(geometry: THREE.BufferGeometry, data: GE.ParabolaData) {\r\n    const buffers = this._parabola.get(data);\r\n    this.applyCurve(geometry, buffers);\r\n  }\r\n\r\n  /**\r\n   * Generates a clothoid geometry from the given data.\r\n   * @param geometry - The geometry to store the result.\r\n   * @param data - The data to generate the clothoid.\r\n   */\r\n  getClothoid(geometry: THREE.BufferGeometry, data: GE.ClothoidData) {\r\n    const buffers = this._clothoid.get(data);\r\n    this.applyCurve(geometry, buffers);\r\n  }\r\n\r\n  /**\r\n   * Generates profile points from the given data.\r\n   * @param data - The data to generate the profile points.\r\n   * @returns The profile points.\r\n   */\r\n  getProfilePoints(data: GE.ProfileData) {\r\n    // TODO: Fix WEBIFC.Buffer.fvertexData type\r\n    const buffers = this._profile.get(this.api, data) as any;\r\n    const vertexSize = buffers.fvertexData.size();\r\n    const points: number[] = [];\r\n    for (let i = 0; i < vertexSize; i++) {\r\n      const value = buffers.fvertexData.get(i);\r\n      points.push(value);\r\n    }\r\n    return points;\r\n  }\r\n\r\n  /**\r\n   * Transforms points from the given data.\r\n   * @param points - The points to transform.\r\n   * @param transform - The transform to apply to the points.\r\n   * @returns The transformed points.\r\n   */\r\n  transformPoints(points: number[], transform: THREE.Matrix4) {\r\n    const rotatedPoints: number[] = [];\r\n    const tempPoint = new THREE.Vector3();\r\n    for (let i = 0; i < points.length; i += 3) {\r\n      tempPoint.set(points[i], points[i + 1], points[i + 2]);\r\n      tempPoint.applyMatrix4(transform);\r\n      rotatedPoints.push(tempPoint.x, tempPoint.y, tempPoint.z);\r\n    }\r\n    return rotatedPoints;\r\n  }\r\n\r\n  private applyMesh(geometry: THREE.BufferGeometry, buffers: any) {\r\n    // const buffers = this.core.GetBuffers();\r\n    const vertexSize = buffers.fvertexData.size();\r\n    const vertices = new Float32Array(vertexSize);\r\n    for (let i = 0; i < vertexSize; i++) {\r\n      vertices[i] = buffers.fvertexData.get(i);\r\n    }\r\n\r\n    geometry.setAttribute(\"position\", new THREE.BufferAttribute(vertices, 3));\r\n\r\n    const indexSize = buffers.indexData.size();\r\n    const indices: number[] = [];\r\n    for (let i = 0; i < indexSize; i++) {\r\n      indices[i] = buffers.indexData.get(i);\r\n    }\r\n\r\n    geometry.setIndex(indices);\r\n\r\n    const normalArray = new Float32Array(vertexSize).fill(0);\r\n    geometry.setAttribute(\"normal\", new THREE.BufferAttribute(normalArray, 3));\r\n    geometry.computeVertexNormals();\r\n  }\r\n\r\n  private applyCurve(geometry: THREE.BufferGeometry, buffers: any) {\r\n    const vertexSize = buffers.fvertexData.size();\r\n    const vertices = new Float32Array(vertexSize);\r\n    for (let i = 0; i < vertexSize; i++) {\r\n      vertices[i] = buffers.fvertexData.get(i);\r\n    }\r\n    geometry.setAttribute(\"position\", new THREE.BufferAttribute(vertices, 3));\r\n\r\n    const indices: number[] = [];\r\n    for (let i = 0; i < vertexSize / 3 - 1; i++) {\r\n      indices.push(i, i + 1);\r\n    }\r\n    geometry.setIndex(indices);\r\n  }\r\n}\r\n"],"names":["found","MathUtils","Encoding","rank","flatbuffers.SIZE_PREFIX_LENGTH","AxisPartClass","ShellType","RenderedFaces","RepresentationClass","Stroke","EditRequestType","TFB.Transform","TFB.FloatVector","TFB.Shell","TFB.ShellProfile","TFB.ShellHole","TFB.BigShellProfile","TFB.BigShellHole","TFB.CircleExtrusion","TFB.Axis","TFB.CircleCurve","TFB.Wire","TFB.WireSet","wireSetOffset","TFB.SpatialStructure","TFB.Sample","ET.EditRequestType","TFB.RepresentationClass","FB.Builder","TFB.Meshes","TFB.Model","THREE","affectedItems","editedSamples","shell","shellOffset","circleExtrusion","circleExtrusionOffset","TFB.Representation","gtId","matId","reprId","ltId","TFB.Material","dataOffset","TFB.Attribute","TFB.Relation","FB.ByteBuffer","radius","TIS.solveSampleTempId","TIS.solveGtTempId","TIS.solveLocalIdTempId","FF.getModelFromBuffer","FF.getSampleData","FF.getTransformData","FF.getRelationData","FF.getMaterialData","FF.getRepresentationData","FF.getShellData","FF.getMaterialsIds","FF.getMaterials","FF.getRepresentationsIds","FF.getRepresentations","FF.getLocalTransformsIds","FF.getLocalTransforms","FF.getGlobalTransformsIds","FF.getGlobalTransforms","FF.getSamplesIds","FF.getSamples","FF.getItemsIds","FF.getItems","FF.getGlobalTranformsIdsOfItems","FF.getElementsData","FF.getGeometryIndicesFromRepresentations","FF.getRootModelId","FF.getSerializedAttributes","FF.itemDataToRawItemData","FF.DELTA_MODEL_ID","triangle","Profile","profile","area","TFB.ShellType","index","_a","tempMatrix","WEBIFC","_b","ObjectClass","TileRequestClass","CurrentLod","MultiThreadingRequestClass","ItemConfigClass","SnappingClass","AlignmentCurveType","LodMode","earcut","linkedList","eliminateHoles","earcutLinked","signedArea","insertNode","equals","removeNode","filterPoints","indexCurve","isEarHashed","isEar","cureLocalIntersections","splitEarcut","zOrder","intersects","locallyInside","isValidDiagonal","splitPolygon","getLeftmost","eliminateHole","findHoleBridge","pointInTriangle","sectorContainsSector","sortLinked","intersectsPolygon","middleInside","sign","onSegment","createNode","vertices","LineMaterial","LineGeometry","Line2","i","changes","data","newModel","requests","material","geometry","request","uint16Array","uint32Array","leftBounds","split","offset","count","Box3","float32Array","nodeIndex32","nodeIndex16","temp","Matrix4","_traverse","shapecastFunc","BufferAttribute","Vector3","closestPointLineToLine","Vector2","temp1","temp2","closestPointsSegmentToSegment","Plane","Line3","sphereIntersectTriangle","Triangle","closestPointToPoint","REVISION","BackSide","DoubleSide","byteOffset","_raycast","_xyzFields","_raycastFirst","boundingBox","triangle2","invertedMat","obb","obb2","_intersectsGeometry","temp3","temp4","Ray","roots","FrontSide","box","Mesh","Line","LineSegments","LineLoop","Points","BatchedMesh","Sphere","l","LodClass","PolygonSize","_ray","first","second","id","result","raycast","v","bf","resultPosition","itemId","isSeen","localIds","category","key","localId","name","geometries","input","meshes","indices","rels","expressID","childrenVector","TFB.AxisPartClass","point1","point2","point3","indicesOffset","TFB.RenderedFaces","fb.Builder","ProfileType","GE.Extrusion","GE.Profile","GE.BooleanOperation","GE.Arc","GE.Bbox","GE.Clothoid","GE.CircularSweep","GE.CylindricalRevolve","GE.Revolve","GE.Parabola","GE.Sweep","GE.Wall"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGgB,SAAA,UAAU,KAAU,QAAa;AACzC,QAAA,QAAQ,OAAO,eAAe,GAAG;AACjC,QAAA,YAAY,OAAO,oBAAoB,KAAK;AAElD,aAAW,QAAQ,WAAW;AACxB,QAAA,SAAS,iBAAiB,SAAS;AAAU;AAE7C,QAAA,KAAK,SAAS,SAAS;AAAG;AAC1B,QAAA,KAAK,MAAM,UAAU;AAAG;AAEtB,UAAA,QAAQ,MAAM,IAAI;AAEpB,QAAA,OAAO,UAAU,YAAY;AACzB,YAAA,UACJ,IAAI,GAAG,IAAI,QAAQ,MAAM,UAAa,IAAI,GAAG,IAAI,OAAO,MAAM;AAC5D,UAAA,MAAM,WAAW,KAAK,SAAS;AAE3B,cAAA,aAAa,GAAG,IAAI;AACpB,cAAA,SAAS,IAAI,UAAU,EAAE;AAC/B,cAAM,QAAe,CAAC;AACtB,eAAO,IAAI,IAAI;AACf,iBAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,gBAAMA,SAAQ,IAAI,IAAI,EAAE,CAAC;AACzB,cAAI,OAAOA,WAAU,YAAYA,WAAU,QAAQ,QAAQA,QAAO;AAChE,kBAAM,SAAc,CAAC;AACrB,sBAAUA,QAAO,MAAM;AACvB,kBAAM,KAAK,MAAM;AAAA,UAAA,OACZ;AACL,kBAAM,KAAKA,MAAK;AAAA,UAAA;AAAA,QAClB;AAEF;AAAA,MAAA;AAGI,YAAA,QAAQ,IAAI,IAAI,EAAE;AAExB,UAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAE/C,eAAO,IAAI,IAAI;AACf;AAAA,MAAA;AAGK,aAAA,IAAI,IAAI,CAAC;AACN,gBAAA,OAAO,OAAO,IAAI,CAAC;AAAA,IAAA,OACxB;AAEL,aAAO,IAAI,IAAI;AAAA,IAAA;AAAA,EACjB;AAEJ;ACjDO,MAAM,iBAA4C;AAAA,EACvD,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,W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,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBAAO;AAAA,EACPA,kBA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AAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA;AAAA,IAEPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,kBAAO;AAAA,IACPA,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","x_google_ignoreList":[6,7,8,9,10,11,71,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,183]}