ohzi-core 10.6.9 → 10.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.module.js","sources":["../src/Browser.js","../src/utilities/Validation.js","../src/resource_loader/AbstractLoader.js","../src/utilities/OMath.js","../src/action_sequencer/ActionSequencer.js","../src/utilities/EasingFunctions.js","../src/action_sequencer/ActionInterpolator.js","../src/action_sequencer/NumberInterpolator.js","../src/view_components/ViewContext.js","../src/action_sequencer/ActionEvent.js","../src/view_components/transition/DrawIOAnimationSheet.js","../src/view_components/transition/ActionSequencerBuilder.js","../src/EventManager.js","../src/ResourceContainer.js","../src/utilities/HTMLUtilities.js","../src/view_components/transition/TransitionTable.js","../src/Time.js","../src/view_components/ViewState.js","../src/view_components/transition/ViewStateTransitionHandler.js","../src/view_components/ViewManager.js","../src/view_components/ApplicationView.js","../src/BaseApplication.js","../src/render_mode/BaseRender.js","../src/materials/BaseShaderMaterial.js","../src/materials/BlitMaterial.js","../src/materials/AddMaterial.js","../src/materials/UnrealBloomComposeMaterial.js","../src/CameraManager.js","../src/Capabilities.js","../src/canvas_drawer/CanvasDrawer.js","../src/Configuration.js","../src/html_utilities/css_animator_states/Idle.js","../src/html_utilities/css_animator_states/Animating.js","../src/html_utilities/CSSAnimator.js","../src/components/AxisHelper.js","../src/SceneManager.js","../src/primitives/Cube.js","../src/primitives/Sphere.js","../src/primitives/Arrow.js","../src/OScreen.js","../src/materials/ScreenSpaceTextureMaterial.js","../src/PerspectiveCamera.js","../src/Debug.js","../src/materials/ClearDepthNormalMaterial.js","../src/materials/DepthNormalMaterial.js","../src/render_utilities/DepthAndNormalsRenderer.js","../src/render_utilities/Blitter.js","../src/Graphics.js","../src/materials/NormalMaterial.js","../src/render_mode/DebugNormalsRender.js","../src/KeyboardInput.js","../src/OS.js","../src/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/UI.js","../src/utilities/PerspectiveFrustumPointFitter.js","../src/utilities/OrthographicFrustumPointFitter.js","../src/utilities/CameraUtilities.js","../src/Initializer.js","../src/materials/SSAOMaterial.js","../src/materials/SSAOComposeMaterial.js","../src/materials/DisplayNormalTextureMaterial.js","../src/materials/BoxBlurMaterial.js","../src/render_utilities/Blurrer.js","../src/render_mode/NormalAORender.js","../src/render_mode/NormalRender.js","../src/render_mode/VRRender.js","../src/materials/GaussianBlurMaterial.js","../src/materials/LuminosityHighPassMaterial.js","../src/render_utilities/GaussianBlurrer.js","../src/render_mode/UnrealBloomRender.js","../src/OrthographicCamera.js","../src/view_components/ViewComponentManager.js","../src/RenderLoop.js","../src/Screen.js","../src/canvas_drawer/SimpleTextDrawer.js","../src/view_components/ViewComponent.js","../src/primitives/HorizontalPlane.js","../src/primitives/VerticalPlane.js","../src/utilities/ArrayUtilities.js","../src/utilities/FrustumPointFitter.js","../src/utilities/GeometryUtilities.js","../src/utilities/ImageUtilities.js","../src/utilities/MeshSampler.js","../src/utilities/ModelUtilities.js","../src/utilities/ObjectUtilities.js","../src/utilities/StringUtilities.js","../src/utilities/TimeUtilities.js","../src/components/Grid.js","../src/components/Line.js","../src/components/WorldImage.js","../src/components/Text2D.js","../src/materials/UIElementMaterial.js","../src/ui/ui_element_position/ScreenSpacePosition.js","../src/ui/ui_element_position/WorldSpacePosition.js","../src/ui/ui_element_state/UIElementState.js","../src/ui/ui_element_state/OnIdle.js","../src/ui/ui_element_state/OnMouseEnter.js","../src/ui/ui_element_state/OnMouseExit.js","../src/ui/ui_element_state/OnMouseHover.js","../src/components/UIElement.js","../src/components/UpdatableMaterialMesh.js","../src/components/sdf_text/TextGlyph.js","../src/components/sdf_text/SDFText.js","../src/materials/SDFTextMaterial.js","../src/components/sdf_text/SDFTextBatch.js","../src/action_sequencer/VectorInterpolator.js","../src/materials/MedianFilterMaterial.js","../src/render_utilities/MedianFilter.js","../src/materials/DualFilteringBlurMaterial.js","../src/materials/AlphaFilterMaterial.js","../src/render_utilities/DualFilteringBlurrer.js","../src/gpu_particles/ParticleAttribute.js","../src/gpu_particles/GPUParticleSystem.js","../src/materials/gpu_particles/ParticleStorageMaterial.js","../src/gpu_particles/ParticlePositionAttribute.js","../src/data_textures/CustomDataTexture.js","../src/data_textures/RGBDataTexture.js","../src/data_textures/RGBADataTexture.js","../src/data_textures/RGBFloatDataTexture.js","../src/data_textures/RGBAFloatDataTexture.js","../src/static_batcher/BatchedMesh.js","../src/static_batcher/MeshBatcher.js","../src/components/AudioClip.js","../src/resource_loader/AudioLoader.js","../src/resource_loader/BasisLoader.js","../src/resource_loader/CubemapLoader.js","../src/resource_loader/DAELoader.js","../src/resource_loader/FileLoader.js","../src/resource_loader/FontLoader.js","../src/resource_loader/GLTFLoader.js","../src/resource_loader/GLTFDRACOLoader.js","../src/resource_loader/HDRCubeTextureLoader.js","../src/resource_loader/JSONLoader.js","../src/resource_loader/OBJLoader.js","../src/resource_loader/PointArrayLoader.js","../src/resource_loader/RGBETextureLoader.js","../src/resource_loader/TextLoader.js","../src/resource_loader/AsyncTextureLoader.js","../src/resource_loader/TextureLoader.js","../src/resource_loader/VideoLoader.js","../src/resource_loader/ResourceBatch.js"],"sourcesContent":["\nclass Browser\n{\n async init()\n {\n this.browser_name = '';\n this.agent = window.navigator.userAgent.toLowerCase();\n\n this.has_web_xr_support = 'xr' in navigator;\n this.is_vr = this.has_web_xr_support && await navigator.xr.isSessionSupported('immersive-vr');\n\n switch (true)\n {\n case this.agent.indexOf('edge') > -1:\n this.browser_name = 'edge_ie';\n break;\n case this.agent.indexOf('edg') > -1:\n this.browser_name = 'edge_chromium';\n break;\n case this.agent.indexOf('opr') > -1 && !!window.opr:\n this.browser_name = 'opera';\n break;\n case this.agent.indexOf('chrome') > -1 && !!window.chrome:\n this.browser_name = 'chrome';\n break;\n case this.agent.indexOf('trident') > -1:\n this.browser_name = 'iexplorer';\n break;\n case this.agent.indexOf('firefox') > -1:\n this.browser_name = 'firefox';\n break;\n case this.agent.indexOf('safari') > -1:\n this.browser_name = 'safari';\n break;\n default:\n this.browser_name = 'other';\n break;\n }\n\n this.version = this.get_version();\n }\n\n get name()\n {\n return this.browser_name;\n }\n\n get is_safari()\n {\n return this.browser_name === 'safari';\n }\n\n get is_chrome()\n {\n return this.browser_name === 'chrome';\n }\n\n get is_edge()\n {\n return this.browser_name === 'edge_ie';\n }\n\n get is_edge_chromium()\n {\n return this.browser_name === 'edge_chromium';\n }\n\n get has_webm()\n {\n return !!(this.is_chrome || this.is_firefox || this.is_edge_chromium);\n }\n\n get has_hvec()\n {\n return this.is_safari;\n }\n\n get preferred_video_extension()\n {\n return this.has_webm ? 'webm' : this.has_hvec ? 'hvec.mp4' : 'mp4';\n }\n\n get_version()\n {\n const ua = navigator.userAgent;\n let tem = '';\n let version = 0;\n\n let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n\n if (/trident/i.test(M[1]))\n {\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n version = 'IE ' + (tem[1] || '');\n }\n if (M[1] === 'Chrome')\n {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem != null) version = tem.slice(1).join(' ').replace('OPR', 'Opera');\n }\n\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+(\\.\\d+)?)/i)) != null) M.splice(1, 1, tem[1]);\n\n version = M.join(' ');\n\n return Number(version.split(' ')[1]);\n }\n}\n\nconst browser = new Browser();\nexport { browser as Browser };\n","class Validation\n{\n constructor()\n {}\n\n static is_int(n)\n {\n return Number(n) === n && n % 1 === 0;\n }\n\n static is_float(n)\n {\n return Number(n) === n && n % 1 !== 0;\n }\n\n static is_number(n)\n {\n return this.is_int(n) || this.is_float(n);\n }\n\n static is_json(str)\n {\n try\n {\n JSON.parse(str);\n }\n catch (e)\n {\n return false;\n }\n\n return true;\n }\n}\n\nexport { Validation };\n","import { Browser } from '../Browser';\r\nimport { Validation } from '../utilities/Validation';\r\n\r\nclass AbstractLoader\r\n{\r\n constructor(resource_id, url, size = 1)\r\n {\r\n this.resource_id = resource_id;\r\n this.url = url;\r\n this.loaded_bytes = 0;\r\n this.total_bytes = size;\r\n\r\n this.has_finished = false;\r\n this.has_error = false;\r\n this.error_message = 'none';\r\n }\r\n\r\n __update_downloaded_bytes(loaded, total)\r\n {\r\n loaded = Validation.is_number(loaded) ? loaded : 1;\r\n total = Validation.is_number(total) ? total : 1;\r\n\r\n this.loaded_bytes = loaded;\r\n\r\n if (total > 0)\r\n {\r\n this.total_bytes = total;\r\n }\r\n\r\n if (this.loaded_bytes > this.total_bytes)\r\n {\r\n console.warn('Total bytes is smaller than loaded ones. Please set total bytes by hand to:', this.url);\r\n }\r\n }\r\n\r\n __loading_ended()\r\n {\r\n this.has_finished = true;\r\n }\r\n\r\n __set_error(message)\r\n {\r\n this.has_error = true;\r\n this.error_message = message;\r\n }\r\n\r\n print_error()\r\n {\r\n console.error('Error while loading ' + this.resource_id + '\\n\\t path: ' + this.url + '\\n\\t\\t' + this.error_message);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const cache = Browser.is_safari ? 'no-cache' : 'default';\r\n\r\n fetch(this.url, {\r\n method: 'GET', // *GET, POST, PUT, DELETE, etc.\r\n mode: 'cors', // no-cors, *cors, same-origin\r\n cache: cache, // *default, no-cache, reload, force-cache, only-if-cached\r\n credentials: 'same-origin', // include, *same-origin, omit\r\n redirect: 'follow' // manual, *follow, error\r\n })\r\n .then(this.on_progress.bind(this, resource_container))\r\n .catch(this.__on_error.bind(this));\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n async on_progress(resource_container, response)\r\n {\r\n const response_clone = response.clone();\r\n const reader = response.body.getReader();\r\n\r\n // Step 2: get total length\r\n const contentLength = +response.headers.get('Content-Length');\r\n\r\n // Step 3: read the data\r\n let receivedLength = 0; // received that many bytes at the moment\r\n\r\n while (true)\r\n {\r\n const { done, value } = await reader.read();\r\n\r\n if (done)\r\n {\r\n break;\r\n }\r\n\r\n receivedLength += value.length;\r\n\r\n this.__update_downloaded_bytes(receivedLength, contentLength);\r\n // console.log(`Received ${receivedLength} of ${contentLength}`);\r\n }\r\n\r\n this.on_preloaded_finished(resource_container, response_clone);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n }\r\n\r\n __on_error(data)\r\n {\r\n console.error(data);\r\n }\r\n}\r\n\r\nexport { AbstractLoader };\r\n","import { Vector3 } from 'three';\n\nclass OMath\n{\n constructor()\n {}\n\n static linear_map(value,\n from_range_start_value,\n from_range_end_value,\n to_range_start_value,\n to_range_end_value)\n {\n return ((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (to_range_end_value - to_range_start_value) + to_range_start_value;\n }\n\n static between(value, min, max)\n {\n return (value >= min && value <= max);\n }\n\n static mod(number, divisor)\n {\n return ((number % divisor) + divisor) % divisor;\n }\n\n static rgb_to_hex(rgb)\n {\n rgb.r = Math.round(rgb.r * 255).toString(16);\n rgb.g = Math.round(rgb.g * 255).toString(16);\n rgb.b = Math.round(rgb.b * 255).toString(16);\n\n if (rgb.r.length === 1)\n {\n rgb.r = '0' + rgb.r;\n }\n if (rgb.g.length === 1)\n {\n rgb.g = '0' + rgb.g;\n }\n if (rgb.b.length === 1)\n {\n rgb.b = '0' + rgb.b;\n }\n\n return '#' + rgb.r + rgb.g + rgb.b;\n }\n\n static project_points_on_plane(points, plane)\n {\n const projected_point = new Vector3();\n const points_on_plane = [];\n for (let i = 0; i < points.length; i++)\n {\n plane.projectPoint(points[i], projected_point);\n points_on_plane.push(projected_point.clone());\n }\n\n return points_on_plane;\n }\n\n static matrix4_lerp(from, to, target, t)\n {\n for (let i = 0; i < 16; i++)\n {\n target.elements[i] = this.lerp(from.elements[i], to.elements[i], t);\n }\n }\n\n static equals(x1, x2)\n {\n return Math.abs(x1 - x2) < 0.000001;\n }\n\n static lerp(x, y, t)\n {\n return (1 - t) * x + t * y;\n }\n\n static clamp(value, min, max)\n {\n return Math.max(min, Math.min(max, value));\n }\n\n static euclideanModulo(n, m)\n {\n return ((n % m) + m) % m;\n }\n\n static pingpong(x, length = 1)\n {\n return length - Math.abs(OMath.euclideanModulo(x, length * 2) - length);\n }\n\n static degToRad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static radToDeg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static deg_to_rad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static rad_to_deg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static perspective_divide(v)\n {\n v.x /= v.w;\n v.y /= v.w;\n v.z /= v.w;\n return v;\n }\n\n static points_average(points)\n {\n const center = points[0].clone();\n for (let i = 1; i < points.length; i++)\n {\n center.add(points[i]);\n }\n center.multiplyScalar(1 / points.length);\n return center;\n }\n\n static get_random_color()\n {\n const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];\n\n let col = '#';\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n return col;\n }\n\n static saturate(x)\n {\n return OMath.clamp(x, 0, 1);\n }\n}\n\nexport { OMath };\n","\nimport { OMath } from '../utilities/OMath';\n\nclass ActionSequencer\n{\n constructor(context = {})\n {\n this.previous_elapsed_time = -0.00001;\n this.elapsed_time = -0.00001;\n this.playback_speed = this.__get_playback_speed();\n this.playing = true;\n\n this.action_events = [];\n this.context = context;\n\n this.initial_context = JSON.parse(JSON.stringify(context));\n\n this.tmp_t = 0;\n\n this.channels = {};\n\n const channel_names = Object.keys(context);\n for (let i = 0; i < channel_names.length; i++)\n {\n this.channels[channel_names[i]] = [];\n }\n\n this.duration = 0;\n }\n\n play()\n {\n this.playing = true;\n }\n\n stop()\n {\n this.playing = false;\n }\n\n reset()\n {\n this.elapsed_time = -0.00001;\n }\n\n skip()\n {\n const duration = this.get_duration();\n this.__play_clips(this.elapsed_time, duration + 0.0001);\n this.elapsed_time = duration;\n }\n\n update(delta_time)\n {\n if (this.playing)\n {\n this.previous_elapsed_time = this.elapsed_time;\n this.elapsed_time += delta_time * this.playback_speed;\n this.__play_clips(this.previous_elapsed_time, this.elapsed_time);\n }\n }\n\n set_progress(time)\n {\n this.previous_elapsed_time = this.elapsed_time;\n this.elapsed_time = OMath.clamp(time, 0, this.duration);\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n set_normalized_progress(t)\n {\n this.previous_elapsed_time = this.elapsed_time;\n this.elapsed_time = OMath.clamp(t, 0, 1) * this.duration;\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n get_progress()\n {\n return OMath.clamp(this.elapsed_time / this.get_duration(), 0, 1);\n }\n\n is_finished()\n {\n return this.elapsed_time > this.get_duration();\n }\n\n add_action_event(trigger_time, action)\n {\n this.action_events.push({\n trigger_time: trigger_time,\n action: action\n });\n\n this.duration = Math.max(this.duration, trigger_time);\n }\n\n add_action_interpolator(from, to, interpolator, use_dynamic_from_value = false)\n {\n if (use_dynamic_from_value)\n {\n const keyframes = this.channels[interpolator.attribute_name];\n\n if (keyframes === undefined)\n {\n console.error(`${interpolator.attribute_name} missing in initial state data.`);\n }\n\n if (keyframes.length === 0)\n {\n interpolator.from = this.initial_context[interpolator.attribute_name];\n }\n else\n {\n interpolator.from = keyframes[keyframes.length - 1].interpolator.to;\n }\n }\n\n const keyframe = {\n from: from,\n to: to,\n interpolator: interpolator\n };\n\n this.duration = Math.max(this.duration, to);\n this.channels[interpolator.attribute_name].push(keyframe);\n }\n\n get_current_target_value(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n\n if (this.elapsed_time < keyframe.from)\n {\n return keyframe.interpolator.evaluate(0);\n }\n\n return keyframe.interpolator.evaluate(1);\n }\n\n get_current_starting_value(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n\n return keyframe.interpolator.evaluate(0);\n }\n\n get_current_progress(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n const t = this.__linear_map_01(this.elapsed_time, keyframe.from, keyframe.to);\n\n return keyframe.interpolator.easing_function(t);\n }\n\n get_duration()\n {\n return this.duration;\n }\n\n __play_clips(from, to)\n {\n if (this.elapsed_time > this.previous_elapsed_time)\n {\n this.__play_events(this.previous_elapsed_time, this.elapsed_time);\n }\n const channel_names = Object.keys(this.initial_context);\n\n for (let i = 0; i < channel_names.length; i++)\n {\n const name = channel_names[i];\n const keyframe = this.__get_current_keyframe(name, from);\n\n this.context[name] = this.evaluate_keyframe(keyframe, from);\n }\n }\n\n __play_events(from, to)\n {\n for (let i = 0; i < this.action_events.length; i++)\n {\n const trigger_time = this.action_events[i].trigger_time;\n if (OMath.between(trigger_time, from, to))\n {\n console.log('Play event: ' + this.action_events[i].action.constructor.name + ' at ' + this.action_events[i].trigger_time);\n this.action_events[i].action.trigger();\n }\n }\n }\n\n evaluate_keyframe(keyframe, time)\n {\n this.tmp_t = this.__linear_map_01(time, keyframe.from, keyframe.to);\n\n return keyframe.interpolator.evaluate(OMath.clamp(this.tmp_t, 0, 1));\n }\n\n get_keyframes(channel_name)\n {\n return this.channels[channel_name];\n }\n\n is_channel_redefined(channel_name)\n {\n for (let i = 0; i < this.channels[channel_name].length; i++)\n {\n const keyframe = this.channels[channel_name][i];\n\n if (keyframe.interpolator.initial)\n {\n return false;\n }\n }\n\n return true;\n }\n\n __linear_map_01(value,\n from_range_start_value,\n from_range_end_value)\n {\n return OMath.saturate(((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (1 - 0) + 0);\n }\n\n __get_current_keyframe(channel_name, time)\n {\n let current = undefined;\n\n const keyframes = this.channels[channel_name];\n\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n\n if (time >= keyframe.from && time <= keyframe.to)\n {\n current = keyframe;\n return current;\n }\n }\n\n let min = Infinity;\n\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n const distance = Math.abs(keyframe.to - time);\n\n if (distance < min)\n {\n current = keyframe;\n min = distance;\n }\n }\n\n return current;\n }\n\n __get_playback_speed()\n {\n const url_params = new URLSearchParams(window.location.search);\n\n const transitions_velocity = url_params.get('transitions_velocity');\n\n if (transitions_velocity)\n {\n return Number(transitions_velocity);\n }\n else\n {\n return 1;\n }\n }\n}\n\nexport { ActionSequencer };\n","class EasingFunctions\n{\n constructor()\n {}\n\n static linear(x)\n {\n return x;\n }\n\n static triangular(x)\n {\n return 1 - Math.abs((x * 2) % (1 * 2) - 1);\n }\n\n static ease_in_sine(x)\n {\n return 1 - Math.cos(x * 3.1415926 / 2);\n }\n\n static ease_out_sine(x)\n {\n return Math.sin(x * 3.1415926 / 2);\n }\n\n static ease_in_out_sine(x)\n {\n return -(Math.cos(3.1415926 * x) - 1) / 2;\n }\n\n static ease_in_cubic(x)\n {\n return x * x * x;\n }\n\n static ease_out_cubic(x)\n {\n return 1 - Math.pow(1 - x, 3);\n }\n\n static ease_in_out_cubic(x)\n {\n return x < 0.5\n ? 4 * x * x * x\n : 1 - Math.pow(-2 * x + 2, 3) / 2;\n }\n\n static ease_in_quad(x)\n {\n return x * x;\n }\n\n static ease_out_quad(x)\n {\n return 1 - (1 - x) * (1 - x);\n }\n\n static ease_in_out_quad(x)\n {\n return x < 0.5\n ? 2 * x * x\n : 1 - Math.pow(-2 * x + 2, 2) / 2;\n }\n\n static ease_in_quart(x)\n {\n return x * x * x * x;\n }\n\n static ease_out_quart(x)\n {\n return 1 - Math.pow(1 - x, 4);\n }\n\n static ease_in_out_quart(x)\n {\n return x < 0.5\n ? 8 * x * x * x * x\n : 1 - Math.pow(-2 * x + 2, 4) / 2;\n }\n\n static ease_in_quint(x)\n {\n return x * x * x * x * x;\n }\n\n static ease_out_quint(x)\n {\n return 1 - Math.pow(1 - x, 5);\n }\n\n static ease_in_out_quint(x)\n {\n return x < 0.5\n ? 16 * x * x * x * x * x\n : 1 - Math.pow(-2 * x + 2, 5) / 2;\n }\n\n static ease_in_expo(x)\n {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n }\n\n static ease_out_expo(x)\n {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n }\n\n static ease_in_out_expo(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n }\n\n static ease_in_circ(x)\n {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n }\n\n static ease_out_circ(x)\n {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n }\n\n static ease_in_out_circ(x)\n {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n }\n\n static ease_in_back(x)\n {\n return 2.7015 * x * x * x - 1.7015 * x * x;\n }\n\n static ease_out_back(x)\n {\n return 1 + 2.7015 * Math.pow(x - 1, 3) + 1.7015 * Math.pow(x - 1, 2);\n }\n\n static ease_in_out_back(x)\n {\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((2.5949095 + 1) * 2 * x - 2.5949095)) / 2\n : (Math.pow(2 * x - 2, 2) * ((2.5949095 + 1) * (x * 2 - 2) + 2.5949095) + 2) / 2;\n }\n\n static ease_in_elastic(x)\n {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n }\n\n static ease_out_elastic(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * 2.0943950) + 1;\n }\n\n static ease_in_out_elastic(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * 1.3962633)) / 2\n : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * 1.3962633) / 2 + 1;\n }\n\n static ease_in_bounce(x)\n {\n return 1 - this.ease_out_bounce(1 - x);\n }\n\n static ease_out_bounce(x)\n {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1)\n {\n return n1 * x * x;\n }\n else if (x < 2 / d1)\n {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n }\n else if (x < 2.5 / d1)\n {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n }\n else\n {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n }\n\n static ease_in_out_bounce(x)\n {\n return x < 0.5\n ? (1 - this.ease_out_bounce(1 - 2 * x)) / 2\n : (1 + this.ease_out_bounce(2 * x - 1)) / 2;\n }\n\n static heartbeat(t)\n {\n return 1.0 - Math.pow(Math.abs(Math.sin(t + 1.0)), 63.0) * Math.sign(Math.sin(t)) * Math.sin(t + 1.5 + 1.0) * 0.8;\n }\n}\n\nexport { EasingFunctions };\n","import { EasingFunctions } from '../utilities/EasingFunctions';\n\nclass ActionInterpolator\n{\n constructor(easing_function = 'linear')\n {\n this.easing_function = undefined;\n\n if (typeof easing_function === 'string')\n {\n this.easing_function = EasingFunctions[easing_function];\n }\n else\n {\n this.easing_function = easing_function;\n }\n }\n\n update(context, t)\n {\n\n }\n}\n\nexport { ActionInterpolator };\n","import { ActionInterpolator } from './ActionInterpolator';\nimport { OMath } from '../utilities/OMath';\n\nclass NumberInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, initial = false, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n this.initial = initial;\n }\n\n update(context, t)\n {\n context[this.attribute_name] = OMath.lerp(this.from, this.to, this.easing_function(t));\n }\n\n evaluate(t)\n {\n return OMath.lerp(this.from, this.to, this.easing_function(t));\n }\n}\n\nexport { NumberInterpolator };\n","class ViewContext\n{\n constructor()\n {\n this.app = undefined;\n }\n\n set_app(app)\n {\n this.app = app;\n }\n}\n\nconst view_context = new ViewContext();\nexport { view_context as ViewContext };\n","import { ViewContext } from '../view_components/ViewContext';\n\nclass ActionEvent\n{\n constructor(name, method, args)\n {\n this.name = name;\n this.method = method;\n this.args = args;\n }\n\n trigger()\n {\n ViewContext.app[this.name][this.method](...this.args.split(','));\n }\n}\n\nexport { ActionEvent };\n","class DrawIOAnimationSheet\n{\n constructor()\n {\n\n }\n\n parse(xml_document)\n {\n const doc = new DOMParser().parseFromString(xml_document, 'text/xml');\n\n const animation_nodes = doc.querySelectorAll('mxGeometry');\n\n const animation_tracks = [];\n const triggers = [];\n\n for (let i = 0; i < animation_nodes.length; i++)\n {\n const node = animation_nodes[i];\n const parent_node = node.parentElement;\n const data = parent_node.getAttribute('value');\n\n const x_pos = this.get_node_x_position(node);\n\n const from = x_pos / 100;\n const duration = parseFloat(node.getAttribute('width')) / 100;\n\n // is trigger\n if (parent_node.getAttribute('style').includes('rhombus;'))\n {\n const split_data = data.split('.');\n const trigger_name = split_data[0];\n const trigger_method = split_data[1];\n\n triggers.push({\n name: trigger_name,\n method: trigger_method,\n at_time: from + duration * 0.5\n });\n }\n\n const valid_element = parent_node.getAttribute('style').includes('rounded=0;') &&\n !parent_node.getAttribute('style').includes('text;');\n\n if (valid_element && data !== '' && !data.includes(' '))\n {\n const split_data = data.split('=');\n\n const attribute_name = split_data[0];\n\n const value_data = split_data[1].split('--');\n const to_value = parseFloat(value_data[0]);\n const easing_function = value_data[1];\n\n if (split_data.length !== 2)\n {\n console.error('DrawIO data is malformed:', data);\n }\n\n if (value_data.length !== 2)\n {\n console.error('DrawIO data is malformed:', data);\n }\n\n animation_tracks.push({\n attribute_name: attribute_name,\n from_time: from,\n to_time: from + duration,\n to_value: to_value,\n easing_function: easing_function\n });\n }\n }\n\n animation_tracks.sort((a, b) =>\n {\n return a.from_time - b.from_time;\n });\n return {\n animation_tracks: animation_tracks,\n triggers: triggers\n };\n }\n\n get_node_x_position(node)\n {\n const x_pos = node.getAttribute('x');\n return x_pos === null ? 0 : parseFloat(x_pos);\n }\n}\n\nexport { DrawIOAnimationSheet };\n","import { ActionSequencer } from '../../action_sequencer/ActionSequencer';\nimport { NumberInterpolator } from '../../action_sequencer/NumberInterpolator';\nimport { ActionEvent } from '../../action_sequencer/ActionEvent';\nimport { DrawIOAnimationSheet } from './DrawIOAnimationSheet';\n\nclass ActionSequencerBuilder\n{\n constructor(default_state_data)\n {\n this.default_state_data = default_state_data;\n }\n\n from_animation_sheet(animation_data, current_context, initial_context)\n {\n initial_context = initial_context || this.default_state_data;\n const tracks = animation_data.animation_tracks;\n const triggers = animation_data.triggers;\n\n const initial_tracks = this.state_to_tracks(this.default_state_data, this.get_longest_time(animation_data.animation_tracks));\n\n for (let i = 0; i < initial_tracks.length; i++)\n {\n if (tracks.find(element => element.attribute_name === initial_tracks[i].attribute_name) === undefined)\n {\n tracks.push(initial_tracks[i]);\n }\n }\n\n const sequencer = new ActionSequencer(current_context);\n\n for (let i = 0; i < tracks.length; i++)\n {\n const t = tracks[i];\n const interpolator = new NumberInterpolator(\n t.attribute_name,\n current_context[t.attribute_name],\n t.to_value,\n t.initial,\n t.easing_function\n );\n\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\n }\n\n for (let i = 0; i < triggers.length; i++)\n {\n const t = triggers[i];\n const action_event = new ActionEvent(t.name, t.method, t.args);\n sequencer.add_action_event(t.at_time, action_event);\n }\n\n return sequencer;\n }\n\n state_to_tracks(state, longest_time)\n {\n const tracks = [];\n\n const keys = Object.keys(state);\n\n for (let i = 0; i < keys.length; i++)\n {\n tracks.push({\n attribute_name: keys[i],\n from_time: 0,\n to_time: longest_time < 1 ? longest_time : 1,\n to_value: state[keys[i]],\n initial: true,\n easing_function: 'ease_in_out_cubic'\n });\n }\n\n return tracks;\n }\n\n from_draw_io(xml, context)\n {\n const transition_data = (new DrawIOAnimationSheet()).parse(xml);\n const tracks = transition_data.animation_tracks;\n const triggers = transition_data.triggers;\n const sequencer = new ActionSequencer(context);\n\n for (let i = 0; i < tracks.length; i++)\n {\n const t = tracks[i];\n const interpolator = new NumberInterpolator(\n t.attribute_name,\n context[t.attribute_name],\n t.to_value,\n t.initial,\n t.easing_function\n );\n\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\n }\n\n for (let i = 0; i < triggers.length; i++)\n {\n const t = triggers[i];\n const action_event = new ActionEvent(t.name, t.method);\n sequencer.add_action_event(t.at_time, action_event);\n }\n\n return sequencer;\n }\n\n get_longest_time(tracks)\n {\n let longest_time = -1;\n\n for (let i = 0; i < tracks.length; i++)\n {\n const track = tracks[i];\n\n const track_time = track.to_time;\n\n longest_time = track_time > longest_time ? track_time : longest_time;\n }\n\n return longest_time;\n }\n}\n\nexport { ActionSequencerBuilder };\n","class EventManager\n{\n init()\n {\n this.queue = {};\n\n this.zoom_changed_evt = 'zoom_changed';\n this.store_clickd_evt = 'store_clicked';\n this.point_selected_evt = 'point_selected';\n this.config_changed = 'config_changed';\n\n this.path_substep_completed = 'path_substep_completed';\n this.path_completed = 'path_completed';\n this.go_to_store_requested_evt = 'go_to_store_requested';\n\n this.resource_loaded_evt = 'resource_loaded';\n this.service_clicked_evt = 'service_clicked';\n this.unit_pos_updated_evt = 'unit_position_updated';\n\n this.floor_changed_evt = 'floor_changed';\n\n this.on_enter_floor_navigation = 'on_enter_floor_navigation';\n this.on_exit_floor_navigation = 'on_exit_floor_navigation';\n\n this.on_enter_floor_selection = 'on_enter_floor_selection';\n this.on_exit_floor_selection = 'on_exit_floor_selection';\n\n this.on_enter_outside_navigation = 'on_enter_outside_navigation';\n this.on_exit_outside_navigation = 'on_exit_outside_navigation';\n\n this.step_selected_evt = 'step_selected';\n }\n\n fire(event, payload)\n {\n const queue = this.queue[event];\n\n if (queue === undefined)\n {\n return;\n }\n let i = queue.length;\n while (i--)\n {\n queue[i](payload);\n }\n }\n\n on(event, callback)\n {\n if (typeof this.queue[event] === 'undefined')\n {\n this.queue[event] = [];\n }\n\n this.queue[event].push(callback);\n }\n\n fire_zoom_changed(zoom)\n {\n this.fire(this.zoom_changed_evt, zoom);\n }\n\n fire_store_selected(store_id)\n {\n this.fire(this.store_clickd_evt, store_id);\n }\n\n fire_point_selected(hit_data)\n {\n this.fire(this.point_selected_evt, hit_data);\n }\n\n fire_config_changed()\n {\n this.fire(this.config_changed);\n }\n\n fire_path_substep_completed(step_number)\n {\n this.fire(this.path_substep_completed, step_number);\n }\n\n fire_path_completed()\n {\n this.fire(this.path_completed);\n }\n\n fire_step_selected(step_index)\n {\n this.fire(this.step_selected_evt, step_index);\n }\n\n fire_go_to_store_requested(store_id)\n {\n this.fire(this.go_to_store_requested_evt, store_id);\n }\n\n fire_resource_loaded(resource)\n {\n this.fire(this.resource_loaded_evt, resource);\n }\n\n fire_service_clicked(service)\n {\n this.fire(this.service_clicked_evt, service);\n }\n\n fire_unit_position_updated(unit_data)\n {\n this.fire(this.unit_pos_updated_evt, unit_data);\n }\n\n fire_floor_switched(floor_id)\n {\n this.fire(this.floor_changed_evt, floor_id);\n }\n\n fire_on_enter_floor_navigation(state)\n {\n this.fire(this.on_enter_floor_navigation, state);\n }\n\n fire_on_exit_floor_navigation(state)\n {\n this.fire(this.on_exit_floor_navigation, state);\n }\n\n fire_on_enter_floor_selection(state)\n {\n this.fire(this.on_enter_floor_selection, state);\n }\n\n fire_on_exit_floor_selection(state)\n {\n this.fire(this.on_exit_floor_selection, state);\n }\n\n fire_on_enter_outside_navigation(state)\n {\n this.fire(this.on_enter_outside_navigation, state);\n }\n\n fire_on_exit_outside_navigation(state)\n {\n this.fire(this.on_exit_outside_navigation, state);\n }\n}\n\nconst event_manager = new EventManager();\nexport { event_manager as EventManager };\n","import { EventManager } from './EventManager';\n\nclass ResourceContainer\n{\n init()\n {\n this.resources = {};\n this.resources_by_url = {};\n }\n\n set_resource(name, url, resource)\n {\n const urls = Object.keys(this.resources_by_url);\n\n if (urls.includes(url))\n {\n this.resources[name] = this.resources_by_url[url];\n }\n else\n {\n this.resources[name] = resource;\n this.resources_by_url[url] = resource;\n }\n\n EventManager.fire_resource_loaded({ name: name, value: resource });\n }\n\n get_resource(name)\n {\n return this.resources[name];\n }\n\n get(name)\n {\n return this.resources[name];\n }\n}\n\nconst resource_container = new ResourceContainer();\nexport { resource_container as ResourceContainer };\n","class HTMLUtilities\n{\n static load_images(container)\n {\n const images = container.querySelectorAll('img');\n\n for (let i = 0; i < images.length; i++)\n {\n const image = images[i];\n\n if (image.dataset.src)\n {\n image.src = image.dataset.src;\n }\n }\n\n const image_objects = container.querySelectorAll('object');\n\n for (let i = 0; i < image_objects.length; i++)\n {\n const image_object = image_objects[i];\n\n if (image_object.dataset.src)\n {\n image_object.data = image_object.dataset.src;\n }\n }\n }\n\n static load_videos(container)\n {\n const videos = container.querySelectorAll('video');\n\n for (let i = 0; i < videos.length; i++)\n {\n const video = videos[i];\n\n if (video.dataset.src)\n {\n video.src = video.dataset.src;\n }\n }\n }\n\n static load_iframes(container)\n {\n const iframes = container.querySelectorAll('iframe');\n\n for (let i = 0; i < iframes.length; i++)\n {\n const iframe = iframes[i];\n\n if (iframe.dataset.src)\n {\n iframe.src = iframe.dataset.src;\n }\n }\n }\n\n static load_elements(container, selector)\n {\n const elements = container.querySelectorAll(selector);\n\n for (let i = 0; i < elements.length; i++)\n {\n const element = elements[i];\n\n if (element.dataset.src)\n {\n element.src = element.dataset.src;\n }\n }\n }\n}\n\nexport { HTMLUtilities };\n","import { ActionSequencerBuilder } from './ActionSequencerBuilder';\n\nclass TransitionTable\n{\n constructor()\n {\n this.transitions = [];\n this.default_state_data = {};\n }\n\n get(from_state_name, to_state_name, current_context)\n {\n for (let i = 0; i < this.transitions.length; i++)\n {\n if (this.transitions[i].from === from_state_name && this.transitions[i].to === to_state_name)\n {\n const action_sequencer = new ActionSequencerBuilder(this.default_state_data).from_animation_sheet(this.transitions[i].data, current_context);\n return action_sequencer;\n }\n }\n\n for (let i = 0; i < this.transitions.length; i++)\n {\n if (this.transitions[i].to === to_state_name && this.transitions[i].from === undefined)\n {\n const action_sequencer = new ActionSequencerBuilder(this.default_state_data).from_animation_sheet(this.transitions[i].data, current_context);\n return action_sequencer;\n }\n }\n\n console.error('TransitionTable.get no data found for: ', from_state_name, to_state_name);\n return undefined;\n }\n\n add_transitions(transitions)\n {\n for (let i = 0; i < transitions.length; i++)\n {\n this.transitions.push(transitions[i]);\n }\n }\n\n set_transitions(transitions)\n {\n this.transitions = transitions;\n }\n\n set_default_state_data(default_state_data)\n {\n this.default_state_data = default_state_data;\n }\n}\n\nexport { TransitionTable };\n","import { Vector2 } from 'three';\nimport { Clock } from 'three';\n\nclass Time\n{\n constructor()\n {\n this.__delta_buffer = [0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016];\n }\n\n init()\n {\n this.___time = new Clock();\n this.__delta_time = 0;\n this.__smooth_delta_time = 0;\n this.__elapsed_time = 0;\n this.__allocated_time = new Vector2(0, 0);\n this.__frame_interpolation_t = 0;\n this.fixed_delta_time = 1 / 30;\n }\n\n get elapsed_time()\n {\n return this.__elapsed_time;\n }\n\n get delta_time()\n {\n return this.__delta_time;\n }\n\n get smooth_delta_time()\n {\n return this.__smooth_delta_time;\n }\n\n get shader_time()\n {\n this.__allocated_time.x = this.delta_time;\n this.__allocated_time.y = this.elapsed_time;\n return this.__allocated_time;\n }\n\n get frame_interpolation()\n {\n return this.__frame_interpolation_t;\n }\n\n get fdt()\n {\n return this.fixed_delta_time;\n }\n\n get dt()\n {\n return this.delta_time;\n }\n\n get sdt()\n {\n return this.smooth_delta_time;\n }\n\n __set_frame_interpolation(value)\n {\n this.__frame_interpolation_t = value;\n }\n\n __update()\n {\n this.__delta_time = this.___time.getDelta();\n this.__elapsed_time = this.___time.getElapsedTime();\n\n this.__delta_buffer.shift();\n this.__delta_buffer.push(this.delta_time < 0.32 ? this.delta_time : 0.032);\n\n this.__calculate_smooth_delta_time();\n }\n\n __calculate_smooth_delta_time()\n {\n this.__smooth_delta_time = 0;\n\n for (let i = 0; i < this.__delta_buffer.length; i++)\n {\n this.__smooth_delta_time += this.__delta_buffer[i];\n }\n\n this.__smooth_delta_time = this.__smooth_delta_time / this.__delta_buffer.length;\n }\n}\n\nconst time = new Time();\nexport { time as Time };\n","class ViewState\n{\n constructor(name)\n {\n this.name = name;\n }\n\n start()\n {\n }\n\n show()\n {\n }\n\n hide()\n {\n }\n\n before_enter()\n {\n }\n\n on_enter()\n {\n }\n\n before_update()\n {\n }\n\n update()\n {\n }\n\n fixed_update()\n {\n }\n\n update_enter_transition(global_view_data, transition_progress, action_sequencer)\n {\n // Backward compatibility. It will be removed in future releases.\n this.update_transition(global_view_data, transition_progress, action_sequencer);\n }\n\n update_exit_transition(global_view_data, transition_progress, action_sequencer)\n {\n }\n\n // Deprecated\n update_transition(global_view_data, transition_progress, action_sequencer)\n {\n }\n\n before_exit()\n {\n }\n\n on_exit()\n {\n }\n}\n\nexport { ViewState };\n","import { Time } from '../../Time';\nimport { ViewState } from '../ViewState';\n\nclass ViewStateTransitionHandler\n{\n constructor(transition_table)\n {\n this.last_state = new ViewState();\n this.current_state = new ViewState();\n\n this.default_state_data = {};\n this.current_state_data = {};\n\n this.transition_table = transition_table;\n\n this.transitioning = false;\n }\n\n go_to_state(state, skip = false)\n {\n if (this.transitioning)\n {\n this.__exit_last_state();\n }\n\n this.last_state = this.current_state;\n this.current_state = state;\n\n this.last_state.before_exit();\n this.current_state.show();\n\n this.action_sequencer = this.transition_table.get(this.last_state.name, this.current_state.name, this.current_state_data);\n this.current_state.before_enter();\n\n this.action_sequencer.play();\n\n this.transitioning = true;\n\n if (skip)\n {\n this.action_sequencer.skip();\n this.update();\n }\n }\n\n update()\n {\n if (this.transitioning)\n {\n this.__update_transitions();\n\n if (this.action_sequencer.is_finished())\n {\n this.transitioning = false;\n\n this.__update_transitions();\n\n this.__exit_last_state();\n\n this.current_state.on_enter();\n }\n }\n else\n {\n this.current_state.update();\n }\n }\n\n before_update()\n {\n this.current_state.before_update();\n }\n\n fixed_update()\n {\n this.current_state.fixed_update();\n }\n\n set_state(state)\n {\n this.current_state = state;\n }\n\n set_default_state_data(default_state_data)\n {\n Object.assign(this.default_state_data, default_state_data);\n Object.assign(this.current_state_data, default_state_data);\n }\n\n __update_transitions()\n {\n this.action_sequencer.update(Time.delta_time);\n this.last_state.update_exit_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\n this.current_state.update_enter_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\n }\n\n __exit_last_state()\n {\n if (this.last_state.name !== this.current_state.name)\n {\n this.last_state.hide();\n }\n\n this.last_state.on_exit();\n }\n}\n\nexport { ViewStateTransitionHandler };\n","import { TransitionTable } from './transition/TransitionTable';\nimport { ViewStateTransitionHandler } from './transition/ViewStateTransitionHandler';\n\nclass ViewManager\n{\n constructor()\n {\n this.views = [];\n\n this.transition_table = new TransitionTable();\n this.transition_handler = new ViewStateTransitionHandler(this.transition_table);\n\n this.view_change_subscribers = [];\n\n this.browser_title_suffix = '';\n }\n\n before_update()\n {\n this.transition_handler.before_update();\n }\n\n update()\n {\n this.transition_handler.update();\n\n this.__set_views_opacities();\n }\n\n fixed_update()\n {\n this.transition_handler.fixed_update();\n }\n\n go_to_view(view_name, change_url = true, skip = false)\n {\n const v = this.get(view_name);\n this.transition_handler.go_to_state(v, skip);\n\n if (change_url)\n {\n this.__change_browser_url(v.url);\n this.__change_browser_title(v.url);\n }\n\n this.notify_view_change(view_name);\n }\n\n go_to_scene(scene_name, change_url = false, skip = false)\n {\n const next_view = this.get(scene_name);\n const transition_view = this.get('transition');\n\n transition_view.set_next_view(next_view);\n this.go_to_view(transition_view.name, change_url, skip);\n }\n\n subscribe_to_view_change(subscriber)\n {\n this.view_change_subscribers.push(subscriber);\n }\n\n notify_view_change(view_name)\n {\n for (let i = 0; i < this.view_change_subscribers.length; i++)\n {\n const subscriber = this.view_change_subscribers[i];\n subscriber.on_view_change(view_name);\n }\n }\n\n register_view(view)\n {\n this.views.push(view);\n }\n\n has_view(view_name)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].name === view_name)\n {\n return true;\n }\n }\n return false;\n }\n\n add_transitions(transitions)\n {\n this.transition_table.add_transitions(transitions);\n }\n\n set_transitions(transitions)\n {\n this.transition_table.set_transitions(transitions);\n }\n\n set_view(view_name)\n {\n const view = this.get(view_name);\n\n this.transition_handler.set_state(view);\n }\n\n set_browser_title_suffix(title_suffix)\n {\n this.browser_title_suffix = title_suffix;\n }\n\n get_current_view()\n {\n return this.transition_handler.current_state;\n }\n\n get_view_by_name(view_name)\n {\n console.warn('DEPRECATED. Use ViewManager.get instead');\n this.get(view_name);\n }\n\n get(view_name)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].name === view_name)\n {\n return this.views[i];\n }\n }\n console.error('[ViewManager.get] no view found for: ', view_name);\n return undefined;\n }\n\n get_view_by_url(url)\n {\n console.warn('DEPRECATED. Use ViewManager.get_by_url instead');\n this.get_by_url(url);\n }\n\n get_by_url(url)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].url === url)\n {\n return this.views[i];\n }\n }\n console.error('[ViewManager.get_by_url] no view found for: ', url);\n return undefined;\n }\n\n set_default_state_data(default_state_data)\n {\n this.transition_table.set_default_state_data(default_state_data);\n this.transition_handler.set_default_state_data(default_state_data);\n }\n\n __change_browser_url(url)\n {\n window.history.pushState('', '', url);\n }\n\n __change_browser_title(name)\n {\n const title = this.__capitalize(name);\n\n document.title = title ? `${title} | ${this.browser_title_suffix}` : this.browser_title_suffix;\n }\n\n __set_views_opacities()\n {\n for (let i = 0; i < this.views.length; i++)\n {\n this.views[i].set_opacity(this.transition_handler.current_state_data);\n }\n }\n\n __capitalize(string)\n {\n let aux_string = string.toUpperCase().replace('/', '');\n aux_string = this.__snake_to_whitespace(aux_string);\n\n return aux_string;\n }\n\n __snake_to_whitespace(string)\n {\n return string.replace(\n /([-_][A-Z])/g,\n (group) => group\n .replace('-', ' ')\n .replace('_', ' ')\n );\n }\n}\n\nconst view_manager = new ViewManager();\nexport { view_manager as ViewManager };\n","import { ResourceContainer } from '../ResourceContainer';\nimport { HTMLUtilities } from '../utilities/HTMLUtilities';\nimport { ViewManager } from './ViewManager';\nimport { ViewState } from './ViewState';\n\nclass ApplicationView extends ViewState\n{\n constructor({ name, url, container })\n {\n super(name);\n\n this.container = container;\n this.url = url;\n\n let transition_data = ResourceContainer.get(`${name}_data`);\n\n transition_data = transition_data || {\n animation_tracks: [],\n triggers: []\n };\n\n const transitions = [\n {\n to: name,\n data: transition_data\n }\n ];\n\n ViewManager.register_view(this);\n ViewManager.add_transitions(transitions);\n }\n\n show()\n {\n this.container.classList.add('before_enter');\n this.container.classList.remove('before_exit');\n this.container.classList.remove('hidden');\n }\n\n on_enter()\n {\n this.container.classList.remove('before_enter');\n this.container.classList.remove('before_exit');\n this.container.classList.remove('hidden');\n }\n\n before_exit()\n {\n this.container.classList.add('before_exit');\n this.container.classList.remove('before_enter');\n this.container.classList.remove('hidden');\n }\n\n hide()\n {\n this.container.classList.add('hidden');\n this.container.classList.remove('before_enter');\n this.container.classList.remove('before_exit');\n }\n\n load_html_images()\n {\n HTMLUtilities.load_images(this.container);\n }\n\n load_html_videos()\n {\n HTMLUtilities.load_videos(this.container);\n }\n\n set_opacity(current_state_data)\n {\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\n }\n}\n\nexport { ApplicationView };\n","class BaseApplication\n{\n on_post_start()\n {}\n\n on_enter()\n {}\n\n on_exit()\n {}\n\n before_update()\n {}\n\n update()\n {}\n\n fixed_update()\n {}\n\n on_post_render()\n {}\n\n on_pre_render()\n {}\n\n on_frame_end()\n {}\n}\n\nexport { BaseApplication };\n","class BaseRender\n{\n constructor()\n {\n\n }\n\n render()\n {\n\n }\n\n on_enter(context, renderer)\n {\n\n }\n\n on_exit(context, renderer)\n {\n\n }\n\n resize()\n {\n\n }\n\n dispose()\n {\n\n }\n}\n\nexport { BaseRender };\n","import basic_vert from '../shaders/basic_color/basic_color.vert';\nimport basic_frag from '../shaders/basic_color/basic_color.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\n\nclass BaseShaderMaterial extends ShaderMaterial\n{\n constructor(vert, frag, uniforms)\n {\n super({\n vertexShader: vert || basic_vert,\n fragmentShader: frag || basic_frag,\n uniforms: uniforms || {\n _Color: { value: new Color('#FF0000') }\n }\n });\n }\n}\n\nexport { BaseShaderMaterial };\n","import vert from '../shaders/copy/copy.vert';\nimport frag from '../shaders/copy/copy.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { Vector2 } from 'three';\nimport { NoBlending } from 'three';\nimport { AlwaysDepth } from 'three';\n\nclass BlitMaterial extends ShaderMaterial\n{\n constructor(frag_shader, vert_shader, defines)\n {\n super({\n uniforms: {\n _MainTex: { value: null },\n _Resolution: { value: new Vector2(0, 0) },\n _TargetResolution: { value: new Vector2(0, 0) }\n },\n defines: defines || {},\n vertexShader: vert_shader || vert,\n fragmentShader: frag_shader || frag,\n depthWrite: false,\n blending: NoBlending,\n depthTest: false,\n depthFunc: AlwaysDepth\n });\n }\n}\n\nexport { BlitMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/add/add.frag';\n\nclass AddMaterial extends BlitMaterial\n{\n constructor(nMips)\n {\n super(frag);\n\n this.uniforms._SecondTex = { value: undefined };\n }\n\n set_add_texture(tex)\n {\n this.uniforms._SecondTex.value = tex;\n }\n}\n\nexport { AddMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/gaussian_blur/unreal_bloom_compose.frag';\n\nimport { Color } from 'three';\nclass UnrealBloomComposeMaterial extends BlitMaterial\n{\n constructor(nMips)\n {\n super(frag, undefined, {\n NUM_MIPS: nMips\n });\n this.uniforms._MainTex = { value: undefined };\n this.uniforms._BlurredTex = { value: undefined };\n this.uniforms._BloomStrength = { value: 1 };\n\n this.uniforms.blurTexture1 = { value: null };\n this.uniforms.blurTexture2 = { value: null };\n this.uniforms.blurTexture3 = { value: null };\n this.uniforms.blurTexture4 = { value: null };\n this.uniforms.blurTexture5 = { value: null };\n\n this.uniforms.bloomStrength = { value: 1.0 };\n this.uniforms.bloomFactors = { value: [1.0, 0.8, 0.6, 0.4, 0.2] };\n this.uniforms.bloomRadius = { value: 0.0 };\n\n const bloomTintColors = [\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF')\n ];\n\n this.uniforms.bloomTintColors = { value: bloomTintColors };\n }\n\n set_RT_0(rt)\n {\n this.uniforms.blurTexture1.value = rt;\n }\n\n set_RT_1(rt)\n {\n this.uniforms.blurTexture2.value = rt;\n }\n\n set_RT_2(rt)\n {\n this.uniforms.blurTexture3.value = rt;\n }\n\n set_RT_3(rt)\n {\n this.uniforms.blurTexture4.value = rt;\n }\n\n set_RT_4(rt)\n {\n this.uniforms.blurTexture5.value = rt;\n }\n\n set_bloom_strength(value)\n {\n this.uniforms.bloomStrength.value = value;\n }\n\n set_bloom_radius(value)\n {\n this.uniforms.bloomRadius.value = value;\n }\n\n set_tint_color_0(col_string)\n {\n this.uniforms.bloomTintColors.value[0].set(col_string);\n }\n\n set_tint_color_1(col_string)\n {\n this.uniforms.bloomTintColors.value[1].set(col_string);\n }\n\n set_tint_color_2(col_string)\n {\n this.uniforms.bloomTintColors.value[2].set(col_string);\n }\n\n set_tint_color_3(col_string)\n {\n this.uniforms.bloomTintColors.value[3].set(col_string);\n }\n\n set_tint_color_4(col_string)\n {\n this.uniforms.bloomTintColors.value[4].set(col_string);\n }\n}\n\nexport { UnrealBloomComposeMaterial };\n","class CameraManager\n{\n init()\n {\n this._current = undefined;\n // VR Spectator\n this._spectator = undefined;\n }\n\n set current(camera)\n {\n this._current = camera;\n }\n\n get current()\n {\n return this._current;\n }\n\n set spectator(camera)\n {\n this._spectator = camera;\n }\n\n get spectator()\n {\n return this._spectator;\n }\n}\n\nconst camera_manager = new CameraManager();\nexport { camera_manager as CameraManager };\n","class Capabilities\n{\n init()\n {\n this.max_anisotropy = 0;\n this.vertex_texture_sampler_available = false;\n this.fp_textures_available = false;\n }\n}\n\nconst capabilities = new Capabilities();\nexport { capabilities as Capabilities };\n","import { CanvasTexture } from 'three';\nimport { Vector2 } from 'three';\nimport { UVMapping } from 'three';\nimport { ClampToEdgeWrapping } from 'three';\nimport { NearestFilter } from 'three';\n\nclass CanvasDrawer\n{\n constructor(uses_dynamic_font)\n {\n this.uses_dynamic_font = uses_dynamic_font;\n this.__textHeight = null;\n\n this.canvas = document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n }\n\n getFontHeight(fontStyle = 'Arial')\n {\n if (this.__textHeight == null || this.uses_dynamic_font)\n {\n const body = document.getElementsByTagName('body')[0];\n const dummy = document.createElement('div');\n const dummyText = document.createTextNode('MÉqgOLAKTAL');\n dummy.appendChild(dummyText);\n dummy.setAttribute('style', `font:${fontStyle};position:absolute;top:0;left:0`);\n body.appendChild(dummy);\n this.__textHeight = dummy.offsetHeight;\n body.removeChild(dummy);\n }\n return this.__textHeight;\n }\n\n get_text_size(text, font = '24px Arial')\n {\n const size = new Vector2();\n this.ctx.font = font;\n size.x = Math.ceil(this.ctx.measureText(text).width);\n size.y = Math.ceil(this.getFontHeight(font));\n return size;\n }\n\n draw_canvas(text, ctxOptions = {})\n {\n ctxOptions.font = ctxOptions.font || '24px Arial';\n ctxOptions.font_color = ctxOptions.font_color || '#000000';\n\n this.__draw(text, ctxOptions, this.canvas, this.ctx);\n return this.canvas;\n }\n\n draw_on_texture(text, ctxOptions)\n {\n const canvas = this.draw_canvas(text, ctxOptions);\n const canvas_texture = new CanvasTexture(canvas, UVMapping,\n ClampToEdgeWrapping,\n ClampToEdgeWrapping,\n NearestFilter,\n NearestFilter);\n canvas_texture.generateMipMaps = false;\n canvas_texture.needsUpdate = true;\n\n return canvas_texture;\n }\n\n __draw(text, ctxOptions)\n {}\n\n roundRect(ctx, x, y, width, height, radius, fill, stroke)\n {\n if (typeof stroke === 'undefined')\n {\n stroke = true;\n }\n if (typeof radius === 'undefined')\n {\n radius = 5;\n }\n if (typeof radius === 'number')\n {\n radius = { tl: radius, tr: radius, br: radius, bl: radius };\n }\n else\n {\n const defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\n for (const side in defaultRadius)\n {\n radius[side] = radius[side] || defaultRadius[side];\n }\n }\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n if (fill)\n {\n ctx.fill();\n }\n if (stroke)\n {\n ctx.stroke();\n }\n }\n}\n\nexport { CanvasDrawer };\n","/*\n\n A configuration class used as a singleton\n\n*/\n\nclass Configuration\n{\n init(parameters = {})\n {\n this.dpr = 1;\n\n this.app = {}; // for arbitrary use in end application\n }\n\n from_json(json)\n {\n\n }\n}\n\nconst configuration = new Configuration();\nexport { configuration as Configuration };\n","class Idle\n{\n constructor()\n {\n }\n\n get is_animating()\n {\n return false;\n }\n\n on_enter(view)\n {\n\n }\n\n update(view)\n {\n }\n\n on_exit(view)\n {\n\n }\n}\n\nexport { Idle };\n","import { Time } from '../../Time';\nimport { Idle } from './Idle';\n\nimport { OMath } from '../../utilities/OMath';\nclass Animating\n{\n constructor()\n {\n this.t = 0;\n this.easing_function_t = 0;\n }\n\n get is_animating()\n {\n return true;\n }\n\n on_enter(animator)\n {\n }\n\n update(animator)\n {\n this.t += Time.delta_time / animator.duration;\n\n this.easing_function_t = animator.easing_function(this.t);\n this.easing_function_t = OMath.clamp(this.easing_function_t, 0, 1);\n\n animator.set_property_value(OMath.lerp(animator.from, animator.to, this.easing_function_t));\n\n if (this.easing_function_t >= 0.9999)\n {\n animator.set_property_value(animator.to);\n\n animator.set_current_state(new Idle());\n animator.finished_callback(animator);\n }\n }\n\n on_exit(view)\n {\n\n }\n}\n\nexport { Animating };\n","import { Animating } from './css_animator_states/Animating';\nimport { Idle } from './css_animator_states/Idle';\nimport { EasingFunctions } from '../utilities/EasingFunctions';\n\nclass CSSAnimator\n{\n constructor({\n element,\n css_property,\n from = 0,\n to = 1,\n duration = 1,\n value_prefix = '',\n value_suffix = '',\n easing_function = EasingFunctions.ease_in_out_cubic,\n finished_callback = () =>\n {}\n })\n {\n this.element = element;\n this.css_property = css_property;\n this.from = from;\n this.to = to;\n this.value_prefix = value_prefix;\n this.value_suffix = value_suffix;\n this.duration = duration;\n this.easing_function = easing_function;\n this.finished_callback = finished_callback;\n\n this.current_state = new Idle();\n }\n\n animate()\n {\n this.set_current_state(new Animating());\n }\n\n stop()\n {\n this.set_current_state(new Idle());\n }\n\n set_property_value(value)\n {\n this.element.style[this.css_property] = `${this.value_prefix}${value}${this.value_suffix}`;\n }\n\n update()\n {\n this.current_state.update(this);\n }\n\n get is_animating()\n {\n return this.current_state.is_animating;\n }\n\n set_current_state(state)\n {\n this.current_state.on_exit(this);\n this.current_state = state;\n this.current_state.on_enter(this);\n }\n}\n\nexport { CSSAnimator };\n","\nimport { Object3D } from 'three';\nimport { LineBasicMaterial } from 'three';\nimport { AlwaysDepth } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Vector3 } from 'three';\nimport { Line } from 'three';\n\nclass AxisHelper extends Object3D\n{\n constructor(scale = 1.0)\n {\n super();\n\n const blue_points = [];\n blue_points.push(new Vector3(0, 0, 0));\n blue_points.push(new Vector3(0, 0, 1000));\n\n const blue_axis_mat = new LineBasicMaterial({ color: 0x4444ff, depthFunc: AlwaysDepth });\n const blue_axis_geo = new BufferGeometry().setFromPoints(blue_points);\n const blue_axis_line = new Line(blue_axis_geo, blue_axis_mat);\n blue_axis_line.renderOrder = 50000;\n\n const green_points = [];\n green_points.push(new Vector3(0, 0, 0));\n green_points.push(new Vector3(0, 1000, 0));\n\n const green_axis_mat = new LineBasicMaterial({ color: 0x44ff44, depthFunc: AlwaysDepth });\n const green_axis_geo = new BufferGeometry().setFromPoints(green_points);\n const green_axis_line = new Line(green_axis_geo, green_axis_mat);\n green_axis_line.renderOrder = 50000;\n\n const red_points = [];\n red_points.push(new Vector3(0, 0, 0));\n red_points.push(new Vector3(1000, 0, 0));\n\n const red_axis_mat = new LineBasicMaterial({ color: 0xff4444, depthFunc: AlwaysDepth });\n const red_axis_geo = new BufferGeometry().setFromPoints(red_points);\n const red_axis_line = new Line(red_axis_geo, red_axis_mat);\n red_axis_line.renderOrder = 50000;\n\n this.renderOrder = 100000;\n\n this.add(blue_axis_line);\n this.add(green_axis_line);\n this.add(red_axis_line);\n\n this.scale.set(scale, scale, scale);\n }\n\n update()\n {\n }\n\n dispose()\n {\n }\n}\n\nexport { AxisHelper };\n","import { Scene } from 'three';\n\nclass SceneManager\n{\n init()\n {\n this._current = new Scene();\n this._current.name = 'default_scene';\n }\n\n add_scene(name)\n {\n\n }\n\n get current()\n {\n return this._current;\n }\n\n set current(scene)\n {\n this._current = scene;\n }\n\n dispose()\n {\n this.current.traverse(child =>\n {\n if (child.geometry)\n {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n\n while (this.current.children.length > 0)\n {\n this.current.remove(this.current.children[0]);\n }\n }\n}\n\nconst scene_manager = new SceneManager();\nexport { scene_manager as SceneManager };\n","\nimport { Vector3, Mesh } from 'three';\nimport { BoxGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nclass Cube extends Mesh\n{\n constructor(size, segments, color)\n {\n size = size || new Vector3(1, 1, 1);\n segments = segments || new Vector3(1, 1, 1);\n color = color || 0xff0000;\n const geometry = new BoxGeometry(size.x, size.y, size.z, segments.x, segments.y, segments.z);\n const material = new MeshBasicMaterial({ color: color });\n super(geometry, material);\n }\n}\n\nexport { Cube };\n","import { Mesh } from 'three';\nimport { SphereBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nclass Sphere extends Mesh\n{\n constructor(radius, color)\n {\n color = color || '#FF0000';\n radius = radius || 1;\n const geometry = new SphereBufferGeometry(radius, 64, 64);\n const material = new MeshBasicMaterial({ color: color });\n super(geometry, material);\n }\n}\n\nexport { Sphere };\n","import { CylinderBufferGeometry } from 'three';\nimport { ConeBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { Vector3, Mesh } from 'three';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nclass Arrow extends Mesh\n{\n constructor(color, length, dir)\n {\n color = color || '#FF0000';\n length = length || 1;\n\n const cone_height = 0.4;\n const cylinder_height = length - cone_height;\n const cylinder_geo = new CylinderBufferGeometry(0.01, 0.01, cylinder_height, 32);\n cylinder_geo.translate(0, cylinder_height / 2, 0);\n\n const cone_geometry = new ConeBufferGeometry(0.1, cone_height, 32);\n cone_geometry.translate(0, cylinder_height + cone_height / 2, 0);\n\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries([cylinder_geo, cone_geometry]);\n buffer_geometry.rotateX(3.14 / 2);\n\n const material = new MeshBasicMaterial({ color: color });\n super(buffer_geometry, material);\n\n if (dir)\n {\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\n }\n\n this._dir = dir;\n }\n\n set dir(dir)\n {\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\n this._dir = dir;\n }\n\n get dir()\n {\n return this._dir;\n }\n\n set length(value)\n {\n this.scale.z = value;\n }\n\n get length()\n {\n return this.scale.z;\n }\n}\n\nexport { Arrow };\n","import { Vector2 } from 'three';\n\nclass OScreen\n{\n init()\n {\n this.width = 1;\n this.height = 1;\n\n this.position = new Vector2();\n\n this.render_width = 1;\n this.render_height = 1;\n this.width_height = new Vector2(this.width, this.height);\n\n this.dpr = 1;\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\n }\n\n update_position(x, y)\n {\n this.position.set(x, y);\n }\n\n update()\n {\n this.size_changed = false;\n }\n\n update_size(width, height)\n {\n this.width = width;\n this.height = height;\n\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\n\n this.width_height.x = width;\n this.width_height.y = height;\n\n this.render_width = width * this.dpr;\n this.render_height = height * this.dpr;\n\n this.size_changed = true;\n }\n\n apply_pixel_density_v2(vector2)\n {\n vector2.multiplyScalar(1 / this.dpr);\n\n return vector2;\n }\n\n apply_pixel_density(value)\n {\n return value * (1 / this.dpr);\n }\n\n get_pixel_size()\n {\n return this.pixel_size;\n }\n\n get aspect_ratio()\n {\n return this.width / this.height;\n }\n\n get portrait()\n {\n return this.width < this.height;\n }\n}\n\nconst oscreen = new OScreen();\nexport { oscreen as OScreen };\n","import { BaseShaderMaterial } from './BaseShaderMaterial';\nimport { Vector2 } from 'three';\nclass ScreenSpaceTextureMaterial extends BaseShaderMaterial\n{\n constructor(x, y, w, h)\n {\n const vert = `\n uniform vec2 _ScreenSpacePosition;\n uniform vec2 _ScreenSize;\n uniform vec2 _TextureSize;\n varying vec2 vUv;\n void main()\n {\n vec2 pos = uv * vec2(_TextureSize.x / _ScreenSize.x, _TextureSize.y / _ScreenSize.y);\n pos += vec2(_ScreenSpacePosition.x / _ScreenSize.x, _ScreenSpacePosition.y / _ScreenSize.y);\n\n pos.x = pos.x * 2.0 - 1.0;\n pos.y = pos.y * 2.0 - 1.0;\n\n gl_Position = vec4(pos, 0.0, 1.0);\n vUv = uv;\n }\n `;\n const frag = `\n uniform sampler2D _MainTex;\n varying vec2 vUv;\n\n void main()\n {\n gl_FragColor = texture2D(_MainTex, vUv);\n }\n `;\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSpacePosition: { value: new Vector2() },\n _ScreenSize: { value: new Vector2() },\n _TextureSize: { value: new Vector2() }\n });\n }\n\n set_position(x, y)\n {\n this.uniforms._ScreenSpacePosition.value.set(x, y);\n }\n\n set_texture(tex, w, h)\n {\n this.uniforms._MainTex.value = tex;\n this.uniforms._TextureSize.value.set(tex.image.width, tex.image.height);\n\n if (w !== undefined)\n {\n this.uniforms._TextureSize.value.x = w;\n }\n if (h !== undefined)\n {\n this.uniforms._TextureSize.value.y = h;\n }\n }\n\n set_screen_size(w, h)\n {\n this.uniforms._ScreenSize.value.set(w, h);\n }\n}\n\nexport { ScreenSpaceTextureMaterial };\n","import { Color } from 'three';\nimport { PerspectiveCamera as TPerspectiveCamera } from 'three';\n\nclass PerspectiveCamera extends TPerspectiveCamera\n{\n constructor(fov, aspect, near, far)\n {\n super(fov, aspect, near, far);\n\n this.clear_color = new Color('#000000');\n this.clear_alpha = 1;\n }\n\n copy(camera)\n {\n super.copy(camera);\n this.clear_color.copy(camera.clear_color);\n this.clear_alpha = camera.clear_alpha;\n return this;\n }\n}\n\nexport { PerspectiveCamera };\n","import { AxisHelper } from './components/AxisHelper';\n\nimport { SceneManager } from './SceneManager';\nimport { Cube } from './primitives/Cube';\nimport { Sphere } from './primitives/Sphere';\nimport { Arrow } from './primitives/Arrow';\nimport { OScreen } from './OScreen';\nimport { ScreenSpaceTextureMaterial } from './materials/ScreenSpaceTextureMaterial';\nimport { PerspectiveCamera } from './PerspectiveCamera';\n\nimport { Vector3 } from 'three';\nimport { LineBasicMaterial } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Line } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Vector4 } from 'three';\nimport { Mesh } from 'three';\nimport { Box3 } from 'three';\nimport { Box3Helper } from 'three';\nimport { Scene } from 'three';\nimport { CatmullRomCurve3 } from 'three';\nimport { SphereGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nimport basic_color_vert from './shaders/basic_color/basic_color.vert';\nimport basic_color_frag from './shaders/basic_color/basic_color.frag';\nimport { CameraManager } from './CameraManager';\n\nclass Debug\n{\n init()\n {\n this.Vector3_one = new Vector3(1, 1, 1);\n this.Vector3_zero = new Vector3(0, 0, 0);\n this.canvas_renderer = undefined;\n\n this.display_texture_meshes = [];\n\n this.ctx = undefined;\n this.scene = new Scene();\n this.camera = new PerspectiveCamera(60, OScreen.aspect_ratio, 0.1, 1000);\n this.camera.clear_alpha = 0;\n }\n\n draw_arrow(origin, dir, color = 0xff0000)\n {\n const arrow = new Arrow(color, dir.length(), dir.clone().normalize());\n arrow.position.copy(origin);\n this.scene.add(arrow);\n return arrow;\n }\n\n draw_axis()\n {\n const axis = new AxisHelper();\n this.scene.add(axis);\n return axis;\n }\n\n set_debug_RT(RT)\n {\n this.rt_debug = RT;\n }\n\n draw_rectangle(position_2d, width, height, color)\n {\n width = width || 100;\n height = height || 100;\n this.ctx.fillStyle = color || 'rgba(255, 0, 0, 1)';\n this.ctx.fillRect(position_2d.x - width / 2,\n (this.ctx.canvas.height - position_2d.y) - height / 2, width, height);\n }\n\n clear()\n {\n if (this.ctx)\n {\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n }\n }\n\n draw_line_2D(from, to, color)\n {\n this.ctx.strokeStyle = color || 'rgba(255, 0, 0, 1)';\n this.ctx.beginPath();\n this.ctx.moveTo(from.x, from.y);\n this.ctx.lineTo(to.x, to.y);\n this.ctx.closePath();\n this.ctx.stroke();\n }\n\n draw_line(points, color = 0xff0000)\n {\n const material = new LineBasicMaterial({\n color: color\n });\n\n const geometry = new BufferGeometry().setFromPoints(points);\n\n const line = new Line(geometry, material);\n line.frustumCulled = false;\n this.scene.add(line);\n return line;\n }\n\n draw_cube(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n pos = pos || new Vector3();\n\n const cube = new Cube(new Vector3(size, size, size), undefined, color);\n cube.position.copy(pos);\n this.scene.add(cube);\n return cube;\n }\n\n draw_oriented_cube(from, to, height = 1, color = '#FF0000', depth = 0.1)\n {\n const size = from.distanceTo(to);\n const cube = new Cube(new Vector3(depth, height, size), undefined, color);\n\n const center = to.clone().sub(from).multiplyScalar(0.5);\n const forward_dir = center.clone().normalize();\n center.add(from);\n\n cube.position.copy(center);\n\n // let up = new Vector3(0, 1, 0);\n // let forward = forward_dir.clone();\n // let right = forward.clone().cross(up);\n\n // cube.quaternion.setFromRotationMatrix(new Matrix4().makeBasis(right,up,forward));\n cube.quaternion.setFromUnitVectors(new Vector3(0, 0, -1), forward_dir);\n\n this.scene.add(cube);\n return cube;\n }\n\n draw_plane(width, height, color)\n {\n const geometry = new PlaneGeometry(width, height);\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Vector4(0, 1, 0, 0.2) }\n },\n vertexShader: basic_color_vert,\n fragmentShader: basic_color_frag,\n transparent: true,\n depthWrite: false\n });\n\n const plane = new Mesh(geometry, material);\n plane.renderOrder = -10000;\n this.scene.add(plane);\n return plane;\n }\n\n draw_empty_cube(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n\n const box = new Box3().setFromCenterAndSize(new Vector3(), new Vector3(size, size, size));\n const helper = new Box3Helper(box, color);\n helper.position.copy(pos || new Vector3());\n return helper;\n }\n\n draw_sphere(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n pos = pos || new Vector3();\n\n const sphere = new Sphere(size, color);\n sphere.position.copy(pos);\n this.scene.add(sphere);\n return sphere;\n }\n\n draw_point_array(input_points, open = false, color = 0xff0000)\n {\n const catmull = new CatmullRomCurve3(input_points, open);\n catmull.updateArcLengths();\n const points = catmull.getSpacedPoints(200);\n const line_helper = this.draw_line(points, 0x00ff00);\n // line_helper.position.y = 1.5;\n return line_helper;\n }\n\n draw_sphere_helper(sphere, color)\n {\n color = color || 0xff0000;\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\n const material = new MeshBasicMaterial({ color: color });\n const sphere_mesh = new Mesh(geometry, material);\n sphere_mesh.position.copy(sphere.center);\n SceneManager.current.add(sphere_mesh);\n return sphere_mesh;\n }\n\n draw_math_sphere(sphere)\n {\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Vector4(1, 0, 0, 0.2) }\n },\n vertexShader: basic_color_vert,\n fragmentShader: basic_color_frag,\n transparent: true\n });\n // var material = new MeshBasicMaterial( {color: 0xff0000, transparent = true} );\n const sphere1 = new Mesh(geometry, material);\n sphere1.position.copy(sphere.center);\n SceneManager.current.add(sphere1);\n }\n\n draw_bounding_box(bb)\n {\n const helper = new Box3Helper(bb, 0xffff00);\n SceneManager.current.add(helper);\n }\n\n draw_curve(curve, options)\n {\n const offset = new Vector3(0, 0, 0);\n if (options)\n {\n offset.y = options.offset || 0;\n }\n\n for (let i = 0; i < curve.length - 1; i++)\n {\n this.draw_line(curve[i].clone().add(offset), curve[i + 1].clone().add(offset));\n }\n }\n\n draw_texture(tex, w, h)\n {\n const mesh = new Mesh(new PlaneGeometry(1, 1), new ScreenSpaceTextureMaterial());\n this.display_texture_meshes.push(mesh);\n this.scene.add(mesh);\n\n mesh.material.set_texture(tex, w, h);\n return mesh;\n }\n\n render(graphics)\n {\n for (let i = 0; i < this.display_texture_meshes.length; i++)\n {\n this.display_texture_meshes[i].material.set_screen_size(OScreen.width, OScreen.height);\n }\n if (this.scene.children.length > 0)\n {\n graphics.render(this.scene, CameraManager.current);\n }\n }\n}\n\nconst debug = new Debug();\nexport { debug as Debug };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/clear/clear_depth_normal.frag';\n\nimport { Vector4 } from 'three';\n\nclass ClearDepthNormalMaterial extends BlitMaterial\n{\n constructor(clear_depth, clear_normal)\n {\n super(frag);\n this.uniforms._DepthNormal = { value: new Vector4(clear_depth, clear_normal.x, clear_normal.y, clear_normal.z) };\n }\n}\n\nexport { ClearDepthNormalMaterial };\n","import vert from '../shaders/depth_normals/depth_normals.vert';\nimport frag from '../shaders/depth_normals/depth_normals.frag';\n\nimport { ShaderMaterial } from 'three';\n\nclass DepthNormalMaterial extends ShaderMaterial\n{\n constructor()\n {\n super({\n uniforms: {\n _FarPlane: { value: 1 }\n },\n vertexShader: vert,\n fragmentShader: frag\n });\n }\n\n set far_plane(value)\n {\n this.uniforms._FarPlane.value = value;\n }\n\n get far_plane()\n {\n return this.uniforms._FarPlane.value;\n }\n}\n\nexport { DepthNormalMaterial };\n","import { CameraManager } from '../CameraManager';\nimport { OScreen } from '../OScreen';\n\nimport { ClearDepthNormalMaterial } from '../materials/ClearDepthNormalMaterial';\nimport { DepthNormalMaterial } from '../materials/DepthNormalMaterial';\n\nimport { WebGLRenderTarget } from 'three';\nimport { Vector3 } from 'three';\n\nclass DepthAndNormalsRenderer\n{\n constructor()\n {\n this.RT = new WebGLRenderTarget(OScreen.width, OScreen.height);\n\n this.clear_depth_normal_mat = new ClearDepthNormalMaterial(1, new Vector3(0, 0, 1));\n this.depth_normal_material = new DepthNormalMaterial();\n }\n\n render(graphics)\n {\n this.__resize_RT_if_necessary();\n\n graphics.clear(this.RT, undefined, true, true);\n\n graphics.blit_clear_with_material(this.RT, this.clear_depth_normal_mat);\n\n this.depth_normal_material.far_plane = CameraManager.current.far;\n\n graphics.render(undefined, undefined, this.RT, this.depth_normal_material);\n }\n\n __resize_RT_if_necessary()\n {\n if (this.RT.width !== OScreen.width || this.RT.height !== OScreen.height)\n {\n this.RT.setSize(OScreen.width, OScreen.height);\n }\n }\n\n get render_target()\n {\n return this.RT;\n }\n}\n\nexport { DepthAndNormalsRenderer };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport { Scene } from 'three';\nimport { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { OrthographicCamera } from 'three';\n\nclass Blitter\n{\n constructor(renderer)\n {\n this.renderer = renderer;\n this._blit_scene = new Scene();\n this._blit_material = new BlitMaterial();\n this._blit_quad = new Mesh(\n new PlaneGeometry(1, 1), this._blit_material);\n this._blit_scene.add(this._blit_quad);\n this._blit_camera = new OrthographicCamera(-1, 1, 1, -1, -10000, 10000);\n }\n\n blit(src, dst)\n {\n this._blit_quad.material = this._blit_material;\n\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\n\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\n\n if (dst)\n {\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\n }\n else\n {\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\n }\n\n this.__render(dst);\n }\n\n material_pass(mat, dst)\n {\n this._blit_quad.material = mat;\n // this._blit_quad.material.uniforms._MainTex.value = undefined;\n // this._blit_quad.material.uniforms._Resolution.value.set(1, 1);\n\n this.__render(dst);\n }\n\n blit_with_material(src, dst, mat)\n {\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\n\n this._blit_quad.material = mat;\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\n\n if (dst)\n {\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\n }\n else\n {\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\n }\n\n this.__render(dst);\n }\n\n blit_clear_with_material(dst_RT, mat)\n {\n this._blit_quad.material = mat;\n\n this.__render(dst_RT);\n }\n\n dispose()\n {\n this._blit_quad.geometry.dispose();\n this._blit_quad.material.dispose();\n }\n\n __render(RT)\n {\n RT = RT === undefined ? null : RT;\n\n const current_rt = this.renderer.getRenderTarget();\n\n this.renderer.setRenderTarget(RT === undefined ? null : RT);\n this.renderer.render(this._blit_scene, this._blit_camera);\n\n this.renderer.setRenderTarget(current_rt);\n }\n}\n\nexport { Blitter };\n","import { Configuration } from './Configuration';\nimport { BaseRender } from './render_mode/BaseRender';\nimport { OScreen } from './OScreen';\nimport { CameraManager } from './CameraManager';\nimport { SceneManager } from './SceneManager';\nimport { Capabilities } from './Capabilities';\nimport { DepthAndNormalsRenderer } from './render_utilities/DepthAndNormalsRenderer';\nimport { Blitter } from './render_utilities/Blitter';\n\nimport {\n NearestFilter,\n RGBAFormat,\n LinearEncoding,\n FloatType,\n WebGLRenderTarget,\n ShaderMaterial,\n NoBlending,\n AlwaysDepth\n} from 'three';\n\nimport { WebGLRenderer } from 'three';\n\nclass Graphics\n{\n init(canvas, core_attributes, context_attributes, threejs_attributes)\n {\n this._renderer = undefined;\n this.blitter = undefined;\n this.canvas = undefined;\n this.no_render = undefined;\n this.current_render_mode = undefined;\n this.generateDepthNormalTexture = false;\n this.depth_and_normals_renderer = undefined;\n\n this.is_webgl2 = false;\n this.canvas_context = undefined;\n this.context_attributes = undefined;\n\n this.core_attributes = {\n force_webgl2: true,\n xr_enabled: false\n };\n\n this.context_attributes = {\n alpha: true,\n antialias: false,\n depth: true,\n desynchronized: false,\n failIfMajorPerformanceCaveat: false,\n powerPreference: 'high-performance',\n premultipliedAlpha: true,\n preserveDrawingBuffer: true,\n stencil: false\n };\n\n this.threejs_attributes = {\n logarithmicDepthBuffer: false\n };\n\n Object.assign(this.core_attributes, core_attributes);\n Object.assign(this.context_attributes, context_attributes);\n\n Object.assign(this.threejs_attributes, this.context_attributes);\n Object.assign(this.threejs_attributes, threejs_attributes);\n\n if (this.core_attributes.force_webgl2)\n {\n this.canvas_context = canvas.getContext('webgl2', this.context_attributes) ||\n canvas.getContext('webgl', this.context_attributes) ||\n canvas.getContext('experimental-webgl', this.context_attributes);\n }\n else\n {\n this.canvas_context = canvas.getContext('webgl', this.context_attributes) ||\n canvas.getContext('experimental-webgl', this.context_attributes);\n }\n\n this.is_webgl2 = this.canvas_context.constructor.name === 'WebGL2RenderingContext';\n\n // console.log(`Using WebGL ${this.is_webgl2 ? 2 : 1}`);\n\n this.threejs_attributes.canvas = canvas;\n this.threejs_attributes.context = this.canvas_context;\n\n this._renderer = new WebGLRenderer(this.threejs_attributes);\n\n if (this.core_attributes.xr_enabled)\n {\n this._renderer.xr.enabled = true;\n }\n else\n {\n this._renderer.autoClear = false;\n }\n\n this._renderer.setPixelRatio(1);\n\n OScreen.dpr = Configuration.dpr;\n\n if (!this.is_webgl2)\n {\n this._renderer.extensions.get('ANGLE_instanced_arrays');\n }\n\n this.blitter = new Blitter(this._renderer);\n\n this.canvas = this._renderer.domElement;\n\n this.no_render = new BaseRender();\n\n this.current_render_mode = this.no_render;\n Capabilities.max_anisotropy = this._renderer.capabilities.getMaxAnisotropy();\n Capabilities.vertex_texture_sampler_available = this._renderer.capabilities.maxVertexTextures > 0;\n Capabilities.fp_textures_available = this.is_floating_point_texture_available();\n\n this.generateDepthNormalTexture = false;\n\n this.depth_and_normals_renderer = new DepthAndNormalsRenderer();\n\n this.resize_observer = new ResizeObserver(this.on_resize.bind(this));\n this.resize_observer.observe(this.canvas);\n }\n\n get dom_element()\n {\n return this._renderer.domElement;\n }\n\n get depth_normals_RT()\n {\n return this.depth_and_normals_renderer.render_target;\n }\n\n set_state(new_state)\n {\n // console.log('VIEWAPI - map render mode switch to: ' + new_state.constructor.name);\n\n this.current_render_mode.on_exit(this, this._renderer);\n this.current_render_mode = new_state;\n this.current_render_mode.on_enter(this, this._renderer);\n }\n\n update()\n {\n if (this.generateDepthNormalTexture)\n {\n this.depth_and_normals_renderer.render(this);\n }\n\n this.__update_current_camera();\n\n if (CameraManager.current)\n {\n this.current_render_mode.render();\n }\n\n OScreen.update();\n }\n\n __update_current_camera()\n {\n if (CameraManager.current)\n {\n CameraManager.current.aspect = OScreen.aspect_ratio;\n CameraManager.current.updateProjectionMatrix();\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n }\n }\n\n render(scene, camera, RT, override_mat)\n {\n this.__apply_override_material(scene, override_mat);\n\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\n this._renderer.render(scene || SceneManager.current,\n camera || CameraManager.current);\n\n this.__apply_override_material(scene, undefined);\n }\n\n render_scene(scene)\n {\n if (scene.on_pre_render)\n {\n scene.on_pre_render();\n }\n\n if (scene.render)\n {\n scene.render();\n }\n else\n {\n this.render(scene, undefined);\n }\n\n if (scene.on_post_render)\n {\n scene.on_post_render();\n }\n }\n\n __apply_override_material(scene, mat)\n {\n mat = mat === undefined ? null : mat;\n if (scene)\n {\n scene.overrideMaterial = mat;\n }\n else\n {\n SceneManager.current.overrideMaterial = mat;\n }\n }\n\n readback_RT(RT, buffer)\n {\n this._renderer.readRenderTargetPixels(RT, 0, 0, RT.width, RT.height, buffer);\n }\n\n clear(RT, camera, clear_depth, clear_stencil)\n {\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\n\n if (camera)\n {\n this._renderer.setClearColor(camera.clear_color, camera.clear_alpha);\n }\n\n this._renderer.clear(!!camera, // clear color\n !!clear_depth,\n !!clear_stencil);\n }\n\n on_resize(entries)\n {\n for (const entry of entries)\n {\n OScreen.dpr = Configuration.dpr;\n OScreen.update_position(entry.contentRect.x, entry.contentRect.y);\n OScreen.update_size(entry.contentRect.width, entry.contentRect.height);\n\n this.canvas.width = OScreen.render_width;\n this.canvas.height = OScreen.render_height;\n\n this._renderer.setViewport(0, 0, OScreen.render_width, OScreen.render_height);\n\n this.__update_current_camera();\n }\n }\n\n material_pass(mat, dst)\n {\n this.blitter.material_pass(mat, dst);\n }\n\n blit(src_RT, dst_RT, mat)\n {\n if (mat)\n {\n this.blitter.blit_with_material(src_RT, dst_RT, mat);\n }\n else\n {\n this.blitter.blit(src_RT, dst_RT);\n }\n }\n\n blit_clear_with_material(dst_RT, mat)\n {\n this.blitter.blit_clear_with_material(dst_RT, mat);\n }\n\n take_screenshot(blob_callback, width = OScreen.width, height = OScreen.height)\n {\n // const ctx = this;\n\n const old_width = OScreen.width;\n const old_height = OScreen.height;\n\n const new_width = width;\n const new_height = height;\n\n const tile_width = 1024;\n const tile_height = 1024;\n\n const divisions_x = parseInt(Math.ceil(new_width / tile_width));\n const divisions_y = parseInt(Math.ceil(new_height / tile_height));\n\n OScreen.update_size(tile_width, tile_height);\n const old_dpr = this._renderer.getPixelRatio();\n this._renderer.setPixelRatio(1);\n\n this._renderer.setSize(tile_width, tile_height, false);\n\n const canvas_2d = document.createElement('canvas');\n const ctx_2D = canvas_2d.getContext('2d');\n\n ctx_2D.canvas.width = new_width;\n ctx_2D.canvas.height = new_height;\n\n CameraManager.current.aspect = OScreen.aspect_ratio;\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n\n for (let x = 0; x < divisions_x; x++)\n {\n for (let y = 0; y < divisions_y; y++)\n {\n CameraManager.current.setViewOffset(new_width, new_height,\n OScreen.width * x, OScreen.height * y,\n OScreen.width, OScreen.height);\n this.current_render_mode.render();\n\n ctx_2D.drawImage(this._renderer.domElement, OScreen.width * x, OScreen.height * y);\n }\n }\n\n // transform the result canvas into a blob\n // } from them the callback turns into a ULR and download it\n ctx_2D.canvas.toBlob(blob_callback, 'image/png;base64;');\n\n CameraManager.current.clearViewOffset();\n\n OScreen.update_size(old_width, old_height);\n this._renderer.setPixelRatio(old_dpr);\n this._renderer.setSize(old_width, old_height, false);\n\n CameraManager.current.aspect = OScreen.aspect_ratio;\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n }\n\n download_screenshot(blob)\n {\n const link = document.createElement('a');\n link.download = 'Snapshot.png';\n\n link.href = URL.createObjectURL(blob);\n link.click();\n\n link.onclick = function()\n {\n requestAnimationFrame(function()\n {\n URL.revokeObjectURL(link.href);\n });\n link.removeAttribute('href');\n };\n }\n\n dispose()\n {\n this._renderer.dispose();\n this.current_render_mode.dispose();\n this.blitter.dispose();\n }\n\n is_floating_point_texture_available()\n {\n const RT = new WebGLRenderTarget(1, 1, {\n minFilter: NearestFilter,\n magFilter: NearestFilter,\n format: RGBAFormat,\n encoding: LinearEncoding,\n type: FloatType,\n stencilBuffer: false,\n depthBuffer: false\n });\n\n const vert = `\n void main()\n {\n gl_Position = vec4(uv * 2.0 - 1.0, 1.0, 1.0);\n }\n `;\n const frag = `\n void main()\n {\n gl_FragColor = vec4(0.0, 4865.35, 0.0, 1.0);\n }\n `;\n\n const mat = new ShaderMaterial({\n vertexShader: vert,\n fragmentShader: frag,\n depthWrite: false,\n blending: NoBlending,\n depthTest: false,\n depthFunc: AlwaysDepth\n });\n\n this.material_pass(mat, RT);\n\n const output = new Float32Array(4);\n this._renderer.readRenderTargetPixels(RT, 0, 0, 1, 1, output);\n\n return Math.abs(output[1] - 4865.35) < 0.001;\n }\n}\n\nconst graphics = new Graphics();\nexport { graphics as Graphics };\n","import frag from '../shaders/normal/normal.frag';\nimport vert from '../shaders/normal/normal.vert';\n\nimport { ShaderMaterial } from 'three';\n\nclass NormalMaterial extends ShaderMaterial\n{\n constructor()\n {\n super({\n uniforms: {\n },\n vertexShader: vert,\n fragmentShader: frag\n });\n }\n}\n\nexport { NormalMaterial };\n","import { CameraManager } from '../CameraManager';\nimport { SceneManager } from '../SceneManager';\nimport { BaseRender } from '../render_mode/BaseRender';\nimport { Graphics } from '../Graphics';\nimport { NormalMaterial } from '../materials/NormalMaterial';\n\nclass DebugNormalsRender extends BaseRender\n{\n constructor()\n {\n super();\n }\n\n render()\n {\n Graphics.clear(undefined, CameraManager.current, true, true);\n\n Graphics.render(SceneManager.current, CameraManager.current, undefined, new NormalMaterial());\n }\n}\n\nexport { DebugNormalsRender };\n","class KeyboardInput\n{\n init(container)\n {\n this.ctrlz_pressed = false;\n this.ctrlz_fired = false;\n\n this.keys = {};\n this.keys_keys = [];\n this.container = container;\n\n this.container.addEventListener('keydown', this.on_key_down.bind(this), false);\n this.container.addEventListener('keyup', this.on_key_up.bind(this), false);\n }\n\n on_key_down(e)\n {\n if (e.keyCode === 90 && e.ctrlKey && !this.ctrlz_fired)\n {\n this.ctrlz_pressed = true;\n this.ctrlz_fired = true;\n }\n\n if (e.code)\n {\n this.press_key(e.code);\n }\n }\n\n on_key_up(e)\n {\n this.release_key(e.code);\n }\n\n clear()\n {\n this.ctrlz_pressed = false;\n\n for (let i = 0; i < this.keys_keys.length; i++)\n {\n this.keys[this.keys_keys[i]].pressed = false;\n this.keys[this.keys_keys[i]].released = false;\n }\n }\n\n release_key(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n key.fired = false;\n key.down = false;\n key.released = true;\n }\n }\n\n release_keys()\n {\n this.ctrlz_fired = false;\n\n for (let i = 0; i < this.keys_keys.length; i++)\n {\n this.keys[this.keys_keys[i]].fired = false;\n this.keys[this.keys_keys[i]].down = false;\n }\n }\n\n press_key(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n if (key.down === false)\n {\n key.pressed = true;\n }\n key.down = true;\n key.fired = true;\n }\n }\n\n is_key_pressed(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.pressed;\n }\n return false;\n }\n\n is_key_down(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.down;\n }\n return false;\n }\n\n is_key_released(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.released;\n }\n\n return false;\n }\n\n register_key(key)\n {\n this.keys[key] =\n {\n key_name: key,\n pressed: false,\n down: false,\n fired: false\n };\n\n this.keys_keys = Object.keys(this.keys);\n }\n\n unregister_key(key_name)\n {\n delete this.keys[key_name];\n }\n\n dispose()\n {\n this.container.removeEventListener('keydown', this.on_key_down.bind(this), false);\n this.container.removeEventListener('keyup', this.on_key_up.bind(this), false);\n }\n}\n\nexport { KeyboardInput };\n","\nclass OS\n{\n init()\n {\n this.operating_systems = {\n ANDROID: 'android',\n IOS: 'ios',\n LINUX: 'linux',\n MAC: 'mac',\n WINDOWS: 'windows'\n };\n\n this.is_mobile = !!(navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/));\n this.is_ipad = !!(navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2);\n this.is_ios = !!navigator.userAgent.match(/(iPhone|iPod|iPad)/) || this.is_ipad;\n\n this.is_android = this.get_os() === this.operating_systems.ANDROID;\n this.is_linux = this.get_os() === this.operating_systems.LINUX;\n this.is_mac = this.get_os() === this.operating_systems.MAC;\n this.is_windows = this.get_os() === this.operating_systems.WINDOWS;\n }\n\n get_os()\n {\n const userAgent = window.navigator.userAgent;\n const platform = window.navigator.platform;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os = null;\n\n if (macosPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.MAC;\n }\n else if (iosPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.IOS;\n }\n else if (windowsPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.WINDOWS;\n }\n else if (/Android/.test(userAgent))\n {\n os = this.operating_systems.ANDROID;\n }\n else if (!os && /Linux/.test(platform))\n {\n os = this.operating_systems.LINUX;\n }\n\n return os;\n }\n}\n\nconst os = new OS();\nexport { os as OS };\n","import { Vector3 } from 'three';\n\nclass ReflectionPlaneContext\n{\n init()\n {\n this.target_geometry = undefined;\n this.target_position = new Vector3();\n }\n\n set_target_geometry(geometry)\n {\n this.target_geometry = geometry;\n }\n}\n\nconst reflection_plane_context = new ReflectionPlaneContext();\nexport { reflection_plane_context as ReflectionPlaneContext };\n","import { Vector2 } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Mesh } from 'three';\nimport { DataTexture } from 'three';\nimport { RGBAFormat } from 'three';\nimport { RGBFormat } from 'three';\nimport { FloatType } from 'three';\n\nclass GeometryBatch\n{\n constructor(geometry, batch_width)\n {\n this.geometry = geometry;\n\n this.material = undefined;\n this.uniforms = {};\n this.batch_width = batch_width;\n\n this.data_textures = [];\n\n this.object_names = undefined;\n\n this.zero_offset = new Vector2();\n this.write_offset = new Vector2();\n\n this.uniform_dirty_count = 0;\n\n this.tmp_uploaded_data_count = 0;\n }\n\n init(object_names, vert_shader, frag_shader)\n {\n this.material = new ShaderMaterial({\n uniforms: this.uniforms,\n vertexShader: vert_shader,\n fragmentShader: frag_shader\n });\n this.object_names = object_names;\n }\n\n add_global_uniform(name, data)\n {\n this.uniforms[name] = { value: data };\n this.material.needsUpdate = true;\n }\n\n set_global_uniform(name, data)\n {\n this.uniforms[name].value = data;\n }\n\n add_object_uniform_v3(uniform_name, default_value_v3)\n {\n const src_tex = this.__create_rgb_texture(this.batch_width);\n const dst_tex = this.__create_rgb_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgb_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v3)\n {\n this.__flood_data_texture_rgb(new_data_tex, default_value_v3);\n }\n }\n\n add_object_uniform_v4(uniform_name, default_value_v4)\n {\n const src_tex = this.__create_rgba_texture(this.batch_width);\n const dst_tex = this.__create_rgba_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgba_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v4)\n {\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\n }\n }\n\n add_object_uniform_v4_float(uniform_name, default_value_v4)\n {\n const src_tex = this.__create_rgba_float_texture(this.batch_width);\n const dst_tex = this.__create_rgba_float_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgba_float_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v4)\n {\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\n }\n }\n\n set_object_uniform_v3(object_name, uniform_name, vector3, use_r, use_g, use_b)\n {\n const obj_index = this.__get_object_index(object_name);\n const data_texture = this.__get_data_texture(uniform_name);\n\n this.__set_pixel_rgb(data_texture.src, obj_index, vector3, use_r, use_g, use_b);\n this.__set_pixel_rgb(data_texture.one_pixel, 0, vector3, use_r, use_g, use_b);\n\n data_texture.last_accessed_index = obj_index;\n\n data_texture.dirty_count++;\n }\n\n set_object_uniform_v4(object_name, uniform_name, vector4, use_r, use_g, use_b, use_a)\n {\n const obj_index = this.__get_object_index(object_name);\n const data_texture = this.__get_data_texture(uniform_name);\n\n this.__set_pixel_rgba(data_texture.src, obj_index, vector4, use_r, use_g, use_b, use_a);\n this.__set_pixel_rgba(data_texture.one_pixel, 0, vector4, use_r, use_g, use_b, use_a);\n data_texture.last_accessed_index = obj_index;\n\n data_texture.dirty_count++;\n }\n\n upload_texture_data(renderer, upload_budget)\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (upload_budget > 0 && this.data_textures[i].dirty_count > 0)\n {\n if (this.data_textures[i].dirty_count === 1)\n {\n this.__partial_texture_data_upload(renderer, this.data_textures[i]);\n }\n if (this.data_textures[i].dirty_count > 1)\n {\n this.__full_texture_data_upload(renderer, this.data_textures[i]);\n }\n\n this.data_textures[i].dirty_count = 0;\n\n upload_budget--;\n }\n }\n }\n\n get_uniform_dirty_count()\n {\n this.uniform_dirty_count = 0;\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (this.data_textures[i].dirty_count > 0)\n {\n this.uniform_dirty_count++;\n }\n }\n return this.uniform_dirty_count;\n }\n\n __full_texture_data_upload(renderer, texture_data)\n {\n // console.log(\"full texture update of\"+ texture_data.name);\n texture_data.dst.needsUpdate = true;\n renderer.copyTextureToTexture(\n this.zero_offset,\n texture_data.src,\n texture_data.dst\n );\n }\n\n __partial_texture_data_upload(renderer, texture_data)\n {\n // console.log(\"partial texture update\"+ texture_data.name);\n const index = texture_data.last_accessed_index;\n if (index === -1)\n {\n return;\n }\n\n this.write_offset.y = Math.floor(index / this.batch_width);\n this.write_offset.x = index - this.batch_width * this.write_offset.y;\n renderer.copyTextureToTexture(\n this.write_offset,\n texture_data.one_pixel,\n texture_data.dst\n );\n }\n\n get_mesh()\n {\n return new Mesh(this.geometry, this.material);\n }\n\n __set_pixel_rgb(data_texture, index, vector3, use_r, use_g, use_b)\n {\n if (use_r)\n {\n data_texture.image.data[index * 3 + 0] = vector3.x;\n }\n if (use_g)\n {\n data_texture.image.data[index * 3 + 1] = vector3.y;\n }\n if (use_b)\n {\n data_texture.image.data[index * 3 + 2] = vector3.z;\n }\n }\n\n __set_pixel_rgba(data_texture, index, vector4, use_r, use_g, use_b, use_a)\n {\n if (use_r)\n {\n data_texture.image.data[index * 4 + 0] = vector4.x;\n }\n if (use_g)\n {\n data_texture.image.data[index * 4 + 1] = vector4.y;\n }\n if (use_b)\n {\n data_texture.image.data[index * 4 + 2] = vector4.z;\n }\n if (use_a)\n {\n data_texture.image.data[index * 4 + 3] = vector4.w;\n }\n }\n\n __flood_data_texture_rgb(data_texture, v3)\n {\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\n {\n this.__set_pixel_rgb(data_texture.src, i, v3, true, true, true);\n data_texture.dirty_count++;\n }\n }\n\n __flood_data_texture_rgba(data_texture, v4)\n {\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\n {\n this.__set_pixel_rgba(data_texture.src, i, v4, true, true, true, true);\n data_texture.dirty_count++;\n }\n }\n\n __create_rgb_texture(width)\n {\n const data = new Uint8Array(3 * width * width);\n return new DataTexture(data, width, width, RGBFormat);\n }\n\n __create_rgba_texture(width)\n {\n const data = new Uint8Array(4 * width * width);\n return new DataTexture(data, width, width, RGBAFormat);\n }\n\n __create_rgba_float_texture(width)\n {\n const data = new Float32Array(4 * width * width);\n return new DataTexture(data, width, width, RGBAFormat, FloatType);\n }\n\n __get_data_texture(uniform_name)\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (this.data_textures[i].name === uniform_name)\n {\n return this.data_textures[i];\n }\n }\n console.error('Data texture ' + uniform_name + ' does not exist');\n return undefined;\n }\n\n __get_object_index(name)\n {\n for (let i = 0; i < this.object_names.length; i++)\n {\n if (this.object_names[i] === name)\n {\n return i;\n }\n }\n console.error('the name ' + name + ' is not contained in this batch');\n return undefined;\n }\n\n __add_data_texture(uniform_name, src_texture, dst_texture, one_pixel_text)\n {\n dst_texture.needsUpdate = true;\n\n this.data_textures.push({\n name: uniform_name,\n src: src_texture,\n dst: dst_texture,\n one_pixel: one_pixel_text,\n last_accessed_index: -1,\n dirty_count: 0\n });\n\n this.uniforms[uniform_name] = { value: dst_texture };\n return this.data_textures[this.data_textures.length - 1];\n }\n\n dispose()\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n this.data_textures[i].src.dispose();\n this.data_textures[i].dst.dispose();\n this.data_textures[i].one_pixel.dispose();\n }\n }\n}\n\nexport { GeometryBatch };\n","import { GeometryBatch } from './GeometryBatch';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { BufferAttribute } from 'three';\nimport { OMath } from '../utilities/OMath';\n\nclass GeometryBatcher\n{\n init()\n {\n this.batches = [];\n }\n\n batch(buffer_geometries)\n {\n const attr_accessor_uvs = [];\n const texture_width = OMath.ceilPowerOfTwo(Math.sqrt(buffer_geometries.length));\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\n\n this.__init_uv_array(attr_accessor_uvs, texture_width);\n\n let uv_index = 0;\n\n for (let i = 0; i < buffer_geometries.length; i++)\n {\n const vertex_count = buffer_geometries[i].getAttribute('position').count;\n const y = Math.floor(i / texture_width);\n const x = i - texture_width * y;\n for (let count = 0; count < vertex_count; count++)\n {\n attr_accessor_uvs[uv_index] = (x / texture_width) + 0.5 / texture_width;\n attr_accessor_uvs[uv_index + 1] = (y / texture_width) + 0.5 / texture_width;\n uv_index += 2;\n }\n }\n\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_accessor_uvs), 2);\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(buffer_geometries);\n buffer_geometry.setAttribute('attr_accessor_uv', buffer_attribute);\n\n this.batches.push(new GeometryBatch(buffer_geometry, texture_width));\n return this.batches[this.batches.length - 1];\n }\n\n upload_texture_data(renderer)\n {\n for (let i = 0; i < this.batches.length; i++)\n {\n this.batches[i].upload_texture_data(renderer, 1);\n }\n }\n\n __init_uv_array(uvs, texture_width)\n {\n for (let i = 0; i < texture_width * texture_width * 2; i++)\n {\n uvs.push(0);\n }\n }\n}\n\nconst geometry_batcher = new GeometryBatcher();\nexport { geometry_batcher as GeometryBatcher };\n","import { CameraManager } from './CameraManager';\nimport { Graphics } from './Graphics';\n\nimport { Vector2 } from 'three';\nimport { Scene } from 'three';\nimport { OrthographicCamera } from 'three';\n\nclass UI\n{\n init(input)\n {\n this.input = input;\n this.ui_elements = [];\n this._tmp_normalized_pos = new Vector2();\n this.ss_scene = new Scene();\n this.ss_scene.matrixWorldAutoUpdate = false;\n this.ss_scene.frustumCulled = false;\n\n this.ws_scene = new Scene();\n this.ws_scene.matrixWorldAutoUpdate = false;\n this.ws_scene.frustumCulled = false;\n\n this.ss_camera = new OrthographicCamera(-1, 1, 1, -1, -100, 100);\n }\n\n delete_element(elem)\n {\n const index = this.ui_elements.indexOf(elem);\n if (index > -1)\n {\n this.ui_elements.splice(index, 1);\n }\n\n this.ss_scene.remove(elem);\n this.ws_scene.remove(elem);\n\n elem.dispose();\n }\n\n add_screen_space_element(elem)\n {\n this.ui_elements.push(elem);\n this.ss_scene.add(elem);\n\n elem.set_screen_space_coordinate_system();\n }\n\n add_world_space_element(elem)\n {\n this.ui_elements.push(elem);\n this.ws_scene.add(elem);\n\n elem.set_world_space_coordinate_system();\n }\n\n update()\n {\n // this.ss_camera.left = -OScreen.width / 2;\n // this.ss_camera.right = OScreen.width / 2;\n // this.ss_camera.top = OScreen.top / 2;\n // this.ss_camera.right = -OScreen.bottom / 2;\n this.ss_camera.updateProjectionMatrix();\n\n this._tmp_normalized_pos.copy(this.input.NDC);\n for (let i = 0; i < this.ui_elements.length; i++)\n {\n this.ui_elements[i].update_state(this._tmp_normalized_pos);\n }\n }\n\n render(renderer)\n {\n // renderer.render_ui(this.scene);\n if (this.ss_scene.children.length > 0)\n {\n Graphics.render(this.ss_scene, this.ss_camera);\n }\n if (this.ws_scene.children.length > 0)\n {\n Graphics.render(this.ws_scene, CameraManager.current);\n }\n }\n\n clear()\n {\n this.current_clicked_element = undefined;\n }\n}\n\nconst ui = new UI();\nexport { ui as UI };\n","import { Vector3, Plane, Quaternion, Sphere, Line3 } from 'three';\nimport { OMath } from './OMath';\n\nclass PerspectiveFrustumPointFitter\n{\n constructor()\n {\n this.sphere = new Sphere();\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n this.sphere.setFromPoints(points);\n\n const v_fov = OMath.degToRad(vertical_fov / 2);\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\n\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\n\n const sphere_center = this.sphere.center.clone();\n\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\n\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\n\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n let closest_distance = Infinity;\n\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\n for (let i = 0; i < points.length; i++)\n {\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\n\n const up_line_intersection = new Vector3();\n const down_line_intersection = new Vector3();\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n up_plane.intersectLine(line, up_line_intersection);\n down_plane.intersectLine(line, down_line_intersection);\n\n left_plane.intersectLine(line, left_line_intersection);\n right_plane.intersectLine(line, right_line_intersection);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('down intersection not found', i);\n }\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\n\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\n\n const vertical_min = Math.min(new_up_distance, new_down_distance);\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\n\n const min = Math.min(vertical_min, horizontal_min);\n\n if (min < closest_distance)\n {\n closest_distance = min;\n }\n }\n\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\n const closest_position = far_pos.clone().add(forward_correction);\n\n return closest_position;\n }\n\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\n {\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\n const horizontal_offset = this.get_horizontal_correction(points, left_plane, right_plane, camera_quaternion);\n\n target_pos.add(vertical_offset);\n target_pos.add(horizontal_offset);\n }\n\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\n {\n let closest_distance_to_up_plane = Infinity;\n let closest_distance_to_down_plane = Infinity;\n // let closest_up_point = undefined;\n // let closest_down_point = undefined;\n\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\n for (let i = 0; i < points.length; i++)\n {\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\n\n const down_line_intersection = new Vector3();\n const up_line_intersection = new Vector3();\n\n down_plane.intersectLine(down_line, down_line_intersection);\n up_plane.intersectLine(up_line, up_line_intersection);\n\n const down_dist = down_line_intersection.distanceTo(points[i]);\n const up_dist = up_line_intersection.distanceTo(points[i]);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('vertical up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('vertical down intersection not found', i);\n }\n\n if (down_dist < closest_distance_to_down_plane)\n {\n closest_distance_to_down_plane = down_dist;\n // closest_down_point = points[i];\n }\n if (up_dist < closest_distance_to_up_plane)\n {\n closest_distance_to_up_plane = up_dist;\n // closest_up_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\n\n // console.log(\"vertical_correction\", correction)\n return up_dir.clone().multiplyScalar(-correction);\n }\n\n get_horizontal_correction(points, left_plane, right_plane, camera_quaternion)\n {\n let closest_distance_to_right_plane = Infinity;\n let closest_distance_to_left_plane = Infinity;\n // let closest_right_point = undefined;\n // let closest_left_point = undefined;\n\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\n\n for (let i = 0; i < points.length; i++)\n {\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n left_plane.intersectLine(left_line, left_line_intersection);\n right_plane.intersectLine(right_line, right_line_intersection);\n\n const left_dist = left_line_intersection.distanceTo(points[i]);\n const right_dist = right_line_intersection.distanceTo(points[i]);\n\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n if (left_dist < closest_distance_to_left_plane)\n {\n closest_distance_to_left_plane = left_dist;\n // closest_left_point = points[i];\n }\n if (right_dist < closest_distance_to_right_plane)\n {\n closest_distance_to_right_plane = right_dist;\n // closest_right_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\n // console.log(\"horizontal_correction\", correction)\n\n return right_dir.clone().multiplyScalar(-correction);\n }\n\n get_up_plane_normal(camera_quaternion, v_fov)\n {\n const up_plane_normal = new Vector3(0, -1, 0);\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\n up_plane_normal.applyQuaternion(camera_quaternion);\n return up_plane_normal;\n }\n\n get_down_plane_normal(camera_quaternion, v_fov)\n {\n const down_plane_normal = new Vector3(0, 1, 0);\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\n down_plane_normal.applyQuaternion(camera_quaternion);\n return down_plane_normal;\n }\n\n get_left_plane_normal(camera_quaternion, h_fov)\n {\n const left_plane_normal = new Vector3(1, 0, 0);\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\n left_plane_normal.applyQuaternion(camera_quaternion);\n return left_plane_normal;\n }\n\n get_right_plane_normal(camera_quaternion, h_fov)\n {\n const right_plane_normal = new Vector3(-1, 0, 0);\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\n right_plane_normal.applyQuaternion(camera_quaternion);\n return right_plane_normal;\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n\nexport { PerspectiveFrustumPointFitter };\n","import { Vector3, Box3 } from 'three';\n\nclass OrthographicFrustumPointFitter\n{\n constructor()\n {\n\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n const inverse_camera_quat = camera_quaternion.clone().inverse();\n\n const inverted_points = [];\n\n for (let i = 0; i < points.length; i++)\n {\n inverted_points.push(points[i].clone().applyQuaternion(inverse_camera_quat));\n }\n\n const box = new Box3().setFromPoints(inverted_points);\n const size = new Vector3();\n box.getSize(size);\n\n const distance = this.get_distance_to_fit_rect(size.x / 2, size.y / 2, vertical_fov, aspect);\n\n const center = new Vector3();\n box.getCenter(center);\n\n center.applyQuaternion(camera_quaternion);\n\n return {\n center: center,\n distance_to_center: distance\n };\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n\nexport { OrthographicFrustumPointFitter };\n","import { CameraManager } from '../CameraManager';\nimport { OMath } from '../utilities/OMath';\nimport { OScreen } from '../OScreen';\n\nimport { Vector3 } from 'three';\nimport { Matrix4 } from 'three';\nimport { Plane } from 'three';\nimport { Ray } from 'three';\nimport { Sphere } from 'three';\nimport { Box3 } from 'three';\nimport { PerspectiveFrustumPointFitter } from './PerspectiveFrustumPointFitter';\nimport { OrthographicFrustumPointFitter } from './OrthographicFrustumPointFitter';\n\nclass CameraUtilities\n{\n init(input)\n {\n this.tmp_mat = new Matrix4();\n this.plane = new Plane();\n this.ray = new Ray();\n\n this.tmp_size = new Vector3();\n this.tmp_unproj = new Vector3();\n\n this.input = input;\n }\n\n get_up_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(0, 1, 0);\n tmp_vec.applyQuaternion(camera.quaternion);\n\n return tmp_vec;\n }\n\n get_forward_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(0, 0, -1);\n tmp_vec.applyQuaternion(camera.quaternion);\n\n return tmp_vec;\n }\n\n get_right_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(1, 0, 0);\n tmp_vec.applyQuaternion(camera.quaternion);\n return tmp_vec;\n }\n\n unproject_mouse_position(NDC, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n const v_fov = (camera.fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * camera.aspect)) / 2;\n\n const distV = Math.tan(v_fov) * camera.far;\n const distH = Math.tan(h_fov) * camera.far;\n\n tmp_vec.set(distH * NDC.x, distV * NDC.y, -camera.far).normalize();\n\n return tmp_vec.applyQuaternion(camera.quaternion);\n }\n\n get_plane_intersection(plane_position, plane_normal, NDC, camera)\n {\n camera = camera || CameraManager.current;\n NDC = NDC || this.input.NDC;\n\n const tmp_vec = new Vector3();\n\n this.plane.setFromNormalAndCoplanarPoint(plane_normal || this.get_forward_dir(camera), plane_position);\n if (camera.isPerspectiveCamera)\n {\n this.ray.set(camera.position, this.unproject_mouse_position(NDC, camera));\n }\n else\n {\n this.tmp_unproj.set(NDC.x, NDC.y, 1).unproject(camera);\n this.ray.set(camera.position, this.tmp_unproj);\n }\n\n this.ray.intersectPlane(this.plane, tmp_vec);\n return tmp_vec;\n }\n\n fit_points_on_camera(points, zoom_scale = 1)\n {\n const points_sphere = new Sphere().setFromPoints(points);\n const world_space_center = points_sphere.center;\n const camera_forward = this.get_forward_dir(CameraManager.current).clone();\n\n const plane = new Plane().setFromNormalAndCoplanarPoint(camera_forward, world_space_center);\n\n const points_on_plane = OMath.project_points_on_plane(points, plane);\n\n const projected_points_center = new Vector3();\n let box = new Box3().setFromPoints(points_on_plane);\n box.getCenter(projected_points_center);\n\n const up = new Vector3(0, 1, 0).applyQuaternion(CameraManager.current.quaternion);\n const right = up.clone().cross(camera_forward).normalize();\n const mat = new Matrix4().set(right.x, up.x, camera_forward.x, world_space_center.x,\n right.y, up.y, camera_forward.y, world_space_center.y,\n right.z, up.z, camera_forward.z, world_space_center.z,\n 0, 0, 0, 1);\n\n const inverse_mat = new Matrix4().getInverse(mat);\n for (let i = 0; i < points_on_plane.length; i++)\n {\n points_on_plane[i].applyMatrix4(inverse_mat);\n }\n\n const size = new Vector3();\n box = new Box3().setFromPoints(points_on_plane);\n box.getSize(size);\n size.multiplyScalar(zoom_scale);\n const projected_center = new Vector3();\n box.getCenter(projected_center);\n\n return {\n position: projected_points_center,\n zoom: this.get_zoom_to_fit_rect(size.x / 2, size.y / 2)\n };\n }\n\n get_zoom_to_fit_rect(width, height)\n {\n const v_fov = (CameraManager.current.fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * CameraManager.current.aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n\n get_zoom_to_fit_box(bb, camera)\n {\n if (camera.isOrthographicCamera)\n {\n bb.getSize(this.tmp_size);\n\n const obj_x = this.tmp_size.x;\n const obj_y = this.tmp_size.y;\n const object_aspect = obj_x / obj_y;\n if (OScreen.aspect_ratio / object_aspect > 1)\n {\n return OScreen.height / obj_y;\n }\n else\n {\n return OScreen.width / obj_x;\n }\n }\n else\n {\n // return this.fit_points_on_camera([bb.min, bb.max], 1).zoom;\n const size = new Vector3();\n bb.getSize(size);\n return this.get_zoom_to_fit_rect(size.x, size.y);\n }\n }\n\n get_html_screen_pos(object, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n object.getWorldPosition(tmp_vec);\n tmp_vec.project(camera);\n\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\n return tmp_vec;\n }\n\n world_pos_to_screen(pos, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.copy(pos);\n tmp_vec.project(camera);\n\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\n return tmp_vec;\n }\n\n update_projection(camera)\n {\n camera.left = -OScreen.width / 2;\n camera.right = OScreen.width / 2;\n camera.top = OScreen.height / 2;\n camera.bottom = -OScreen.height / 2;\n camera.aspect = OScreen.aspect_ratio;\n camera.updateProjectionMatrix(true);\n }\n\n fit_bounding_box_points(camera, bb, scale = 1)\n {\n const dir = new Vector3();\n dir.copy(bb.max).sub(bb.min);\n\n const p1 = bb.min.clone();\n\n const p2 = p1.clone().add(new Vector3(dir.x, 0, 0));\n const p3 = p1.clone().add(new Vector3(0, dir.y, 0));\n const p4 = p1.clone().add(new Vector3(0, 0, dir.z));\n\n const p5 = p1.clone().add(new Vector3(dir.x, 0, dir.z));\n const p6 = p1.clone().add(new Vector3(0, dir.y, dir.z));\n const p7 = bb.max.clone();\n const p8 = p1.clone().add(new Vector3(dir.x, dir.y, 0));\n return this.fit_points(camera, [p1, p2, p3, p4, p5, p6, p7, p8], scale);\n }\n\n fit_points(camera, points, zoom_scale = 1)\n {\n if (camera.isPerspectiveCamera)\n {\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera.quaternion);\n const camera_backward_dir = camera_forward_dir.clone().multiplyScalar(-1);\n\n const fitter = new PerspectiveFrustumPointFitter();\n\n const aspect_ratio = OScreen.aspect_ratio;\n\n const camera_pos = fitter.fit_points(points, camera.quaternion, camera.fov * zoom_scale, aspect_ratio);\n const box = new Box3().setFromPoints(points);\n const center = new Vector3();\n box.getCenter(center);\n\n const reference_position_plane = new Plane().setFromNormalAndCoplanarPoint(camera_backward_dir, center);\n\n const camera_ray = new Ray(camera_pos, camera_forward_dir);\n\n const reference_position = new Vector3();\n camera_ray.intersectPlane(reference_position_plane, reference_position);\n\n const zoom = camera_pos.distanceTo(reference_position);\n\n return {\n zoom: zoom,\n reference_position: reference_position,\n camera_position: camera_pos\n };\n }\n else\n {\n const fitter = new OrthographicFrustumPointFitter();\n const result = fitter.fit_points(points, this.reference_rotation, camera.fov * zoom_scale, OScreen.aspect_ratio);\n\n this.reference_position.copy(result.center);\n this.reference_zoom = result.distance_to_center;\n\n const forward = new Vector3(0, 0, 1).applyQuaternion(camera.quaternion);\n return {\n zoom: result.distance_to_center,\n reference_position: result.center,\n camera_position: forward.multiplyScalar(result.distance_to_center)\n };\n }\n }\n}\n\nconst camera_utilities = new CameraUtilities();\nexport { camera_utilities as CameraUtilities };\n","import { Browser } from './Browser';\nimport { CameraManager } from './CameraManager';\nimport { Capabilities } from './Capabilities';\nimport { Configuration } from './Configuration';\nimport { Debug } from './Debug';\nimport { EventManager } from './EventManager';\nimport { Graphics } from './Graphics';\nimport { OS } from './OS';\nimport { OScreen } from './OScreen';\nimport { ReflectionPlaneContext } from './ReflectionPlaneContext';\nimport { ResourceContainer } from './ResourceContainer';\nimport { SceneManager } from './SceneManager';\nimport { GeometryBatcher } from './static_batcher/GeometryBatcher';\nimport { Time } from './Time';\nimport { UI } from './UI';\nimport { CameraUtilities } from './utilities/CameraUtilities';\n\nclass Initializer\n{\n constructor()\n {\n }\n\n init(input)\n {\n CameraManager.init();\n CameraUtilities.init(input);\n Capabilities.init();\n Configuration.init();\n EventManager.init();\n GeometryBatcher.init();\n\n OS.init();\n Browser.init();\n ReflectionPlaneContext.init();\n ResourceContainer.init();\n SceneManager.init();\n OScreen.init();\n Time.init();\n UI.init(input);\n\n Debug.init();\n }\n\n dispose(render_loop)\n {\n Graphics.dispose();\n SceneManager.dispose();\n\n render_loop.dispose();\n }\n}\n\nconst initializer = new Initializer();\nexport { initializer as Initializer };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/ssao/ssao.frag';\nimport vert from '../shaders/ssao/ssao.vert';\n\nimport { Matrix4 } from 'three';\nimport { Vector3 } from 'three';\nimport { DataTexture } from 'three';\nimport { RGBFormat } from 'three';\nimport { RepeatWrapping } from 'three';\n\nimport { OMath } from '../utilities/OMath';\nclass SSAOMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, vert);\n\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\n this.uniforms._ProjectionMatrix = { value: new Matrix4() };\n\n this.uniforms._Bias = { value: 0.0125 };\n this.uniforms._Radius = { value: 0.3 };\n this.uniforms._FarPlane = { value: 100 };\n\n this.uniforms._SampleKernel = { value: this.__get_sample_kernel() };\n this.uniforms._RandomRotation = { value: this.__get_rotation_kernel() };\n }\n\n __get_sample_kernel()\n {\n const sample_kernel = [];\n const kernel_size = 64;\n\n for (let i = 0; i < kernel_size; i++)\n {\n const dir = new Vector3(Math.random() * 2 - 1,\n Math.random() * 2 - 1,\n Math.random());\n dir.normalize();\n let scale = i / kernel_size;\n scale = OMath.lerp(0.1, 1.0, scale * scale);\n dir.multiplyScalar(scale);\n\n sample_kernel.push(dir);\n }\n return sample_kernel;\n }\n\n __get_rotation_kernel()\n {\n const rotation_kernel = new Uint8Array(3 * 16);\n for (let i = 0; i < 16; i++)\n {\n rotation_kernel[i * 3 + 1] = Math.floor(Math.random() * 255);\n rotation_kernel[i * 3 + 2] = Math.floor(Math.random() * 255);\n rotation_kernel[i * 3 + 3] = 0;\n }\n\n const rotation_texture = new DataTexture(rotation_kernel, 4, 4, RGBFormat);\n rotation_texture.wrapS = RepeatWrapping;\n rotation_texture.wrapT = RepeatWrapping;\n\n rotation_texture.needsUpdate = true;\n return rotation_texture;\n }\n}\n\nexport { SSAOMaterial };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/ssao/ssao_compose.frag';\n\nclass SSAOComposeMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag);\n this.uniforms._AO = { value: undefined };\n }\n}\n\nexport { SSAOComposeMaterial };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/depth_normals/debug_normals.frag';\nimport depth_normals_vert from '../shaders/ssao/ssao.vert';\n\nimport { Matrix4 } from 'three';\n\nclass DisplayNormalTextureMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, depth_normals_vert);\n this.uniforms._FarPlane = { value: 1 };\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\n }\n}\n\nexport { DisplayNormalTextureMaterial };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/box_blur/box_blur.frag';\n\nimport { Vector2 } from 'three';\n\nclass BoxBlurMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag);\n this.uniforms._SampleDir = { value: new Vector2() };\n }\n}\n\nexport { BoxBlurMaterial };\n","import { BoxBlurMaterial } from '../materials/BoxBlurMaterial';\nimport { Graphics } from '../Graphics';\n\nimport { WebGLRenderTarget } from 'three';\n\nclass Blurrer\n{\n constructor(renderer)\n {\n this.RT1 = new WebGLRenderTarget(1, 1);\n this.RT2 = new WebGLRenderTarget(1, 1);\n this.box_blur_mat = new BoxBlurMaterial();\n }\n\n blur(RT)\n {\n if (RT.width !== this.RT1.width || RT.height !== this.RT1.height)\n {\n this.RT1.setSize(RT.width, RT.height);\n this.RT2.setSize(RT.width, RT.height);\n }\n\n this.box_blur_mat.uniforms._SampleDir.value.set(1, 0);\n Graphics.blit(RT, this.RT1, this.box_blur_mat);\n this.box_blur_mat.uniforms._SampleDir.value.set(0, 1);\n Graphics.blit(this.RT1, RT, this.box_blur_mat);\n // return this.RT2;\n }\n}\n\nexport { Blurrer };\n","import { CameraManager } from '../CameraManager';\nimport { SceneManager } from '../SceneManager';\nimport { OScreen } from '../OScreen';\nimport { BaseRender } from '../render_mode/BaseRender';\nimport { Configuration } from '../Configuration';\nimport { SSAOMaterial } from '../materials/SSAOMaterial';\nimport { SSAOComposeMaterial } from '../materials/SSAOComposeMaterial';\nimport { DisplayNormalTextureMaterial } from '../materials/DisplayNormalTextureMaterial';\nimport { Blurrer } from '../render_utilities/Blurrer';\nimport { Graphics } from '../Graphics';\n\nimport { WebGLRenderTarget } from 'three';\n\nclass NormalAORender extends BaseRender\n{\n constructor()\n {\n super();\n\n this.ssao_mat = new SSAOMaterial();\n this.ssao_compose_mat = new SSAOComposeMaterial();\n this.debug_normals = new DisplayNormalTextureMaterial();\n\n this.ssaa = Configuration.use_ssaa ? 2 : 1;\n\n this.main_RT = new WebGLRenderTarget(OScreen.width * this.ssaa, OScreen.height * this.ssaa);\n\n this.SSAO_RT = new WebGLRenderTarget(OScreen.width, OScreen.height);\n\n this.blurrer = new Blurrer();\n Graphics.generateDepthNormalTexture = true;\n }\n\n render()\n {\n this.__check_RT_size();\n\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\n\n this.__update_uniforms();\n\n Graphics.blit(Graphics.depth_normals_RT, this.SSAO_RT, this.ssao_mat);\n\n // // BLUR\n this.blurrer.blur(this.SSAO_RT);\n Graphics.blit(this.SSAO_RT, undefined);\n\n // // COMPOSE\n this.ssao_compose_mat.uniforms._AO.value = this.SSAO_RT.texture;\n Graphics.blit(this.main_RT, undefined, this.ssao_compose_mat);\n\n // Graphics.blit(this.SSAO_RT, undefined);\n }\n\n __update_uniforms()\n {\n this.ssao_mat.uniforms._InverseProjMatrix.value.getInverse(CameraManager.current.projectionMatrix);\n this.ssao_mat.uniforms._ProjectionMatrix.value.copy(CameraManager.current.projectionMatrix);\n this.ssao_mat.uniforms._FarPlane.value = CameraManager.current.far;\n }\n\n __check_RT_size()\n {\n if (this.main_RT.width !== OScreen.width * this.ssaa || this.main_RT.height !== OScreen.height * this.ssaa)\n {\n this.main_RT.setSize(OScreen.width * this.ssaa, OScreen.height * this.ssaa);\n this.SSAO_RT.setSize(OScreen.width, OScreen.height);\n }\n }\n}\n\nexport { NormalAORender };\n","import { CameraManager } from '../CameraManager';\nimport { SceneManager } from '../SceneManager';\nimport { BaseRender } from '../render_mode/BaseRender';\nimport { Graphics } from '../Graphics';\n\nclass NormalRender extends BaseRender\n{\n constructor()\n {\n super();\n }\n\n render()\n {\n Graphics.clear(undefined, CameraManager.current, true, true);\n\n if (SceneManager.current.on_pre_render)\n {\n SceneManager.current.on_pre_render();\n }\n\n if (SceneManager.current.render)\n {\n SceneManager.current.render();\n }\n else\n {\n Graphics.render(SceneManager.current, CameraManager.current);\n }\n\n if (SceneManager.current.on_post_render)\n {\n SceneManager.current.on_post_render();\n }\n }\n}\n\nexport { NormalRender };\n","import { CameraManager } from '../CameraManager';\nimport { SceneManager } from '../SceneManager';\nimport { BaseRender } from '../render_mode/BaseRender';\nimport { Graphics } from '../Graphics';\n\nclass VRRender extends BaseRender\n{\n constructor()\n {\n super();\n }\n\n render()\n {\n // Graphics.clear(undefined, CameraManager.current, true, true);\n\n if (SceneManager.current.on_pre_render)\n {\n SceneManager.current.on_pre_render();\n }\n\n if (SceneManager.current.render)\n {\n SceneManager.current.render();\n }\n else\n {\n Graphics.render(SceneManager.current, CameraManager.current, Graphics._renderer.getRenderTarget());\n }\n\n this.render_spectator_camera();\n\n if (SceneManager.current.on_post_render)\n {\n SceneManager.current.on_post_render();\n }\n }\n\n render_spectator_camera()\n {\n const spectator_camera = CameraManager.spectator;\n\n if (spectator_camera && Graphics._renderer.xr.isPresenting)\n {\n // Copy the XR Camera's position and rotation, but use your\n // main camera's projection matrix\n const xrCam = Graphics._renderer.xr.getCamera(CameraManager.current);\n\n spectator_camera.projectionMatrix.copy(CameraManager.current.projectionMatrix);\n\n spectator_camera.position.copy(xrCam.position);\n spectator_camera.quaternion.copy(xrCam.quaternion);\n\n // we'll restore this later\n const currentRenderTarget = Graphics._renderer.getRenderTarget();\n\n // turn off the WebXR rendering\n Graphics._renderer.xr.isPresenting = false;\n\n // render to the canvas on our main display\n Graphics._renderer.setRenderTarget(null);\n Graphics._renderer.render(SceneManager.current, spectator_camera);\n\n // reset back to enable WebXR\n Graphics._renderer.setRenderTarget(currentRenderTarget);\n Graphics._renderer.xr.isPresenting = true;\n }\n }\n}\n\nexport { VRRender };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/gaussian_blur/gaussian_blur.frag';\n\nimport { Vector2 } from 'three';\n\nclass GaussianBlurMaterial extends BlitMaterial\n{\n constructor(kernel_radius)\n {\n super(frag, undefined, {\n KERNEL_RADIUS: kernel_radius,\n SIGMA: kernel_radius\n });\n\n this.uniforms.texSize = { value: new Vector2(0.5, 0.5) };\n this.uniforms.direction = { value: new Vector2(0.5, 0.5) };\n }\n\n set_size(w, h)\n {\n this.uniforms.texSize.value.x = w;\n this.uniforms.texSize.value.y = h;\n }\n\n set_direction(x, y)\n {\n this.uniforms.direction.value.set(x, y);\n }\n}\n\nexport { GaussianBlurMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/luminosity_high_pass/luminosity_high_pass.frag';\n\nimport { Color } from 'three';\nclass LuminosityHighPassMaterial extends BlitMaterial\n{\n constructor(kernel_radius)\n {\n super(frag);\n\n this.uniforms.luminosityThreshold = { value: 0.23 };\n this.uniforms.smoothWidth = { value: 0.01 };\n this.uniforms.defaultColor = { value: new Color('#000000') };\n this.uniforms.defaultOpacity = { value: 0.0 };\n }\n}\n\nexport { LuminosityHighPassMaterial };\n","import { GaussianBlurMaterial } from '../materials/GaussianBlurMaterial';\nimport { LuminosityHighPassMaterial } from '../materials/LuminosityHighPassMaterial';\nimport { Graphics } from '../Graphics';\n\nimport { WebGLRenderTarget, LinearFilter, RGBAFormat } from 'three';\n\nclass GaussianBlurrer\n{\n constructor(nMips = 5)\n {\n this.current_width = 1;\n this.current_height = 1;\n\n this.separableBlurMaterials = [];\n this.renderTargetsHorizontal = [];\n this.renderTargetsVertical = [];\n\n this.nMips = nMips;\n this.kernelSizeArray = [3, 5, 7, 9, 11];\n this.rt_pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat };\n\n this.renderTargetBright = new WebGLRenderTarget(1, 1, this.rt_pars);\n this.renderTargetBright.texture.generateMipmaps = false;\n\n this.init_materials();\n this.init_RT();\n\n this.luminosity_high_pass_mat = new LuminosityHighPassMaterial();\n }\n\n blur(RT, use_luminosity_high_pass)\n {\n this.resize_RT(RT.width, RT.height);\n\n if (use_luminosity_high_pass)\n {\n Graphics.blit(RT, this.renderTargetBright, this.luminosity_high_pass_mat);\n }\n else\n {\n Graphics.blit(RT, this.renderTargetBright);\n }\n\n let inputRenderTarget = this.renderTargetBright;\n\n for (let i = 0; i < this.nMips; i++)\n {\n const mat = this.separableBlurMaterials[i];\n\n mat.set_direction(1, 0);\n Graphics.blit(inputRenderTarget, this.renderTargetsHorizontal[i], mat);\n\n mat.set_direction(0, 1);\n Graphics.blit(this.renderTargetsHorizontal[i], this.renderTargetsVertical[i], mat);\n\n inputRenderTarget = this.renderTargetsVertical[i];\n }\n }\n\n get_blurred_texture()\n {\n return this.renderTargetsHorizontal[0].texture;\n }\n\n get_blurred_RT()\n {\n return this.renderTargetsHorizontal[0];\n }\n\n init_RT()\n {\n this.dispose_RT();\n\n this.renderTargetBright.setSize(1, 1);\n\n for (let i = 0; i < this.nMips; i++)\n {\n const hor = new WebGLRenderTarget(1, 1, this.rt_pars);\n const ver = new WebGLRenderTarget(1, 1, this.rt_pars);\n\n hor.texture.generateMipmaps = false;\n ver.texture.generateMipmaps = false;\n\n this.renderTargetsHorizontal.push(hor);\n this.renderTargetsVertical.push(ver);\n }\n }\n\n resize_RT(texture_width, texture_height)\n {\n if (this.current_width === texture_width && this.current_height === texture_height)\n {\n return;\n }\n\n this.current_width = texture_width;\n this.current_height = texture_height;\n\n let width = Math.round(texture_width / 2);\n let height = Math.round(texture_height / 2);\n\n this.renderTargetBright.setSize(width, height);\n\n for (let i = 0; i < this.nMips; i++)\n {\n this.renderTargetsVertical[i].setSize(width, height);\n this.renderTargetsHorizontal[i].setSize(width, height);\n this.separableBlurMaterials[i].set_size(width, height);\n\n width = Math.round(width / 2);\n height = Math.round(height / 2);\n }\n }\n\n init_materials(texture_width, texture_height)\n {\n this.dispose_materials();\n\n for (let i = 0; i < this.nMips; i++)\n {\n this.separableBlurMaterials.push(new GaussianBlurMaterial(this.kernelSizeArray[i]));\n }\n }\n\n dispose_materials()\n {\n for (let i = 0; i < this.separableBlurMaterials.length; i++)\n {\n this.separableBlurMaterials[i].dispose();\n }\n this.separableBlurMaterials.length = 0;\n }\n\n dispose_RT()\n {\n for (let i = 0; i < this.renderTargetsVertical.length; i++)\n {\n this.renderTargetsHorizontal[i].dispose();\n this.renderTargetsVertical[i].dispose();\n }\n this.renderTargetBright.dispose();\n\n this.renderTargetsHorizontal.length = 0;\n this.renderTargetsVertical.length = 0;\n }\n}\n\nexport { GaussianBlurrer };\n","import { OScreen } from '../OScreen';\nimport { BaseRender } from '../render_mode/BaseRender';\nimport { UnrealBloomComposeMaterial } from '../materials/UnrealBloomComposeMaterial';\nimport { AddMaterial } from '../materials/AddMaterial';\n\nimport { WebGLRenderTarget } from 'three';\n\nimport { GaussianBlurrer } from '../render_utilities/GaussianBlurrer';\nimport { Graphics } from '../Graphics';\nimport { CameraManager } from '../CameraManager';\nimport { SceneManager } from '../SceneManager';\n\nclass UnrealBloomRender extends BaseRender\n{\n constructor()\n {\n super();\n\n this.bloom_compose_mat = undefined;\n\n this.main_RT = undefined;\n this.blur_RT = undefined;\n this.blurrer = undefined;\n\n this.add_mat = new AddMaterial();\n }\n\n on_enter()\n {\n this.blurrer = new GaussianBlurrer();\n this.main_RT = new WebGLRenderTarget(OScreen.width, OScreen.height);\n this.blur_RT = new WebGLRenderTarget(OScreen.width, OScreen.height);\n\n this.bloom_compose_mat = new UnrealBloomComposeMaterial(5);\n this.blurrer = new GaussianBlurrer(5);\n\n this.bloom_compose_mat.set_RT_0(this.blurrer.renderTargetsVertical[0].texture);\n this.bloom_compose_mat.set_RT_1(this.blurrer.renderTargetsVertical[1].texture);\n this.bloom_compose_mat.set_RT_2(this.blurrer.renderTargetsVertical[2].texture);\n this.bloom_compose_mat.set_RT_3(this.blurrer.renderTargetsVertical[3].texture);\n this.bloom_compose_mat.set_RT_4(this.blurrer.renderTargetsVertical[4].texture);\n\n this.bloom_compose_mat.set_bloom_strength(1);\n this.bloom_compose_mat.set_bloom_radius(1);\n\n this.add_mat.set_add_texture(this.blurrer.renderTargetsHorizontal[0].texture);\n }\n\n set_bloom_strength(val)\n {\n this.bloom_compose_mat.set_bloom_strength(val);\n }\n\n set_bloom_radius(val)\n {\n this.bloom_compose_mat.set_bloom_radius(val);\n }\n\n set_tint_color_0(col_string)\n {\n this.bloom_compose_mat.set_tint_color_0(col_string);\n }\n\n set_tint_color_1(col_string)\n {\n this.bloom_compose_mat.set_tint_color_1(col_string);\n }\n\n set_tint_color_2(col_string)\n {\n this.bloom_compose_mat.set_tint_color_2(col_string);\n }\n\n set_tint_color_3(col_string)\n {\n this.bloom_compose_mat.set_tint_color_3(col_string);\n }\n\n set_tint_color_4(col_string)\n {\n this.bloom_compose_mat.set_tint_color_4(col_string);\n }\n\n render()\n {\n this.__check_RT_size();\n\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\n\n // // BLUR\n this.blurrer.blur(this.main_RT, true);\n\n // Blur compose\n Graphics.material_pass(this.bloom_compose_mat, this.blurrer.renderTargetsHorizontal[0]);\n\n // Additive blend\n Graphics.blit(this.main_RT, undefined, this.add_mat);\n }\n\n __check_RT_size()\n {\n if (this.main_RT.width !== OScreen.width || this.main_RT.height !== OScreen.height)\n {\n this.main_RT.setSize(OScreen.width, OScreen.height);\n this.blur_RT.setSize(OScreen.width, OScreen.height);\n }\n }\n}\n\nexport { UnrealBloomRender };\n","import { Color } from 'three';\nimport { OrthographicCamera as TOrthographicCamera } from 'three';\n\nclass OrthographicCamera extends TOrthographicCamera\n{\n constructor(left, right, top, bottom, near, far)\n {\n super(left, right, top, bottom, near, far);\n\n this.clear_color = new Color('#000000');\n this.clear_alpha = 1;\n }\n\n copy(camera)\n {\n super.copy(camera);\n this.clear_color.copy(camera.clear_color);\n this.clear_alpha = camera.clear_alpha;\n return this;\n }\n}\n\nexport { OrthographicCamera };\n","import { ViewManager } from './ViewManager';\n\nclass ViewComponentManager\n{\n constructor()\n {\n this.components = [];\n this.enabled_components = new Set();\n }\n\n update()\n {\n this.__set_components_opacities();\n\n for (const component of this.enabled_components)\n {\n component.update(ViewManager.transition_handler.current_state_data);\n }\n }\n\n register_component(component)\n {\n this.components.push(component);\n }\n\n enable_component(component)\n {\n // const component_to_enable = this.get_component_by_name(component_name);\n\n this.enabled_components.add(component);\n }\n\n disable_component(component)\n {\n // const component_to_disable = this.get_component_by_name(component_name);\n\n this.enabled_components.delete(component);\n }\n\n get_component_by_name(component_name)\n {\n console.warn('DEPRECATED. Use ViewComponentManager.get instead');\n this.get(component_name);\n }\n\n get(component_name)\n {\n for (let i = 0; i < this.components.length; i++)\n {\n if (this.components[i].name === component_name)\n {\n return this.components[i];\n }\n }\n console.error('[ViewComponentManager.get] no component found for: ', component_name);\n return undefined;\n }\n\n __set_components_opacities()\n {\n for (let i = 0; i < this.components.length; i++)\n {\n this.components[i].set_opacity(ViewManager.transition_handler.current_state_data);\n }\n }\n}\n\nconst view_component_manager = new ViewComponentManager();\nexport { view_component_manager as ViewComponentManager };\n","import { Time } from './Time';\nimport { UI } from './UI';\nimport { Debug } from './Debug';\nimport { BaseApplication } from './BaseApplication';\nimport { ViewManager } from './view_components/ViewManager';\nimport { ViewComponentManager } from './view_components/ViewComponentManager';\n\nclass RenderLoop\n{\n constructor(target_application, graphics, input)\n {\n target_application = target_application || new BaseApplication();\n\n this.target_application = target_application;\n this.graphics = graphics;\n this.input = input;\n\n this.is_running = false;\n this.frames_passed = 0;\n\n this.time_accumulator = 0;\n }\n\n update()\n {\n if (!this.is_running)\n {\n return;\n }\n Time.__update();\n\n // ###### START CYCLE ######\n if (this.frames_passed === 1)\n {\n this.target_application.on_post_start();\n }\n\n this.input.update();\n\n this.time_accumulator += Time.delta_time;\n\n this.target_application.before_update();\n ViewManager.before_update();\n\n while (this.time_accumulator > Time.fixed_delta_time)\n {\n this.target_application.fixed_update();\n ViewManager.fixed_update();\n this.time_accumulator -= Time.fixed_delta_time;\n }\n Time.__set_frame_interpolation(this.time_accumulator / Time.fixed_delta_time);\n\n this.target_application.update();\n\n ViewManager.update();\n ViewComponentManager.update();\n\n this.target_application.on_pre_render();\n\n this.graphics.update(); // render scene\n UI.update(); // update after new camera matrix has been calculated\n UI.render(this.graphics); // render ui layer on top\n this.target_application.on_post_render();\n\n Debug.render(this.graphics); // render debug layer\n\n // ###### END CYCLE #######\n\n this.target_application.on_frame_end();\n this.frames_passed++;\n\n this.input.clear();\n UI.clear();\n Debug.clear();\n }\n\n start()\n {\n if (this.is_running) return; // sanity check\n\n if (this.frames_passed === 0)\n {\n this.target_application.on_enter();\n }\n\n this.is_running = true;\n\n this.graphics._renderer.setAnimationLoop(this.update.bind(this));\n }\n\n stop()\n {\n if (this.is_running === false) return; // sanity check\n\n this.is_running = false;\n this.target_application.on_exit();\n\n this.graphics._renderer.setAnimationLoop(null);\n }\n\n set_state(new_state)\n {\n this.target_application.on_exit(this);\n this.target_application = new_state;\n this.target_application.on_enter(this);\n }\n\n dispose()\n {\n this.stop();\n this.frames_passed = 0;\n }\n}\n\nexport { RenderLoop };\n","import { OScreen } from './OScreen';\n\nclass Screen\n{\n init()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.init();\n }\n\n update_position(x, y)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.update_position(x, y);\n }\n\n update()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.update();\n }\n\n update_size(width, height)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.update_size(width, height);\n }\n\n apply_pixel_density_v2(vector2)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.apply_pixel_density_v2(vector2);\n }\n\n apply_pixel_density(value)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.apply_pixel_density(value);\n }\n\n get_pixel_size()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.get_pixel_size();\n }\n\n get aspect_ratio()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.aspect_ratio;\n }\n}\n\nconst screen = new Screen();\nexport { screen as Screen };\n","\nimport { CanvasDrawer } from './CanvasDrawer';\n\nimport { Vector2 } from 'three';\n\nclass SimpleTextDrawer extends CanvasDrawer\n{\n constructor()\n {\n super();\n this.text_margin = new Vector2(2, 0);\n }\n\n __draw(text, ctxOptions, canvas, ctx)\n {\n ctx.font = ctxOptions.font;\n\n const text_size = this.get_text_size(text, ctxOptions.font);\n // canvas.width = Math.ceilPowerOfTwo(text_size.x+this.text_margin.x*2);\n // canvas.height = Math.ceilPowerOfTwo(text_size.y+ this.text_margin.y*2);\n canvas.width = Math.ceil(text_size.x + this.text_margin.x * 2);\n canvas.height = Math.ceil(text_size.y + this.text_margin.y * 2);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // turn this on for debugging\n ctx.globalAlpha = 0.0;\n ctx.fillStyle = ctxOptions.font_color || '#000000';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.globalAlpha = 1;\n\n ctx.globalAlpha = 1;\n\n ctx.font = ctxOptions.font;\n ctx.fillStyle = ctxOptions.font_color || '#000000';\n ctx.textBaseline = 'middle';\n\n ctx.textAlign = ctxOptions.textAlign || 'center';\n if (ctx.textAlign === 'center')\n {\n ctx.fillText(text, canvas.width / 2, canvas.height / 2);\n }\n else\n {\n ctx.fillText(text, 0, canvas.height / 2);\n }\n }\n}\n\nexport { SimpleTextDrawer };\n","import { HTMLUtilities } from '../utilities/HTMLUtilities';\nimport { ViewComponentManager } from './ViewComponentManager';\n\nclass ViewComponent\n{\n constructor({ name, container })\n {\n this.name = name;\n this.container = container;\n this.hidden = true;\n\n ViewComponentManager.register_component(this);\n }\n\n start()\n {\n }\n\n on_enter()\n {\n this.container.classList.remove('hidden');\n ViewComponentManager.enable_component(this);\n\n this.hidden = false;\n }\n\n update()\n {\n }\n\n on_exit()\n {\n this.container.classList.add('hidden');\n ViewComponentManager.disable_component(this);\n\n this.hidden = true;\n }\n\n set_opacity(current_state_data)\n {\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\n this.toggle_hidden();\n }\n\n toggle_hidden()\n {\n if (this.container.style.opacity > 0.001)\n {\n if (this.hidden)\n {\n this.on_enter();\n }\n }\n else\n {\n if (!this.hidden)\n {\n this.on_exit();\n }\n }\n }\n\n load_html_images()\n {\n HTMLUtilities.load_images(this.container);\n }\n\n load_html_videos()\n {\n HTMLUtilities.load_videos(this.container);\n }\n}\n\nexport { ViewComponent };\n","import { Mesh } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { PlaneGeometry } from 'three';\n\nclass HorizontalPlane extends Mesh\n{\n constructor(width, height, color, material)\n {\n width = width || 1;\n height = height || 1;\n color = color || '#FF0000';\n material = material || new MeshBasicMaterial({ color: color });\n\n const geometry = new PlaneGeometry(width, height);\n geometry.rotateX(-3.14 / 2);\n super(geometry, material);\n }\n}\n\nexport { HorizontalPlane };\n","import { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nclass VerticalPlane extends Mesh\n{\n constructor(width, height, color, material)\n {\n width = width || 1;\n height = height || 1;\n color = color || '#FF0000';\n material = material || new MeshBasicMaterial({ color: color });\n\n const geometry = new PlaneGeometry(width, height);\n super(geometry, material);\n }\n}\n\nexport { VerticalPlane };\n","class ArrayUtilities\n{\n constructor()\n {}\n\n static merge_from_to(source, target)\n {\n target.push.apply(target, source);\n }\n\n static expand_vec3_array(array, size)\n {\n const items_left_count = size - array.length;\n\n for (let i = 0; i < items_left_count; i++)\n {\n array.push(array[i].clone());\n }\n }\n\n static remove_elem(array, elem)\n {\n const index = array.indexOf(elem);\n if (index > -1)\n {\n array.splice(index, 1);\n }\n }\n\n static get_closest_point(points, target)\n {\n let closest_point = points[0];\n let closest_distance = closest_point.distanceTo(target);\n for (let i = 1; i < points.length; i++)\n {\n if (points[i].distanceTo(target) < closest_distance)\n {\n closest_point = points[i];\n closest_distance = points[i].distanceTo(target);\n }\n }\n return closest_point;\n }\n\n static object_values_to_array(obj)\n {\n const ids = Object.keys(obj);\n const arr = [];\n for (let i = 0; i < ids.length; i++)\n {\n arr.push(obj[ids[i]]);\n }\n return arr;\n }\n}\n\nexport { ArrayUtilities };\n","import { Line3, Plane, Quaternion, Sphere, Vector3 } from 'three';\n\nclass FrustumPointFitter\n{\n constructor()\n {\n this.sphere = new Sphere();\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n this.sphere.setFromPoints(points);\n\n const v_fov = Math.degToRad(vertical_fov / 2);\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\n\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\n\n const sphere_center = this.sphere.center.clone();\n\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\n\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\n\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n let closest_distance = Infinity;\n\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\n for (let i = 0; i < points.length; i++)\n {\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\n\n const up_line_intersection = new Vector3();\n const down_line_intersection = new Vector3();\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n up_plane.intersectLine(line, up_line_intersection);\n down_plane.intersectLine(line, down_line_intersection);\n\n left_plane.intersectLine(line, left_line_intersection);\n right_plane.intersectLine(line, right_line_intersection);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('down intersection not found', i);\n }\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\n\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\n\n const vertical_min = Math.min(new_up_distance, new_down_distance);\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\n\n const min = Math.min(vertical_min, horizontal_min);\n\n if (min < closest_distance)\n {\n closest_distance = min;\n }\n }\n\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\n const closest_position = far_pos.clone().add(forward_correction);\n\n return closest_position;\n }\n\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\n {\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\n const horizontal_offset = this.get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion);\n\n target_pos.add(vertical_offset);\n target_pos.add(horizontal_offset);\n }\n\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\n {\n let closest_distance_to_up_plane = Infinity;\n let closest_distance_to_down_plane = Infinity;\n let closest_up_point = undefined;\n let closest_down_point = undefined;\n\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\n for (let i = 0; i < points.length; i++)\n {\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\n\n const down_line_intersection = new Vector3();\n const up_line_intersection = new Vector3();\n\n down_plane.intersectLine(down_line, down_line_intersection);\n up_plane.intersectLine(up_line, up_line_intersection);\n\n const down_dist = down_line_intersection.distanceTo(points[i]);\n const up_dist = up_line_intersection.distanceTo(points[i]);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('vertical up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('vertical down intersection not found', i);\n }\n\n if (down_dist < closest_distance_to_down_plane)\n {\n closest_distance_to_down_plane = down_dist;\n closest_down_point = points[i];\n }\n if (up_dist < closest_distance_to_up_plane)\n {\n closest_distance_to_up_plane = up_dist;\n closest_up_point = points[i];\n }\n }\n\n console.log(closest_up_point, closest_down_point);\n\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\n\n // console.log(\"vertical_correction\", correction)\n return up_dir.clone().multiplyScalar(-correction);\n }\n\n get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion)\n {\n let closest_distance_to_right_plane = Infinity;\n let closest_distance_to_left_plane = Infinity;\n let closest_right_point = undefined;\n let closest_left_point = undefined;\n\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\n\n for (let i = 0; i < points.length; i++)\n {\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n left_plane.intersectLine(left_line, left_line_intersection);\n right_plane.intersectLine(right_line, right_line_intersection);\n\n const left_dist = left_line_intersection.distanceTo(points[i]);\n const right_dist = right_line_intersection.distanceTo(points[i]);\n\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n if (left_dist < closest_distance_to_left_plane)\n {\n closest_distance_to_left_plane = left_dist;\n closest_left_point = points[i];\n }\n if (right_dist < closest_distance_to_right_plane)\n {\n closest_distance_to_right_plane = right_dist;\n closest_right_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\n // console.log(\"horizontal_correction\", correction)\n\n console.log(closest_right_point, closest_left_point);\n\n return right_dir.clone().multiplyScalar(-correction);\n }\n\n get_up_plane_normal(camera_quaternion, v_fov)\n {\n const up_plane_normal = new Vector3(0, -1, 0);\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\n up_plane_normal.applyQuaternion(camera_quaternion);\n return up_plane_normal;\n }\n\n get_down_plane_normal(camera_quaternion, v_fov)\n {\n const down_plane_normal = new Vector3(0, 1, 0);\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\n down_plane_normal.applyQuaternion(camera_quaternion);\n return down_plane_normal;\n }\n\n get_left_plane_normal(camera_quaternion, h_fov)\n {\n const left_plane_normal = new Vector3(1, 0, 0);\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\n left_plane_normal.applyQuaternion(camera_quaternion);\n return left_plane_normal;\n }\n\n get_right_plane_normal(camera_quaternion, h_fov)\n {\n const right_plane_normal = new Vector3(-1, 0, 0);\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\n right_plane_normal.applyQuaternion(camera_quaternion);\n return right_plane_normal;\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n\nexport { FrustumPointFitter };\n","import { BufferAttribute } from 'three';\nimport { BufferGeometry } from 'three';\n\nclass GeometryUtilities\n{\n static convert_to_non_indexed_geometry(geometry_buffer)\n {\n const indices = geometry_buffer.index;\n const positions = geometry_buffer.getAttribute('position');\n\n const bar_coordinates = [];\n const vertices = [];\n\n for (let i = 0; i < indices.count; i += 3)\n {\n // VERTEX 1\n vertices.push(positions.getX(indices.array[i + 0]));\n vertices.push(positions.getY(indices.array[i + 0]));\n vertices.push(positions.getZ(indices.array[i + 0]));\n\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n\n // VERTEX 2\n\n vertices.push(positions.getX(indices.array[i + 1]));\n vertices.push(positions.getY(indices.array[i + 1]));\n vertices.push(positions.getZ(indices.array[i + 1]));\n\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n\n // VERTEX 3\n\n vertices.push(positions.getX(indices.array[i + 2]));\n vertices.push(positions.getY(indices.array[i + 2]));\n vertices.push(positions.getZ(indices.array[i + 2]));\n\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n }\n\n const geometry = new BufferGeometry();\n // geometry.setAttribute('barycentric', new BufferAttribute( new Float32Array(bar_coordinates), 3 ));\n geometry.setAttribute('position', new BufferAttribute(new Float32Array(vertices), 3));\n GeometryUtilities.add_barycentric_attribute(geometry);\n return geometry;\n }\n\n static add_barycentric_attribute(non_indexed_geometry_buffer)\n {\n const bar_coordinates = [];\n const positions = non_indexed_geometry_buffer.getAttribute('position');\n\n for (let i = 0; i < positions.count; i += 3)\n {\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n }\n non_indexed_geometry_buffer.setAttribute('barycentric', new BufferAttribute(new Float32Array(bar_coordinates), 3));\n }\n}\n\nexport { GeometryUtilities };\n","import { Vector4 } from 'three';\n\nclass ImageUtilities\n{\n constructor()\n { }\n\n static get_image_data(image)\n {\n const canvas = document.createElement('canvas');\n canvas.width = image.width;\n canvas.height = image.height;\n\n const context = canvas.getContext('2d');\n context.drawImage(image, 0, 0);\n\n return context.getImageData(0, 0, image.width, image.height);\n }\n\n static get_pixel(imagedata, x, y)\n {\n const position = (x + imagedata.width * y) * 4;\n const data = imagedata.data;\n return new Vector4(data[position + 0], data[position + 1], data[position + 2], data[position + 3]);\n }\n}\n\nexport { ImageUtilities };\n","import { Vector3 } from 'three';\nimport { Vector2 } from 'three';\nclass MeshSampler\n{\n constructor()\n {\n\n }\n\n sample(buffer_geometry, sample_count)\n {\n const face_areas = [];\n\n let min_area = 99999999;\n\n const vertices = buffer_geometry.getAttribute('position');\n const normals = buffer_geometry.getAttribute('normal');\n const tangents = buffer_geometry.getAttribute('tangent');\n const uvs = buffer_geometry.getAttribute('uv');\n const indices = buffer_geometry.index;\n\n const faces = [];\n\n for (let i = 0; i < indices.count; i += 3)\n {\n const index_0 = indices.array[i + 0];\n const index_1 = indices.array[i + 1];\n const index_2 = indices.array[i + 2];\n\n const v1 = new Vector3();\n v1.x = vertices.getX(index_0);\n v1.y = vertices.getY(index_0);\n v1.z = vertices.getZ(index_0);\n\n const v2 = new Vector3();\n v2.x = vertices.getX(index_1);\n v2.y = vertices.getY(index_1);\n v2.z = vertices.getZ(index_1);\n\n const v3 = new Vector3();\n v3.x = vertices.getX(index_2);\n v3.y = vertices.getY(index_2);\n v3.z = vertices.getZ(index_2);\n\n const face = {\n a: v1,\n b: v2,\n c: v3\n };\n\n if (normals)\n {\n const n1 = new Vector3();\n n1.x = normals.getX(index_0);\n n1.y = normals.getY(index_0);\n n1.z = normals.getZ(index_0);\n\n const n2 = new Vector3();\n n2.x = normals.getX(index_1);\n n2.y = normals.getY(index_1);\n n2.z = normals.getZ(index_1);\n\n const n3 = new Vector3();\n n3.x = normals.getX(index_2);\n n3.y = normals.getY(index_2);\n n3.z = normals.getZ(index_2);\n\n const normal = n1.clone().add(n2).add(n3).normalize();\n face.normal = normal;\n }\n\n if (tangents)\n {\n const n1 = new Vector3();\n n1.x = tangents.getX(index_0);\n n1.y = tangents.getY(index_0);\n n1.z = tangents.getZ(index_0);\n\n const n2 = new Vector3();\n n2.x = tangents.getX(index_1);\n n2.y = tangents.getY(index_1);\n n2.z = tangents.getZ(index_1);\n\n const n3 = new Vector3();\n n3.x = tangents.getX(index_2);\n n3.y = tangents.getY(index_2);\n n3.z = tangents.getZ(index_2);\n\n const tangent = n1.clone().add(n2).add(n3).normalize();\n face.tangent = tangent;\n }\n if (uvs)\n {\n const uv_a = new Vector2();\n uv_a.x = uvs.getX(index_0);\n uv_a.y = uvs.getY(index_0);\n\n const uv_b = new Vector2();\n uv_b.x = uvs.getX(index_1);\n uv_b.y = uvs.getY(index_1);\n\n const uv_c = new Vector2();\n uv_c.x = uvs.getX(index_2);\n uv_c.y = uvs.getY(index_2);\n\n face.uv_a = uv_a;\n face.uv_b = uv_b;\n face.uv_c = uv_c;\n }\n\n faces.push(face);\n\n const area = this.get_face_area(face);\n min_area = Math.min(area, min_area);\n face_areas.push(area);\n }\n\n const normalized_faces_array = this.get_uniform_face_distribution(face_areas, min_area, faces);\n const selected_faces = this.select_random_faces(normalized_faces_array, sample_count);\n const sampled_data = this.sample_data_from_faces(selected_faces);\n return sampled_data;\n }\n\n sample_data_from_faces(faces)\n {\n const sampled_points = [];\n const sampled_normals = [];\n const sampled_tangents = [];\n const sampled_uvs = [];\n\n for (let i = 0; i < faces.length; i++)\n {\n const face = faces[i];\n\n const w1 = Math.random();\n const w2 = Math.random();\n\n sampled_points.push(this.sample_point_in_face(w1, w2, face.a, face.b, face.c).clone());\n if (face.normal)\n {\n sampled_normals.push(face.normal.clone());\n }\n if (face.tangent)\n {\n sampled_tangents.push(face.tangent.clone());\n }\n if (face.uv_a)\n {\n sampled_uvs.push(this.sample_point_in_face(w1, w2, face.uv_a, face.uv_b, face.uv_c).clone());\n }\n }\n return { points: sampled_points, normals: sampled_normals, tangents: sampled_tangents, uvs: sampled_uvs };\n }\n\n select_random_faces(faces, amount)\n {\n const selected_faces = [];\n for (let i = 0; i < amount; i++)\n {\n const random = Math.floor(Math.random() * faces.length);\n const selected_face = faces[random];\n\n selected_faces.push(selected_face);\n }\n\n return selected_faces;\n }\n\n get_uniform_face_distribution(face_areas, minimum_area, faces)\n {\n const extended_triangle_indices = [];\n for (let i = 0; i < face_areas.length; i++)\n {\n face_areas[i] /= minimum_area;\n const repetitions_needed = Math.floor(Math.round(face_areas[i]));\n for (let j = 0; j < repetitions_needed; j++)\n {\n extended_triangle_indices.push(faces[i]);\n }\n }\n return extended_triangle_indices;\n }\n\n get_face_area(face)\n {\n const vec1 = face.b.clone().sub(face.a);\n const vec2 = face.c.clone().sub(face.a);\n return vec1.cross(vec2).length() / 2;\n }\n\n sample_point_in_face(w1, w2, v1, v2, v3)\n {\n if (w1 + w2 > 1)\n {\n w1 = 1.0 - w1;\n w2 = 1.0 - w2;\n }\n\n const w3 = 1.0 - (w1 + w2);\n\n return v1.clone().multiplyScalar(w1).add(v2.clone().multiplyScalar(w2)).add(v3.clone().multiplyScalar(w3));\n }\n}\n\nconst mesh_sampler = new MeshSampler();\nexport { mesh_sampler as MeshSampler };\n","import { Mesh } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Skeleton } from 'three';\n\nclass ModelUtilities\n{\n get_mesh(scene, result_callback)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n if (child.geometry)\n {\n child.geometry = new BufferGeometry().fromGeometry(child.geometry);\n }\n result_callback(child);\n }\n });\n }\n\n get_geometries(scene)\n {\n const geometries = [];\n\n this.get_mesh(scene, (child) =>\n {\n geometries.push(child.geometry);\n });\n return geometries;\n }\n\n assign_material(scene, material, name)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n // assign to all if no name is given\n if (name === undefined)\n {\n child.material = material;\n }\n else\n {\n // if name is given, assign only to that\n if (child.name === name)\n {\n child.material = material;\n }\n }\n }\n });\n }\n\n clone_animated_gltf(gltf)\n {\n const clone = {\n animations: gltf.animations,\n scene: gltf.scene.clone(true)\n };\n\n const skinnedMeshes = {};\n\n gltf.scene.traverse(node =>\n {\n if (node.isSkinnedMesh)\n {\n skinnedMeshes[node.name] = node;\n }\n });\n\n const cloneBones = {};\n const cloneSkinnedMeshes = {};\n\n clone.scene.traverse(node =>\n {\n if (node.isBone)\n {\n cloneBones[node.name] = node;\n }\n\n if (node.isSkinnedMesh)\n {\n cloneSkinnedMeshes[node.name] = node;\n }\n });\n\n for (const name in skinnedMeshes)\n {\n const skinnedMesh = skinnedMeshes[name];\n const skeleton = skinnedMesh.skeleton;\n const cloneSkinnedMesh = cloneSkinnedMeshes[name];\n\n const orderedCloneBones = [];\n\n for (let i = 0; i < skeleton.bones.length; ++i)\n {\n const cloneBone = cloneBones[skeleton.bones[i].name];\n orderedCloneBones.push(cloneBone);\n }\n\n cloneSkinnedMesh.bind(\n new Skeleton(orderedCloneBones, skeleton.boneInverses),\n cloneSkinnedMesh.matrixWorld);\n }\n\n return clone;\n }\n\n set_shadow_config(scene, cast, receive)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n child.castShadow = cast;\n child.receiveShadow = receive;\n }\n });\n }\n\n __find_object(scene, object_name, result_callback)\n {\n scene.traverse((obj) =>\n {\n if (obj.name === object_name)\n {\n result_callback(obj);\n }\n });\n }\n\n get_object(scene, object_name)\n {\n let object = undefined;\n scene.traverse((obj) =>\n {\n if (obj.name === object_name)\n {\n object = obj;\n }\n });\n return object;\n }\n\n get_object_by_type(scene, object_type)\n {\n let object = undefined;\n scene.traverse((obj) =>\n {\n if (obj.constructor.name === object_type)\n {\n object = obj;\n }\n });\n return object;\n }\n}\n\nconst model_utilities = new ModelUtilities();\nexport { model_utilities as ModelUtilities };\n","class ObjectUtilities\r\n{\r\n static is_object(item)\r\n {\r\n return (item && typeof item === 'object' && !Array.isArray(item));\r\n }\r\n\r\n static merge_deep(target, ...sources)\r\n {\r\n if (!sources.length) return target;\r\n const source = sources.shift();\r\n\r\n if (ObjectUtilities.is_object(target) && ObjectUtilities.is_object(source))\r\n {\r\n for (const key in source)\r\n {\r\n if (ObjectUtilities.is_object(source[key]))\r\n {\r\n if (!target[key]) Object.assign(target, { [key]: {} });\r\n ObjectUtilities.merge_deep(target[key], source[key]);\r\n }\r\n else\r\n {\r\n Object.assign(target, { [key]: source[key] });\r\n }\r\n }\r\n }\r\n\r\n return ObjectUtilities.merge_deep(target, ...sources);\r\n }\r\n\r\n static xml_to_json(xml)\r\n {\r\n // Create the return object\r\n let obj = {};\r\n\r\n if (xml.nodeType === 1)\r\n { // element\r\n // do attributes\r\n if (xml.attributes.length > 0)\r\n {\r\n obj['@attributes'] = {};\r\n for (let j = 0; j < xml.attributes.length; j++)\r\n {\r\n const attribute = xml.attributes.item(j);\r\n obj['@attributes'][attribute.nodeName] = attribute.nodeValue;\r\n }\r\n }\r\n }\r\n else if (xml.nodeType === 3)\r\n { // text\r\n obj = xml.nodeValue;\r\n }\r\n\r\n // do children\r\n if (xml.hasChildNodes())\r\n {\r\n for (let i = 0; i < xml.childNodes.length; i++)\r\n {\r\n const item = xml.childNodes.item(i);\r\n const nodeName = item.nodeName;\r\n if (typeof (obj[nodeName]) === 'undefined')\r\n {\r\n obj[nodeName] = this.xml_to_json(item);\r\n }\r\n else\r\n {\r\n if (typeof (obj[nodeName].push) === 'undefined')\r\n {\r\n const old = obj[nodeName];\r\n obj[nodeName] = [];\r\n obj[nodeName].push(old);\r\n }\r\n obj[nodeName].push(this.xml_to_json(item));\r\n }\r\n }\r\n }\r\n return obj;\r\n }\r\n}\r\n\r\nexport { ObjectUtilities };\r\n","class StringUtilities\n{\n constructor()\n {}\n\n static get_random_color()\n {\n const hexValues = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F'];\n let hex = '#';\n\n for (let i = 0; i < 6; i++)\n {\n const index = Math.floor(Math.random() * hexValues.length);\n hex += hexValues[index];\n }\n\n return hex;\n }\n\n static capitalize(string)\n {\n const words = string.split(' ');\n\n for (let i = 0; i < words.length; i++)\n {\n words[i] = words[i][0].toUpperCase() + words[i].substr(1);\n }\n\n return words.join(' ');\n }\n\n static capitalize_first_letter(string)\n {\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n static snake_to_camelcase(string)\n {\n return string.toLowerCase().replace(/[-_][a-z0-9]/g, (group) => group.slice(-1).toUpperCase());\n }\n}\n\nexport { StringUtilities };\n","class TimeUtilities\n{\n constructor()\n {}\n\n // Converts a time string (00:00:00.45) into miliseconds\n time_str_to_ms(time_str)\n {\n time_str = time_str.split(':');\n\n let hours = Number(time_str[0]);\n hours = hours * 60 * 60 * 1000;\n\n let minutes = Number(time_str[1]);\n minutes = minutes * 60 * 1000;\n\n let seconds = Number(time_str[2]);\n seconds = seconds * 1000;\n\n return hours + minutes + seconds;\n }\n}\n\nexport { TimeUtilities };\n","import grid_frag from '../shaders/grid/grid.frag';\nimport grid_vert from '../shaders/grid/grid.vert';\n\nimport { GeometryUtilities } from '../utilities/GeometryUtilities';\n\nimport { Mesh } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\nimport { PlaneGeometry } from 'three';\n\nclass Grid extends Mesh\n{\n constructor()\n {\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Color('#919191') }\n },\n vertexShader: grid_vert,\n fragmentShader: grid_frag,\n extensions: { derivatives: true },\n transparent: true,\n depthWrite: false\n });\n\n const plane_geometry = new PlaneGeometry(100, 100, 100, 100);\n\n const non_indexed_geometry = GeometryUtilities.convert_to_non_indexed_geometry(plane_geometry);\n\n super(non_indexed_geometry, material);\n\n this.rotation.x = -3.14 / 2;\n }\n}\n\nexport { Grid };\n","import line_vs from '../shaders/basic_line/basic_line.vert';\nimport line_fs from '../shaders/basic_line/basic_line.frag';\n\nimport { Mesh } from 'three';\nimport { BufferAttribute } from 'three';\nimport { BufferGeometry } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\n\nclass Line extends Mesh\n{\n constructor(points)\n {\n const geometry = new BufferGeometry();\n geometry.setAttribute('position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('next_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('previous_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('orientation', new BufferAttribute(new Float32Array([]), 1));\n geometry.setAttribute('coverage', new BufferAttribute(new Float32Array([]), 1));\n\n const material = new ShaderMaterial({\n uniforms: {\n _Thickness: { value: 0.2 },\n _Length: { value: 0 },\n _ElapsedTime: { value: 0 },\n _Color: { value: new Color('#FF0000') }\n },\n vertexShader: line_vs,\n fragmentShader: line_fs,\n transparent: true,\n depthWrite: false,\n extensions: { derivatives: true }\n\n });\n\n super(geometry, material);\n\n if (points)\n {\n this.setup(points);\n }\n }\n\n setup(points)\n {\n const vertices = [];\n const next_position = [];\n const previous_position = [];\n const orientation = [];\n const coverage = [];\n let accumulated_length = 0;\n\n for (let i = 0; i < points.length; i++)\n {\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(1);\n\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(-1);\n\n const next_point = this.__get_next_position(points, i);\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n const previous_point = this.__get_previous_position(points, i);\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n coverage.push(accumulated_length);\n coverage.push(accumulated_length);\n\n if (i < points.length - 1)\n {\n accumulated_length += points[i].distanceTo(next_point);\n }\n }\n const vertexList = new Float32Array(vertices);\n const nextPositionList = new Float32Array(next_position);\n const previousPositionList = new Float32Array(previous_position);\n const orientationList = new Float32Array(orientation);\n const coverageList = new Float32Array(coverage);\n\n const indices = [];\n for (let i = 0; i < ((vertexList.length / 3) - 2) / 2; i++)\n {\n const index = (i * 2) + 1;\n indices.push(index);\n indices.push(index + 1);\n indices.push(index - 1);\n\n indices.push(index);\n indices.push(index + 2);\n indices.push(index + 1);\n }\n\n this.geometry.setIndex(indices);\n this.geometry.getAttribute('position').copy(new BufferAttribute(vertexList, 3));\n this.geometry.getAttribute('next_position').copy(new BufferAttribute(nextPositionList, 3));\n this.geometry.getAttribute('previous_position').copy(new BufferAttribute(previousPositionList, 3));\n this.geometry.getAttribute('orientation').copy(new BufferAttribute(orientationList, 1));\n this.geometry.getAttribute('coverage').copy(new BufferAttribute(coverageList, 1));\n\n this.geometry.getAttribute('position').needsUpdate = true;\n this.geometry.getAttribute('next_position').needsUpdate = true;\n this.geometry.getAttribute('previous_position').needsUpdate = true;\n this.geometry.getAttribute('orientation').needsUpdate = true;\n this.geometry.getAttribute('coverage').needsUpdate = true;\n\n this.material.uniforms._Length.value = accumulated_length;\n this._length = accumulated_length;\n }\n\n set thickness(value)\n {\n this.material.uniforms._Thickness.value = value;\n }\n\n get thickness()\n {\n return this.material.uniforms._Thickness.value;\n }\n\n __get_previous_position(points, i)\n {\n if (i === 0)\n {\n return points[1].clone().sub(points[0]).multiplyScalar(-1).add(points[0]);\n }\n else\n {\n return points[i - 1];\n }\n }\n\n __get_next_position(points, i)\n {\n if (i === points.length - 1)\n {\n return points[points.length - 2].clone().sub(points[points.length - 1]).multiplyScalar(-1).add(points[points.length - 1]);\n }\n else\n {\n return points[i + 1];\n }\n }\n\n update()\n {\n }\n\n distance()\n {\n return this.accumulated_length;\n }\n\n total_length()\n {\n return this.accumulated_length;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n if (this.parent)\n {\n this.parent.remove(this);\n }\n }\n\n set color(col)\n {\n this.material.uniforms._Color.value.set(col);\n }\n\n get color()\n {\n return this.material.uniforms._Color.value;\n }\n\n copy_color(col)\n {\n this.material.uniforms._Color.value.copy(col);\n }\n}\n\nexport { Line };\n","import basic_texture_vert from '../shaders/basic_texture/basic_texture.vert';\nimport basic_texture_frag from '../shaders/basic_texture/basic_texture.frag';\n\nimport { Mesh } from 'three';\nimport { Vector2 } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { DoubleSide } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Vector3 } from 'three';\n\nclass WorldImage extends Mesh\n{\n constructor(texture, pivot)\n {\n pivot = pivot || new Vector2(0, 0);\n const material = new ShaderMaterial({\n uniforms: {\n _MainTex: { value: texture },\n _ScreenAligned: { value: 0 },\n _Scale: { value: 1 },\n _Opacity: { value: 1 }\n },\n vertexShader: basic_texture_vert,\n fragmentShader: basic_texture_frag,\n transparent: true,\n depthWrite: false,\n side: DoubleSide\n });\n const geometry = new PlaneGeometry(1, 1, 1);\n geometry.translate(-pivot.x / 2, -pivot.y / 2, 0);\n const current_scale = texture.image.width / texture.image.height;\n geometry.scale(current_scale, 1, 1);\n super(geometry, material);\n this.current_scale = current_scale;\n this.geometry.computeBoundingBox();\n\n this.tmp_bb_size = new Vector3();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n update_texture()\n {\n this.material.uniforms._MainTex.value.needsUpdate = true;\n const img = this.material.uniforms._MainTex.value.image;\n\n this.geometry.scale(1 / this.current_scale, 1, 1);\n this.current_scale = img.width / img.height;\n this.geometry.scale(this.current_scale, 1, 1);\n this.geometry.computeBoundingBox();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n get size()\n {\n return this.tmp_bb_size.clone().multiplyScalar(this.scale.x);\n }\n\n set size(value)\n {\n this.scale.set(value, value, value);\n this.material.uniforms._Scale.value = value;\n }\n\n set screen_aligned(boolean)\n {\n this.material.uniforms._ScreenAligned.value = boolean === true ? 1 : 0;\n }\n\n get screen_aligned()\n {\n return this.material.uniforms._ScreenAligned.value === 1;\n }\n\n set opacity(opacity)\n {\n this.material.uniforms._Opacity.value = opacity;\n }\n\n get opacity()\n {\n return this.material.uniforms._Opacity.value;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.parent.remove(this);\n this.material.uniforms._MainTex.value.dispose();\n this.material.dispose();\n }\n}\n\nexport { WorldImage };\n","import { WorldImage } from './WorldImage';\nimport { SimpleTextDrawer } from '../canvas_drawer/SimpleTextDrawer';\n\nimport { LinearMipMapLinearFilter } from 'three';\nimport { LinearFilter } from 'three';\n\nclass Text2D extends WorldImage\n{\n constructor(text, font, color, pivot, is_static)\n {\n const simple_text_drawer = new SimpleTextDrawer(is_static);\n\n const draw_settings = {\n font: font,\n font_color: color || '#000000'\n };\n const canvas_texture = simple_text_drawer.draw_on_texture(text, draw_settings);\n\n canvas_texture.minFilter = LinearMipMapLinearFilter;\n canvas_texture.minFilter = LinearFilter;\n canvas_texture.needsUpdate = true;\n super(canvas_texture, pivot);\n\n this.simple_text_drawer = simple_text_drawer;\n this.canvas_texture = canvas_texture;\n this.draw_settings = draw_settings;\n }\n\n set text(value)\n {\n this.simple_text_drawer.draw_canvas(value, this.draw_settings);\n this.update_texture();\n }\n\n get text()\n {\n return 'not implemented';\n }\n}\n\nexport { Text2D };\n","import vert from '../shaders/ui_element/ui_element.vert';\nimport frag from '../shaders/ui_element/ui_element.frag';\n\nimport { BaseShaderMaterial } from '../materials/BaseShaderMaterial';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nimport { OScreen } from '../OScreen';\n\nclass UIElementMaterial extends BaseShaderMaterial\n{\n constructor(intensity = 1)\n {\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSize: { value: new Vector2(OScreen.width, OScreen.height) },\n _TextureSize: { value: new Vector2() },\n _PixelOffset: { value: new Vector2(0, 0) },\n _NDC: { value: new Vector3() },\n _PivotPoint: { value: new Vector2() },\n _DepthOffset: { value: 0 }\n });\n this.transparent = true;\n this.depthWrite = false;\n this.depthTest = false;\n }\n}\n\nexport { UIElementMaterial };\n","import { Vector2 } from 'three';\n\nclass ScreenSpacePosition\n{\n constructor()\n {\n this.tmp_vec = new Vector2();\n }\n\n get_pos_NDC(position)\n {\n return this.tmp_vec.set(position.x, position.y);\n }\n}\n\nexport { ScreenSpacePosition };\n","import { CameraManager } from '../../CameraManager';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nclass WorldSpacePosition\n{\n constructor()\n {\n this.tmp_vec3 = new Vector3();\n this.tmp_vec2 = new Vector2();\n }\n\n get_pos_NDC(position)\n {\n this.tmp_vec3.copy(position);\n this.tmp_vec3.project(CameraManager.current);\n\n return this.tmp_vec2.set(this.tmp_vec3.x, this.tmp_vec3.y);\n }\n}\n\nexport { WorldSpacePosition };\n","class UIElementState\n{\n constructor()\n {\n\n }\n\n update(ui_element, normalized_mouse_position)\n {\n\n }\n\n on_enter(ui_element)\n {}\n\n on_exit(ui_element)\n {}\n}\n\nexport { UIElementState };\n","import { UIElementState } from './UIElementState';\n\nclass OnIdle extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n ui_element.set_state(ui_element._on_enter_state);\n }\n }\n}\n\nexport { OnIdle };\n","import { UIElementState } from './UIElementState';\n\nclass OnMouseEnter extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n ui_element.on_mouse_enter();\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n ui_element.set_state(ui_element._on_hover_state);\n }\n else\n {\n ui_element.set_state(ui_element._on_exit_state);\n }\n }\n}\n\nexport { OnMouseEnter };\n","import { UIElementState } from './UIElementState';\n\nclass OnMouseExit extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n ui_element.on_mouse_exit();\n ui_element.set_state(ui_element._on_idle_state);\n }\n}\n\nexport { OnMouseExit };\n","import { UIElementState } from './UIElementState';\n\nclass OnMouseHover extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n this.__trigger_on_hover(ui_element);\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n this.__trigger_on_hover(ui_element);\n }\n else\n {\n ui_element.set_state(ui_element._on_exit_state);\n }\n }\n\n __trigger_on_hover(ui_element)\n {\n ui_element.on_mouse_hover();\n }\n}\n\nexport { OnMouseHover };\n","\nimport { OScreen } from '../OScreen';\n\nimport { UIElementMaterial } from '../materials/UIElementMaterial';\n\nimport { ScreenSpacePosition } from '../ui/ui_element_position/ScreenSpacePosition';\nimport { WorldSpacePosition } from '../ui/ui_element_position/WorldSpacePosition';\n\nimport { OnIdle } from '../ui/ui_element_state/OnIdle';\nimport { OnMouseEnter } from '../ui/ui_element_state/OnMouseEnter';\nimport { OnMouseExit } from '../ui/ui_element_state/OnMouseExit';\nimport { OnMouseHover } from '../ui/ui_element_state/OnMouseHover';\n\nimport { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\nimport { NearestFilter } from 'three';\nimport { Box2 } from 'three';\n\nclass UIElement extends Mesh\n{\n constructor(vert, frag)\n {\n super(new PlaneGeometry(1, 1), new UIElementMaterial());\n\n this.is_clickable = false;\n\n this.position_strategy = new WorldSpacePosition();\n this.current_state = new OnIdle();\n\n this._position = new Vector3();\n\n this._on_idle_state = new OnIdle();\n this._on_enter_state = new OnMouseEnter();\n this._on_exit_state = new OnMouseExit();\n this._on_hover_state = new OnMouseHover();\n\n this.on_enter = undefined;\n this.on_exit = undefined;\n this.on_hover = undefined;\n\n this.mouse_pos_tmp = new Vector2();\n this.cached_NDC_position = new Vector2();\n this.screen_pos_tmp = new Vector2();\n\n this.texture_size = new Vector2(1, 1);\n\n this.frustumCulled = false;\n this.matrixAutoUpdate = false;\n this.renderOrder = 0;\n\n this.size = 1;\n this.pixel_offset = new Vector2();\n }\n\n set_render_order(value)\n {\n this.renderOrder = value;\n }\n\n get pivot_point()\n {\n return this.material.uniforms._PivotPoint.value;\n }\n\n set_pixel_offset(offset)\n {\n this.pixel_offset.copy(offset);\n this.material.uniforms._PixelOffset.value.copy(offset);\n }\n\n set_state(new_state)\n {\n this.current_state.on_exit(this);\n this.current_state = new_state;\n this.current_state.on_enter(this);\n }\n\n get position()\n {\n return this._position;\n }\n\n set use_depth(boolean)\n {\n this.material.depthTest = boolean;\n }\n\n get use_depth()\n {\n return this.material.depthTest;\n }\n\n set depth_offset(value)\n {\n this.material.uniforms._DepthOffset.value = value;\n }\n\n get depth_offset()\n {\n return this.material.uniforms._DepthOffset.value;\n }\n\n clear_state()\n {\n this.visible = false;\n }\n\n set_world_space_coordinate_system()\n {\n this.position_strategy = new WorldSpacePosition();\n }\n\n set_screen_space_coordinate_system()\n {\n this.position_strategy = new ScreenSpacePosition();\n }\n\n set_texture(texture)\n {\n texture.minFilter = NearestFilter;\n texture.magFilter = NearestFilter;\n texture.needsUpdate = true;\n\n this.texture_size.set(texture.image.width, texture.image.height);\n\n this.material.uniforms._MainTex.value = texture;\n this.get_size(this.material.uniforms._TextureSize.value);\n this.visible = true;\n }\n\n update_state(normalized_mouse_pos)\n {\n this.material.uniforms._ScreenSize.value.set(OScreen.width, OScreen.height);\n this.get_size(this.material.uniforms._TextureSize.value);\n\n this.cached_NDC_position.copy(this.position_strategy.get_pos_NDC(this.position));\n this.material.uniforms._NDC.value.copy(this.position);\n this.current_state.update(this, normalized_mouse_pos);\n }\n\n is_mouse_over(normalized_mouse_pos)\n {\n this.screen_pos_tmp.copy(this.cached_NDC_position);\n this.to_screen_position(this.screen_pos_tmp);\n this.screen_pos_tmp.x += this.pixel_offset.x;\n this.screen_pos_tmp.y += this.pixel_offset.y;\n\n const rect = new Box2().setFromCenterAndSize(this.screen_pos_tmp, this.get_size());\n\n this.mouse_pos_tmp.copy(normalized_mouse_pos);\n this.to_screen_position(this.mouse_pos_tmp);\n\n return rect.containsPoint(this.mouse_pos_tmp);\n }\n\n to_screen_position(projected_pos)\n {\n projected_pos.x = (projected_pos.x * 0.5 + 0.5) * OScreen.width + this.pixel_offset.x;\n projected_pos.y = (projected_pos.y * 0.5 + 0.5) * OScreen.height + this.pixel_offset.y;\n }\n\n get_screen_space_position()\n {\n const pos = this.cached_NDC_position.clone();\n this.to_screen_position(pos);\n return pos;\n }\n\n set_screen_space_position(screen_pos)\n {\n this.position.x = (screen_pos.x / OScreen.width) * 2 - 1;\n this.position.y = (screen_pos.y / OScreen.height) * 2 - 1;\n }\n\n dispose()\n {\n if (this.material.uniforms._MainTex.value)\n {\n this.material.uniforms._MainTex.value.dispose();\n }\n // OScreen.remove_screen_material(this.material);\n this.geometry.dispose();\n this.material.dispose();\n }\n\n get_size(vector2)\n {\n if (vector2)\n {\n return vector2.copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\n }\n else\n {\n return new Vector2().copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\n }\n }\n\n on_mouse_enter()\n {}\n\n on_mouse_exit()\n {}\n\n on_mouse_hover()\n {}\n}\n\nexport { UIElement };\n","import { Mesh } from 'three';\n\nclass UpdatableMaterialMesh extends Mesh\n{\n constructor(geometry, material)\n {\n super(geometry, material);\n\n const self = this;\n\n this.onBeforeRender = () =>\n {\n self.material.update();\n };\n }\n}\n\nexport { UpdatableMaterialMesh };\n","import { Vector2, Vector4 } from 'three';\n\nclass TextGlyph\n{\n constructor(offset, plane_bounds, atlas_bounds)\n {\n const width = plane_bounds.right - plane_bounds.left;\n const height = plane_bounds.top - plane_bounds.bottom;\n\n this.scale = new Vector2(width, height);\n this.position = new Vector2(offset + plane_bounds.left, plane_bounds.bottom);\n\n this.atlas_bounds = new Vector4(atlas_bounds.left, atlas_bounds.right, atlas_bounds.top, atlas_bounds.bottom);\n }\n}\n\nexport { TextGlyph };\n","import { Vector3, Quaternion, Matrix4, Color, Box2, Vector2 } from 'three';\nimport { TextGlyph } from './TextGlyph';\n\nclass SDFText\n{\n constructor(glyph_layout, text = '')\n {\n this.glyph_layout = glyph_layout;\n\n this.glyphs = [];\n\n this.glyph_is_dirty = true;\n this.matrix_is_dirty = true;\n this.color_is_dirty = true;\n\n this.position = new Vector3();\n this.quaternion = new Quaternion();\n this.scale = new Vector3(1, 1, 1);\n this.matrix = new Matrix4();\n\n this.color = new Color('#FFFFFF');\n\n this.pivot_point = new Vector2();\n this.__opacity = 1;\n\n this.__text = text;\n\n this.__generate_glyphs(text);\n }\n\n set text(value)\n {\n this.__text = value;\n this.__generate_glyphs(value);\n this.matrix_is_dirty = true;\n }\n\n get text()\n {\n return this.__text;\n }\n\n update_matrix()\n {\n this.matrix.compose(this.position, this.quaternion, this.scale);\n this.matrix_is_dirty = false;\n this.glyph_is_dirty = true;\n }\n\n clear_glyph_dirty()\n {\n this.glyph_is_dirty = false;\n }\n\n clear_color_dirty()\n {\n this.color_is_dirty = false;\n }\n\n set_rotation(orientation = 0, tilt = 0) // 0..360, -90..0..90\n {\n const new_orientation = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), (orientation / 360) * Math.PI * 2);\n const new_tilt = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), (-tilt / 360) * Math.PI * 2);\n\n this.quaternion.copy(new_orientation.multiply(new_tilt));\n this.matrix_is_dirty = true;\n }\n\n set_position(pos)\n {\n this.position.copy(pos);\n this.matrix_is_dirty = true;\n }\n\n set_size(size)\n {\n this.scale.set(size, size, size);\n this.matrix_is_dirty = true;\n }\n\n set_color(col)\n {\n this.color.set(col);\n this.color_is_dirty = true;\n }\n\n set_pivot(pivot)\n {\n this.pivot_point.copy(pivot);\n this.update_glyphs();\n }\n\n set opacity(op)\n {\n this.__opacity = op;\n this.color_is_dirty = true;\n }\n\n get opacity()\n {\n return this.__opacity;\n }\n\n update_glyphs()\n {\n this.__generate_glyphs(this.text);\n }\n\n __generate_glyphs(text)\n {\n let cursor = 0;\n\n this.glyphs.length = 0;\n\n for (let i = 0; i < text.length; i++)\n {\n const unicode = text.charCodeAt(i);\n const glyph = this.glyph_layout.find(element => element.unicode === unicode);\n if (glyph)\n {\n if (glyph.planeBounds)\n {\n const text_glyph = new TextGlyph(cursor, glyph.planeBounds, glyph.atlasBounds);\n this.glyphs.push(text_glyph);\n }\n cursor += glyph.advance;\n }\n }\n\n const box2 = new Box2();\n const first_glyph = this.glyphs[0];\n box2.setFromCenterAndSize(first_glyph.position.clone().add(new Vector2(first_glyph.scale.x / 2, first_glyph.scale.y / 2)), first_glyph.scale);\n\n for (let i = 1; i < this.glyphs.length; i++)\n {\n const g = this.glyphs[i];\n const box = new Box2().setFromCenterAndSize(g.position.clone().add(new Vector2(g.scale.x / 2, g.scale.y / 2)), g.scale);\n box2.union(box);\n }\n\n const box2_size = new Vector2();\n box2.getSize(box2_size);\n for (let i = 0; i < this.glyphs.length; i++)\n {\n this.glyphs[i].position.x -= box2_size.x / 2;\n this.glyphs[i].position.y -= box2_size.y / 2;\n\n this.glyphs[i].position.x += (box2_size.x / 2) * this.pivot_point.x;\n this.glyphs[i].position.y += (box2_size.y / 2) * this.pivot_point.y;\n }\n\n this.glyph_is_dirty = true;\n }\n}\n\nexport { SDFText };\n","import { BaseShaderMaterial } from './BaseShaderMaterial';\n\nimport frag from '../shaders/sdf_text/sdf_text.frag';\nimport vert from '../shaders/sdf_text/sdf_text.vert';\n\nimport { Vector2, DoubleSide, LinearFilter } from 'three';\nimport { OMath } from '../utilities/OMath';\n\nclass SDFTextMaterial extends BaseShaderMaterial\n{\n constructor(texture)\n {\n super(vert, frag, {\n _Texture: { value: texture },\n _Boldness: { value: 0.5 },\n _AtlasSize: { value: new Vector2(1, 1) }\n });\n\n this.transparent = true;\n this.extensions = {\n derivatives: true\n };\n this.depthWrite = false;\n this.side = DoubleSide;\n texture.minFilter = LinearFilter;\n texture.magFilter = LinearFilter;\n texture.generateMipMaps = false;\n }\n\n set_atlas_size(size)\n {\n this.uniforms._AtlasSize.value.copy(size);\n }\n\n set_boldness(value)\n {\n this.uniforms._Boldness.value = OMath.lerp(0.5, 0.2, value);\n }\n}\n\nexport { SDFTextMaterial };\n","import { SDFText } from './SDFText';\nimport { SDFTextMaterial } from '../../materials/SDFTextMaterial';\nimport { ArrayUtilities } from '../../utilities/ArrayUtilities';\n\nimport {\n PlaneGeometry,\n Mesh,\n Vector2,\n InstancedBufferGeometry,\n InstancedBufferAttribute,\n Float32BufferAttribute,\n DynamicDrawUsage\n} from 'three';\n\nclass SDFTextBatch extends Mesh\n{\n constructor(font_layout, atlas_texture)\n {\n const max_allocations = 2000;\n\n const instanced_geometry = new InstancedBufferGeometry();\n instanced_geometry.instanceCount = 0;\n\n const geometry = new PlaneGeometry(1, 1);\n geometry.translate(0.5, 0.5, 0);\n instanced_geometry.setAttribute('position', new Float32BufferAttribute(geometry.getAttribute('position').array, 3));\n instanced_geometry.setAttribute('uv', new Float32BufferAttribute(geometry.getAttribute('uv').array, 2));\n instanced_geometry.index = geometry.index;\n\n const transformsCol0 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol1 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol2 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol3 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n const glyph_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const plane_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n const color = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n transformsCol0.usage = DynamicDrawUsage;\n transformsCol1.usage = DynamicDrawUsage;\n transformsCol2.usage = DynamicDrawUsage;\n transformsCol3.usage = DynamicDrawUsage;\n glyph_bounds.usage = DynamicDrawUsage;\n plane_bounds.usage = DynamicDrawUsage;\n color.usage = DynamicDrawUsage;\n\n instanced_geometry.setAttribute('transformsCol0', transformsCol0);\n instanced_geometry.setAttribute('transformsCol1', transformsCol1);\n instanced_geometry.setAttribute('transformsCol2', transformsCol2);\n instanced_geometry.setAttribute('transformsCol3', transformsCol3);\n\n instanced_geometry.setAttribute('glyph_bounds', glyph_bounds);\n instanced_geometry.setAttribute('plane_bounds', plane_bounds);\n instanced_geometry.setAttribute('color', color);\n\n super(instanced_geometry, new SDFTextMaterial(atlas_texture));\n\n this.text_elements = [];\n this.font_layout = font_layout;\n\n this.material.set_atlas_size(new Vector2(font_layout.atlas.width, font_layout.atlas.height));\n\n this.frustumCulled = false;\n }\n\n set_boldness(value)\n {\n this.material.set_boldness(value);\n }\n\n add_text(text_str)\n {\n const elem = new SDFText(this.font_layout.glyphs, text_str);\n this.text_elements.push(elem);\n return elem;\n }\n\n remove_text(text_elem)\n {\n ArrayUtilities.remove_elem(this.text_elements, text_elem);\n this.update(true);\n }\n\n update(force_update)\n {\n const glyph_bounds_atr = this.geometry.getAttribute('glyph_bounds');\n const plane_bounds_atr = this.geometry.getAttribute('plane_bounds');\n\n const transformsCol0 = this.geometry.getAttribute('transformsCol0');\n const transformsCol1 = this.geometry.getAttribute('transformsCol1');\n const transformsCol2 = this.geometry.getAttribute('transformsCol2');\n const transformsCol3 = this.geometry.getAttribute('transformsCol3');\n\n const color_atr = this.geometry.getAttribute('color');\n\n let matrix_needs_update = force_update === true;\n let glyph_needs_update = force_update === true;\n let color_needs_update = force_update === true;\n\n let glyph_count = 0;\n for (let i = 0; i < this.text_elements.length; i++)\n {\n const text = this.text_elements[i];\n\n if (text.matrix_is_dirty)\n {\n matrix_needs_update = true;\n text.update_matrix();\n }\n\n if (text.glyph_is_dirty)\n {\n glyph_needs_update = true;\n text.clear_glyph_dirty();\n }\n\n if (text.color_is_dirty)\n {\n color_needs_update = true;\n text.clear_color_dirty();\n }\n\n const matrix = text.matrix;\n const color = text.color;\n const opacity = text.opacity;\n\n for (let glyph_i = 0; glyph_i < text.glyphs.length; glyph_i++)\n {\n const glyph = text.glyphs[glyph_i];\n\n const buffer_i = glyph_count;\n\n glyph_bounds_atr.setXYZW(buffer_i, glyph.atlas_bounds.x, glyph.atlas_bounds.y, glyph.atlas_bounds.z, glyph.atlas_bounds.w);\n plane_bounds_atr.setXYZW(buffer_i, glyph.position.x, glyph.position.y, glyph.scale.x, glyph.scale.y);\n\n transformsCol0.setXYZW(buffer_i, matrix.elements[0],\n matrix.elements[1],\n matrix.elements[2],\n matrix.elements[3]);\n\n transformsCol1.setXYZW(buffer_i, matrix.elements[4],\n matrix.elements[5],\n matrix.elements[6],\n matrix.elements[7]);\n\n transformsCol2.setXYZW(buffer_i, matrix.elements[8],\n matrix.elements[9],\n matrix.elements[10],\n matrix.elements[11]);\n\n transformsCol3.setXYZW(buffer_i, matrix.elements[12],\n matrix.elements[13],\n matrix.elements[14],\n matrix.elements[15]);\n\n color_atr.setXYZW(buffer_i, color.r, color.g, color.b, opacity);\n\n glyph_count++;\n }\n }\n\n this.geometry.instanceCount = glyph_count;\n\n if (glyph_count > this.max_allocations)\n {\n console.error('SDFTextBatch exceeded maximum glyph allocations(max/current): ', this.max_allocations, glyph_count, this);\n }\n\n if (matrix_needs_update)\n {\n transformsCol0.needsUpdate = true;\n transformsCol1.needsUpdate = true;\n transformsCol2.needsUpdate = true;\n transformsCol3.needsUpdate = true;\n }\n if (glyph_needs_update)\n {\n glyph_bounds_atr.needsUpdate = true;\n plane_bounds_atr.needsUpdate = true;\n }\n if (color_needs_update)\n {\n color_atr.needsUpdate = true;\n }\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n }\n}\n\nexport { SDFTextBatch };\n","import { ActionInterpolator } from './ActionInterpolator';\n\nclass VectorInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n }\n\n update(context, t)\n {\n const tmp = this.from.clone();\n tmp.lerp(this.to, this.easing_function(t));\n context[this.attribute_name].copy(tmp);\n }\n}\n\nexport { VectorInterpolator };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/median_filter/median_filter.frag';\n\nimport { Vector2 } from 'three';\n\nclass MedianFilterMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, undefined, {\n kernel3x3: true\n });\n\n this.uniforms._SourceTex = { value: undefined };\n this.uniforms._SourceTexSize = { value: new Vector2(1, 1) };\n }\n\n set_texture(tex)\n {\n this.uniforms._SourceTex.value = tex;\n\n const size = this.get_size(tex);\n this.uniforms._SourceTexSize.value.copy(size);\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n\nexport { MedianFilterMaterial };\n","import { MedianFilterMaterial } from '../materials/MedianFilterMaterial';\nimport { Graphics } from '../Graphics';\n\nimport { WebGLRenderTarget, Vector2, RGBAFormat, FloatType, NearestFilter } from 'three';\n\nclass MedianFilter\n{\n constructor(renderer)\n {\n this.RT = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n this.RT1 = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n\n this.median_filter_mat = new MedianFilterMaterial();\n }\n\n filter(texture)\n {\n const tex_size = this.get_size(texture);\n if (tex_size.x !== this.RT.width || tex_size.y !== this.RT.height)\n {\n this.RT.setSize(tex_size.x, tex_size.y);\n this.RT1.setSize(tex_size.x, tex_size.y);\n }\n\n this.median_filter_mat.set_texture(texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n\n for (let i = 0; i < 0; i++)\n {\n this.median_filter_mat.set_texture(this.RT.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT1);\n\n this.median_filter_mat.set_texture(this.RT1.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n }\n\n return this.RT;\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n\nexport { MedianFilter };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport downsample_frag from '../shaders/dual_filter_blur/downsample.frag';\nimport upsample_frag from '../shaders/dual_filter_blur/upsample.frag';\n\nclass DualFilteringBlurMaterial extends BlitMaterial\n{\n constructor(upsample)\n {\n super(upsample ? upsample_frag : downsample_frag);\n }\n}\n\nexport { DualFilteringBlurMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/dual_filter_blur/alpha_filter.frag';\n\nclass AlphaFilterMaterial extends BlitMaterial\n{\n constructor(use_alpha_mask, upsample)\n {\n super(frag);\n }\n\n set offset(value)\n {\n this.uniforms._Offset.value = value;\n }\n\n get offset()\n {\n return this.uniforms._Offset.value;\n }\n}\n\nexport { AlphaFilterMaterial };\n","import { DualFilteringBlurMaterial } from '../materials/DualFilteringBlurMaterial';\nimport { AlphaFilterMaterial } from '../materials/AlphaFilterMaterial';\nimport { Graphics } from '../Graphics';\nimport { WebGLRenderTarget } from 'three';\nclass DualFilteringBlurrer\n{\n constructor(use_alpha_mask)\n {\n this.current_width = 1;\n this.current_height = 1;\n this.RT0 = new WebGLRenderTarget(1, 1);\n this.RT1 = new WebGLRenderTarget(1, 1);\n this.RT2 = new WebGLRenderTarget(1, 1);\n this.RT3 = new WebGLRenderTarget(1, 1);\n this.RT4 = new WebGLRenderTarget(1, 1);\n\n this.upscale_blur_mat = new DualFilteringBlurMaterial(true);\n this.downscale_blur_mat = new DualFilteringBlurMaterial(false);\n\n this.alpha_filter_mat = new AlphaFilterMaterial();\n }\n\n blur(RT)\n {\n this.check_RT_resize(RT.width, RT.height);\n Graphics.blit(RT, this.RT1, this.alpha_filter_mat);\n\n // Graphics.blit(this.RT0, this.RT1, this.downscale_blur_mat);\n Graphics.blit(this.RT1, this.RT2, this.downscale_blur_mat);\n Graphics.blit(this.RT2, this.RT3, this.downscale_blur_mat);\n Graphics.blit(this.RT3, this.RT4, this.downscale_blur_mat);\n\n // Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\n // Graphics.blit(this.RT3, this.RT4, this.upscale_blur_mat);\n Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\n Graphics.blit(this.RT3, this.RT2, this.upscale_blur_mat);\n Graphics.blit(this.RT2, RT, this.upscale_blur_mat);\n // Graphics.blit(this.RT1, RT, this.upscale_blur_mat);\n\n // return this.RT2;\n }\n\n check_RT_resize(width, height)\n {\n if (this.current_width !== width || this.current_height !== height)\n {\n this.current_width = width;\n this.current_height = height;\n this.RT0.setSize(this.current_width / 2, this.current_height / 2);\n this.RT1.setSize(this.current_width / 2, this.current_height / 2);\n this.RT2.setSize(this.current_width / 4, this.current_height / 4);\n this.RT3.setSize(this.current_width / 8, this.current_height / 8);\n this.RT4.setSize(this.current_width / 16, this.current_height / 16);\n }\n }\n}\n\nexport { DualFilteringBlurrer };\n","import { Graphics } from '../Graphics';\n\nimport { NearestFilter } from 'three';\nimport { RGBAFormat } from 'three';\nimport { LinearEncoding } from 'three';\nimport { HalfFloatType } from 'three';\nimport { FloatType } from 'three';\nimport { WebGLRenderTarget } from 'three';\nimport { Capabilities } from '../Capabilities';\n\nclass ParticleAttribute\n{\n constructor(attr_name, update_material)\n {\n this.read = undefined;\n this.write = undefined;\n\n this.name = attr_name;\n\n this.update_material = update_material;\n }\n\n init_from_geometry(geometry)\n {\n // overrided by inheritance\n }\n\n init_from_attribute(particle_attribute)\n {\n\n }\n\n build_RT(particle_count)\n {\n const resolution = ParticleAttribute.calculate_resolution(particle_count);\n const options = {\n minFilter: NearestFilter,\n magFilter: NearestFilter,\n format: RGBAFormat,\n encoding: LinearEncoding,\n type: Capabilities.fp_textures_available ? FloatType : HalfFloatType,\n stencilBuffer: false,\n depthBuffer: false\n };\n\n return new WebGLRenderTarget(resolution.width, resolution.height, options);\n }\n\n static calculate_resolution(particle_count)\n {\n const width = Math.min(particle_count, 512);\n const height = Math.max(1, Math.ceil(particle_count / width));\n return { width, height };\n }\n\n swap_RT()\n {\n const tmp = this.read;\n this.read = this.write;\n this.write = tmp;\n }\n\n update(attribute_writter_scene)\n {\n if (this.update_material)\n {\n this.update_material.update();\n attribute_writter_scene.children[0].material = this.update_material;\n this.update_material.uniforms._MainTex.value = this.read.texture;\n Graphics.render(attribute_writter_scene, undefined, this.write);\n attribute_writter_scene.children[0].material = undefined;\n\n this.swap_RT();\n }\n }\n\n store_geometry_attribute_in_RT(attribute, RT, storage_material, attribute_writter_scene)\n {\n attribute_writter_scene.children[0].geometry.setAttribute('data', attribute);\n attribute_writter_scene.children[0].material = storage_material;\n\n Graphics.render(attribute_writter_scene, undefined, RT);\n\n attribute_writter_scene.children[0].geometry.deleteAttribute('data');\n attribute_writter_scene.children[0].material = undefined;\n }\n\n get_texture()\n {\n return this.read.texture;\n }\n}\n\nexport { ParticleAttribute };\n","import { Object3D } from 'three';\nimport { BufferAttribute } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Mesh } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Scene } from 'three';\nimport { Points } from 'three';\nimport { InstancedBufferGeometry } from 'three';\nimport { InstancedBufferAttribute } from 'three';\nimport { ParticleAttribute } from './ParticleAttribute';\n\nclass GPUParticleSystem extends Object3D\n{\n constructor(particle_count, material)\n {\n super();\n this.attributes = [];\n\n this.mesh = this.build_point_mesh(particle_count, material);\n this.add(this.mesh);\n\n this.attribute_writter_mesh = this.build_attribute_writter_mesh(particle_count);\n this.attribute_writter_scene = new Scene();\n this.attribute_writter_scene.add(this.attribute_writter_mesh);\n }\n\n add_texture_attribute(buffer_attribute)\n {\n this.attributes.push(buffer_attribute);\n }\n\n add_update_attribute_array(name, array, item_size)\n {\n this.attribute_writter_mesh.geometry.setAttribute(name, new BufferAttribute(array, item_size, false));\n }\n\n add_attribute_array(name, array, item_size)\n {\n this.mesh.geometry.setAttribute(name, new InstancedBufferAttribute(array, item_size, false));\n }\n\n update()\n {\n this.mesh.material.update();\n for (let i = 0; i < this.attributes.length; i++)\n {\n this.attributes[i].update(this.attribute_writter_scene);\n }\n }\n\n dispose()\n {\n this.mesh.geometry.dispose();\n this.mesh.material.dispose();\n }\n\n build_point_mesh(instance_count = 1, material)\n {\n const geo = new PlaneGeometry();\n\n const instanced_geo = new InstancedBufferGeometry();\n instanced_geo.setAttribute('position', geo.getAttribute('position'));\n instanced_geo.index = geo.index;\n\n instanced_geo.setAttribute('storage_uv', this.build_uv_storage_attribute(instance_count));\n instanced_geo.instanceCount = instance_count;\n const mesh = new Mesh(instanced_geo, material);\n mesh.frustumCulled = false;\n return mesh;\n }\n\n build_attribute_writter_mesh(particle_count)\n {\n const { width, height } = ParticleAttribute.calculate_resolution(particle_count);\n\n const uvs = new Float32Array(particle_count * 3);\n\n for (let i = 0; i < particle_count; i++)\n {\n const x = i % width;\n const y = Math.floor(i / width);\n uvs[i * 3 + 0] = (x + 0.5) / width;\n uvs[i * 3 + 1] = (y + 0.5) / height;\n uvs[i * 3 + 2] = i;\n }\n const geo = new BufferGeometry();\n geo.setAttribute('position', new BufferAttribute(uvs, 3, false));\n\n const points = new Points(geo);\n points.frustumCulled = false;\n return points;\n }\n\n build_uv_storage_attribute(particle_count)\n {\n const { width, height } = ParticleAttribute.calculate_resolution(particle_count);\n\n const uvs = new Float32Array(particle_count * 2);\n\n for (let i = 0; i < particle_count; i++)\n {\n const x = i % width;\n const y = Math.floor(i / width);\n uvs[i * 2 + 0] = (x + 0.5) / width;\n uvs[i * 2 + 1] = (y + 0.5) / height;\n }\n return new InstancedBufferAttribute(uvs, 2, false);\n }\n}\n\nexport { GPUParticleSystem };\n","import frag from '../../shaders/gpu_particles/generic_storage.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { NoBlending } from 'three';\nimport { AlwaysDepth } from 'three';\n\nclass ParticleStorageMaterial extends ShaderMaterial\n{\n constructor()\n {\n const vert = `\n varying vec4 value;\n attribute vec4 data;\n\n void main()\n {\n gl_Position = vec4(position.xy * 2.0 - 1.0, 1.0,1.0);\n gl_PointSize = 1.0;\n\n value = data;\n }\n `;\n super({\n uniforms: {\n\n },\n vertexShader: vert,\n fragmentShader: frag,\n depthWrite: false,\n blending: NoBlending,\n depthTest: false,\n depthFunc: AlwaysDepth\n });\n }\n}\n\nexport { ParticleStorageMaterial };\n","import { BufferAttribute } from 'three';\n\nimport { ParticleAttribute } from '../gpu_particles/ParticleAttribute';\nimport { ParticleStorageMaterial } from '../materials/gpu_particles/ParticleStorageMaterial';\n\nclass ParticlePositionAttribute extends ParticleAttribute\n{\n constructor(update_material)\n {\n super('_Position', update_material);\n }\n\n store_geometry(geometry, attribute_writter_scene)\n {\n const pos_attr = geometry.getAttribute('position');\n this.read = this.build_RT(pos_attr.count);\n this.write = this.build_RT(pos_attr.count);\n\n const mat = new ParticleStorageMaterial();\n this.store_geometry_attribute_in_RT(geometry.getAttribute('position'), this.read, mat, attribute_writter_scene);\n }\n\n store_positions(positions, attribute_writter_scene)\n {\n this.read = this.build_RT(positions.length);\n this.write = this.build_RT(positions.length);\n\n const arr = new Float32Array(positions.length * 4);\n\n for (let i = 0; i < positions.length; i++)\n {\n arr[i * 4 + 0] = positions[i].x;\n arr[i * 4 + 1] = positions[i].y;\n arr[i * 4 + 2] = positions[i].z;\n arr[i * 4 + 3] = (Math.random() * 2 - 1) * 10;\n }\n const mat = new ParticleStorageMaterial();\n this.store_geometry_attribute_in_RT(new BufferAttribute(arr, 4), this.read, mat, attribute_writter_scene);\n }\n}\n\nexport { ParticlePositionAttribute };\n","import { DataTexture } from 'three';\n\nclass CustomDataTexture extends DataTexture\n{\n constructor(data, width, height, format, type)\n {\n super(data, width, height, format, type);\n this.multiplier = 1;\n }\n\n set_rgba(index, r, g, b, a)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.data[index * 3 + 3] = a * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_rgb(index, r, g, b)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_r(index, value)\n {\n this.data[index * 3 + 0] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_g(index, value)\n {\n this.data[index * 3 + 1] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_b(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_a(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n}\n\nexport { CustomDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { RGBFormat } from 'three';\n\nclass RGBDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Uint8Array(width * height * 3);\n super(data, width, height, RGBFormat);\n this.multiplier = 255;\n }\n}\n\nexport { RGBDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { RGBAFormat } from 'three';\n\nclass RGBADataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Uint8Array(width * height * 4);\n super(data, width, height, RGBAFormat);\n this.multiplier = 255;\n }\n}\n\nexport { RGBADataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBFormat } from 'three';\n\nclass RGBFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Float32Array(width * height * 3);\n super(data, width, height, RGBFormat, FloatType);\n }\n}\n\nexport { RGBFloatDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBAFormat } from 'three';\n\nclass RGBAFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Float32Array(width * height * 4);\n super(data, width, height, RGBAFormat, FloatType);\n }\n}\n\nexport { RGBAFloatDataTexture };\n","import { Mesh } from 'three';\nimport { RGBDataTexture } from '../data_textures/RGBDataTexture';\nimport { RGBADataTexture } from '../data_textures/RGBADataTexture';\nimport { RGBFloatDataTexture } from '../data_textures/RGBFloatDataTexture';\nimport { RGBAFloatDataTexture } from '../data_textures/RGBAFloatDataTexture';\n\nclass BatchedMesh extends Mesh\n{\n constructor(id_table, geometry, material, max_texture_width)\n {\n super(geometry, material);\n\n this.id_table = id_table;\n this.batched_count = Object.keys(id_table).length;\n this.max_texture_width = max_texture_width;\n this.batch_width = this.batched_count % max_texture_width;\n this.batch_height = Math.ceil(this.batched_count / max_texture_width);\n }\n\n attach_rgb_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBADataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgb_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBAFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n get_mesh_index(name)\n {\n return this.id_table[name];\n }\n\n set_rgb_value(uniform_name, mesh_name, r, g, b)\n {\n this.material.uniforms[uniform_name].set_rgb(this.get_mesh_index(mesh_name), r, g, b);\n }\n\n set_rgba_value(uniform_name, mesh_name, r, g, b, a)\n {\n this.material.uniforms[uniform_name].set_rgba(this.get_mesh_index(mesh_name), r, g, b, a);\n }\n}\n\nexport { BatchedMesh };\n","import { BatchedMesh } from './BatchedMesh';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { BufferAttribute } from 'three';\n\nclass MeshBatcher\n{\n batch(meshes, material)\n {\n const max_texture_width = 2048;\n // let texture_width = meshes.length % max_texture_width;\n // let texture_height = Math.ceil(meshes.length / max_texture_width);\n\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\n\n const geometries = [];\n const id_table = {};\n\n const attr_mesh_id = [];\n\n for (let i = 0; i < meshes.length; i++)\n {\n const mesh = meshes[i];\n const vertex_count = mesh.geometry.getAttribute('position').count;\n\n for (let count = 0; count < vertex_count; count++)\n {\n attr_mesh_id.push(i);\n }\n\n geometries.push(mesh.geometry);\n\n if (id_table[mesh.name] === undefined)\n {\n id_table[mesh.name] = i;\n }\n else\n {\n console.error('Mesh name is duplicated when trying to merge meshes. Non-unique id error.', mesh.name, id_table);\n }\n }\n\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(geometries);\n\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_mesh_id), 1);\n buffer_geometry.setAttribute('mesh_id', buffer_attribute);\n\n return this.create_batched_mesh(id_table, buffer_geometry, material, max_texture_width);\n }\n\n create_batched_mesh(id_table, buffer_geometry, material, max_texture_width)\n {\n return new BatchedMesh(id_table, buffer_geometry, material, max_texture_width);\n }\n}\n\nexport { MeshBatcher };\n","import { Audio as TAudio } from 'three';\nimport { PositionalAudio as TPositionalAudio } from 'three';\n\nclass AudioClip\n{\n constructor(buffer, loop = true, volume = 1, positional = false)\n {\n this.buffer = buffer;\n this.loop = loop;\n this.volume = volume;\n this.positional = positional;\n\n this.audio = undefined;\n }\n\n init(audio_listener)\n {\n if (this.positional)\n {\n this.audio = new TPositionalAudio(audio_listener);\n }\n else\n {\n this.audio = new TAudio(audio_listener);\n }\n\n this.audio.setBuffer(this.buffer);\n this.audio.setLoop(this.loop);\n\n // This prevents undesired volume at the beginning of playing\n this.audio.gain.gain.value = 0;\n\n this.audio.setVolume(this.loop ? 0 : this.volume);\n }\n\n play()\n {\n this.audio.play();\n }\n\n pause()\n {\n this.audio.pause();\n }\n\n stop()\n {\n this.audio.stop();\n }\n\n get is_playing()\n {\n return this.audio.isPlaying;\n }\n}\n\nexport { AudioClip };\n","import { AudioContext } from 'three';\r\n\r\nimport { AudioClip } from '../components/AudioClip';\r\nimport { AbstractLoader } from './AbstractLoader';\r\n\r\nclass AudioLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loop = true, volume = 0, size, positional = false)\r\n {\r\n super(resource_id, url, size);\r\n this.loop = loop;\r\n this.volume = volume;\r\n this.positional = positional;\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n // if (!window.user_interaction_for_audio)\r\n // {\r\n // setTimeout(this.on_preloaded_finished.bind(this, resource_container), 100);\r\n // }\r\n // else\r\n // {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.instantiate_audio(resource_container);\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n // }\r\n }\r\n\r\n instantiate_audio(resource_container)\r\n {\r\n const context = AudioContext.getContext();\r\n\r\n const buffer = context.createBuffer(2, 22050, 44100);\r\n\r\n fetch(this.url).then(r => r.blob()).then((response) =>\r\n {\r\n if (response.arrayBuffer)\r\n {\r\n response.arrayBuffer().then((array_buffer) =>\r\n {\r\n context.decodeAudioData(array_buffer, (audio_buffer) =>\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(audio_buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n });\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport { AudioLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\n// import { sRGBEncoding } from 'three';\n\nclass BasisLoader extends AbstractLoader\n{\n constructor(resource_id, url, loader, size)\n {\n super(resource_id, url, size);\n\n this.loader = loader;\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (basis) =>\n {\n // basis.encoding = sRGBEncoding;\n\n resource_container.set_resource(this.resource_id, this.url, basis);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { BasisLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { CubeTextureLoader } from 'three';\r\n\r\nclass CubemapLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, extension, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new CubeTextureLoader();\r\n this.loader.setPath(url + '/');\r\n this.urls = [\r\n `px.${extension}`,\r\n `nx.${extension}`,\r\n `py.${extension}`,\r\n `ny.${extension}`,\r\n `pz.${extension}`,\r\n `nz.${extension}`\r\n ];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.urls, (image) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, image);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (error) =>\r\n {\r\n this.__set_error('Image could not be loaded. Maybe wrong name or path, I don\\'t know' + '¯\\\\_(ツ)_/¯', error);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { CubemapLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { ColladaLoader } from 'three/examples/jsm/loaders/ColladaLoader.js';\r\n\r\nclass DAELoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new ColladaLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { DAELoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FileLoader as TFileLoader } from 'three';\r\n\r\nclass FileLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (file) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, file);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { FileLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { FontLoader as TFontLoader } from 'three/examples/jsm/loaders/FontLoader.js';\n\nclass FontLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new TFontLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (font) =>\n {\n resource_container.set_resource(this.resource_id, this.url, font);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { FontLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { GLTFLoader as TGLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nclass GLTFLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TGLTFLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { GLTFLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nclass GLTFDRACOLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loader, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new GLTFLoader();\r\n\r\n this.loader.setDRACOLoader(loader);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { GLTFDRACOLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { HDRCubeTextureLoader as THDRCubeTextureLoader } from 'three/examples/jsm/loaders/HDRCubeTextureLoader.js';\r\nimport { UnsignedByteType } from 'three';\r\n\r\nclass HDRCubeTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THDRCubeTextureLoader();\r\n this.url_suffix = ['/px.hdr', '/nx.hdr', '/py.hdr', '/ny.hdr', '/pz.hdr', '/nz.hdr'];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.setPath(this.url)\r\n .setDataType(UnsignedByteType)\r\n .load(this.url_suffix, (hdr) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, hdr);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { HDRCubeTextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nclass JSONLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n }\n\n on_preloaded_finished(resource_container, response)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n response.json().then((json) =>\n {\n resource_container.set_resource(this.resource_id, this.url, json);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { JSONLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { OBJLoader as TOBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';\n\nclass OBJLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new TOBJLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (obj) =>\n {\n resource_container.set_resource(this.resource_id, this.url, obj);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { OBJLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { Vector3 } from 'three';\nimport { FileLoader } from 'three';\n\nclass PointArrayLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new FileLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (text) =>\n {\n resource_container.set_resource(this.resource_id, this.url, this.parse_path(text));\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n\n parse_path(raw_data)\n {\n const string_array = raw_data.split('\\n');\n\n if (string_array[string_array.length - 1] === '')\n {\n string_array.pop();\n }\n\n const positions = [];\n\n for (let i = 0; i < string_array.length; i += 3)\n {\n const x = parseFloat(string_array[i + 0]);\n const y = parseFloat(string_array[i + 1]);\n const z = parseFloat(string_array[i + 2]);\n positions.push(new Vector3(x, y, z));\n }\n return positions;\n // let curve = new THREE.CatmullRomCurve3(positions);\n // return curve.getPoints(100);\n }\n}\n\nexport { PointArrayLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';\n\nclass RGBETextureLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new RGBELoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (hdr) =>\n {\n resource_container.set_resource(this.resource_id, this.url, hdr);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { RGBETextureLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FileLoader as TFileLoader } from 'three';\r\n\r\nclass TextLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { TextLoader };\r\n","import { Browser } from '../Browser';\r\nimport { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { NoColorSpace, SRGBColorSpace, Texture } from 'three';\r\n\r\nclass AsyncTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size, flipY = true, premultiplyAlpha = false, colorSpaceConversion = true)\r\n {\r\n super(resource_id, url, size);\r\n\r\n this.colorSpaceConversion = colorSpaceConversion;\r\n this.premultiplyAlpha = premultiplyAlpha;\r\n this.flipY = flipY;\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (Browser.is_safari) // && Browser.version < 15\r\n {\r\n this.load_with_old_method(resource_container);\r\n }\r\n else\r\n {\r\n this.load_with_new_method(resource_container);\r\n }\r\n }\r\n\r\n load_with_old_method(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const texture = new Texture();\r\n const image = new Image();\r\n\r\n image.src = this.url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.flipY = this.flipY;\r\n texture.premultiplyAlpha = this.premultiplyAlpha;\r\n texture.colorSpace = this.colorSpaceConversion ? SRGBColorSpace : NoColorSpace;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('Error loading texture. Maybe the resource is not an image?', this.url, this.original_url);\r\n };\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n load_with_new_method(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const fetchOptions = {};\r\n fetchOptions.credentials = 'same-origin';\r\n // fetchOptions.headers = this.requestHeader;\r\n\r\n fetch(this.url, fetchOptions).then((res) =>\r\n {\r\n return res.blob();\r\n }).then((blob) =>\r\n {\r\n return createImageBitmap(blob, {\r\n colorSpaceConversion: this.colorSpaceConversion ? 'default' : 'none',\r\n imageOrientation: this.flipY ? 'flipY' : 'none',\r\n premultiplyAlpha: this.premultiplyAlpha ? 'premultiply' : 'none'\r\n });\r\n }).then((imageBitmap) =>\r\n {\r\n const texture = new Texture(imageBitmap);\r\n texture.flipY = this.flipY;\r\n texture.premultiplyAlpha = this.premultiplyAlpha;\r\n texture.colorSpace = this.colorSpaceConversion ? SRGBColorSpace : NoColorSpace;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }).catch(function(e)\r\n {\r\n console.error(e);\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { AsyncTextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\n\r\nclass TextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n response.blob().then((blob) =>\r\n {\r\n const texture = new Texture();\r\n\r\n const url = URL.createObjectURL(blob);\r\n\r\n const image = new Image();\r\n image.src = url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('Error loading texture. Maybe the resource is not an image?', this.url);\r\n };\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { TextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nclass VideoLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n }\n\n on_preloaded_finished(resource_container, response)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n response.blob().then((blob) =>\n {\n resource_container.set_resource(this.resource_id, this.url, URL.createObjectURL(blob));\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { VideoLoader };\n","import { ResourceContainer } from '../ResourceContainer';\r\n\r\nclass ResourceBatch\r\n{\r\n constructor(batch_name)\r\n {\r\n this.resource_loaders = [];\r\n this.batch_name = batch_name || 'unnamed batch';\r\n }\r\n\r\n add_loader(loader)\r\n {\r\n this.resource_loaders.push(loader);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n this.resource_loaders[i].load(resource_container || ResourceContainer);\r\n }\r\n }\r\n\r\n get loading_finished()\r\n {\r\n let finished = true;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n finished = finished && this.resource_loaders[i].has_finished;\r\n }\r\n return finished;\r\n }\r\n\r\n get has_errors()\r\n {\r\n let has_error = false;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n has_error = has_error || this.resource_loaders[i].has_error;\r\n }\r\n return has_error;\r\n }\r\n\r\n print_errors()\r\n {\r\n console.error('Batch <' + this.batch_name + '> could not load successfully');\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n if (this.resource_loaders[i].has_error)\r\n {\r\n this.resource_loaders[i].print_error();\r\n }\r\n }\r\n }\r\n\r\n get_progress()\r\n {\r\n return this.get_loaded_bytes() / this.get_total_bytes();\r\n }\r\n\r\n get_loaded_bytes()\r\n {\r\n let loaded_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n loaded_bytes += this.resource_loaders[i].loaded_bytes;\r\n }\r\n\r\n return loaded_bytes;\r\n }\r\n\r\n get_total_bytes()\r\n {\r\n let total_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n total_bytes += this.resource_loaders[i].total_bytes;\r\n }\r\n\r\n return total_bytes;\r\n }\r\n}\r\n\r\nexport { ResourceBatch };\r\n"],"names":["browser","[object Object]","this","browser_name","agent","window","navigator","userAgent","toLowerCase","has_web_xr_support","is_vr","xr","isSessionSupported","indexOf","opr","chrome","version","get_version","name","is_safari","is_chrome","is_edge","is_edge_chromium","has_webm","is_firefox","has_hvec","preferred_video_extension","ua","tem","M","match","test","exec","slice","join","replace","appName","appVersion","splice","Number","split","Validation","n","is_int","is_float","str","JSON","parse","e","AbstractLoader","resource_id","url","size","loaded_bytes","total_bytes","has_finished","has_error","error_message","loaded","total","is_number","console","warn","message","error","resource_container","undefined","resources_by_url","cache","Browser","fetch","method","mode","credentials","redirect","then","on_progress","bind","catch","__on_error","set_resource","__update_downloaded_bytes","__loading_ended","response","response_clone","clone","reader","body","getReader","contentLength","headers","get","receivedLength","done","value","read","length","on_preloaded_finished","data","OMath","from_range_start_value","from_range_end_value","to_range_start_value","to_range_end_value","min","max","number","divisor","rgb","r","Math","round","toString","g","b","points","plane","projected_point","Vector3","points_on_plane","i","projectPoint","push","from","to","target","t","elements","lerp","x1","x2","abs","x","y","m","euclideanModulo","degrees","PI","radians","v","w","z","center","add","multiplyScalar","arr","col","floor","random","clamp","ActionSequencer","context","previous_elapsed_time","elapsed_time","playback_speed","__get_playback_speed","playing","action_events","initial_context","stringify","tmp_t","channels","channel_names","Object","keys","duration","get_duration","__play_clips","delta_time","time","trigger_time","action","interpolator","use_dynamic_from_value","keyframes","attribute_name","keyframe","__get_current_keyframe","evaluate","__linear_map_01","easing_function","__play_events","evaluate_keyframe","between","log","constructor","trigger","channel_name","initial","saturate","current","Infinity","distance","transitions_velocity","URLSearchParams","location","search","EasingFunctions","cos","sin","pow","sqrt","c4","ease_out_bounce","n1","d1","sign","ActionInterpolator","NumberInterpolator","super","view_context","app","ActionEvent","args","ViewContext","DrawIOAnimationSheet","xml_document","animation_nodes","DOMParser","parseFromString","querySelectorAll","animation_tracks","triggers","node","parent_node","parentElement","getAttribute","get_node_x_position","parseFloat","includes","split_data","trigger_name","trigger_method","at_time","value_data","to_value","from_time","to_time","sort","a","x_pos","ActionSequencerBuilder","default_state_data","animation_data","current_context","tracks","initial_tracks","state_to_tracks","get_longest_time","find","element","sequencer","add_action_interpolator","action_event","add_action_event","state","longest_time","xml","transition_data","track_time","event_manager","queue","zoom_changed_evt","store_clickd_evt","point_selected_evt","config_changed","path_substep_completed","path_completed","go_to_store_requested_evt","resource_loaded_evt","service_clicked_evt","unit_pos_updated_evt","floor_changed_evt","on_enter_floor_navigation","on_exit_floor_navigation","on_enter_floor_selection","on_exit_floor_selection","on_enter_outside_navigation","on_exit_outside_navigation","step_selected_evt","event","payload","callback","zoom","fire","store_id","hit_data","step_number","step_index","resource","service","unit_data","floor_id","resources","EventManager","fire_resource_loaded","HTMLUtilities","container","images","image","dataset","src","image_objects","image_object","videos","video","iframes","iframe","selector","TransitionTable","transitions","from_state_name","to_state_name","from_animation_sheet","__delta_buffer","___time","Clock","__delta_time","__smooth_delta_time","__elapsed_time","__allocated_time","Vector2","__frame_interpolation_t","fixed_delta_time","smooth_delta_time","shader_time","frame_interpolation","fdt","dt","sdt","getDelta","getElapsedTime","shift","__calculate_smooth_delta_time","ViewState","global_view_data","transition_progress","action_sequencer","update_transition","ViewStateTransitionHandler","transition_table","last_state","current_state","current_state_data","transitioning","skip","__exit_last_state","before_exit","show","before_enter","play","update","__update_transitions","is_finished","on_enter","before_update","fixed_update","assign","Time","update_exit_transition","get_progress","update_enter_transition","hide","on_exit","view_manager","views","transition_handler","view_change_subscribers","browser_title_suffix","__set_views_opacities","view_name","change_url","go_to_state","__change_browser_url","__change_browser_title","notify_view_change","scene_name","next_view","transition_view","set_next_view","go_to_view","subscriber","on_view_change","view","add_transitions","set_transitions","set_state","title_suffix","get_by_url","set_default_state_data","history","pushState","title","__capitalize","document","set_opacity","string","aux_string","toUpperCase","__snake_to_whitespace","group","ApplicationView","ResourceContainer","ViewManager","register_view","classList","remove","load_images","load_videos","style","opacity","BaseApplication","BaseRender","renderer","BaseShaderMaterial","ShaderMaterial","vert","frag","uniforms","vertexShader","basic_vert","fragmentShader","basic_frag","_Color","Color","BlitMaterial","frag_shader","vert_shader","defines","_MainTex","_Resolution","_TargetResolution","depthWrite","blending","NoBlending","depthTest","depthFunc","AlwaysDepth","AddMaterial","nMips","_SecondTex","tex","UnrealBloomComposeMaterial","NUM_MIPS","_BlurredTex","_BloomStrength","blurTexture1","blurTexture2","blurTexture3","blurTexture4","blurTexture5","bloomStrength","bloomFactors","bloomRadius","bloomTintColors","rt","col_string","set","camera_manager","_current","_spectator","camera","spectator","capabilities","max_anisotropy","vertex_texture_sampler_available","fp_textures_available","CanvasDrawer","uses_dynamic_font","__textHeight","canvas","createElement","ctx","getContext","fontStyle","getElementsByTagName","dummy","dummyText","createTextNode","appendChild","setAttribute","offsetHeight","removeChild","text","font","ceil","measureText","width","getFontHeight","ctxOptions","font_color","__draw","draw_canvas","canvas_texture","CanvasTexture","UVMapping","ClampToEdgeWrapping","NearestFilter","generateMipMaps","needsUpdate","height","radius","fill","stroke","tl","tr","br","bl","defaultRadius","side","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","configuration","parameters","dpr","json","Idle","is_animating","Animating","easing_function_t","animator","set_property_value","set_current_state","finished_callback","CSSAnimator","css_property","value_prefix","value_suffix","ease_in_out_cubic","AxisHelper","Object3D","scale","blue_points","blue_axis_mat","LineBasicMaterial","color","blue_axis_geo","BufferGeometry","setFromPoints","blue_axis_line","Line","renderOrder","green_points","green_axis_mat","green_axis_geo","green_axis_line","red_points","red_axis_mat","red_axis_geo","red_axis_line","scene_manager","Scene","scene","traverse","child","geometry","dispose","material","children","Cube","Mesh","segments","BoxGeometry","MeshBasicMaterial","Sphere","SphereBufferGeometry","Arrow","dir","cylinder_height","cylinder_geo","CylinderBufferGeometry","translate","cone_geometry","ConeBufferGeometry","cone_height","buffer_geometry","BufferGeometryUtils","mergeBufferGeometries","rotateX","quaternion","setFromUnitVectors","_dir","oscreen","position","render_width","render_height","width_height","pixel_size","size_changed","vector2","aspect_ratio","portrait","ScreenSpaceTextureMaterial","h","_ScreenSpacePosition","_ScreenSize","_TextureSize","PerspectiveCamera","TPerspectiveCamera","fov","aspect","near","far","clear_color","clear_alpha","copy","debug","Vector3_one","Vector3_zero","canvas_renderer","display_texture_meshes","OScreen","origin","arrow","normalize","axis","RT","rt_debug","position_2d","fillStyle","fillRect","clearRect","strokeStyle","line","frustumCulled","pos","cube","depth","distanceTo","sub","forward_dir","PlaneGeometry","Vector4","basic_color_vert","basic_color_frag","transparent","box","Box3","setFromCenterAndSize","helper","Box3Helper","sphere","input_points","open","catmull","CatmullRomCurve3","updateArcLengths","getSpacedPoints","draw_line","SphereGeometry","sphere_mesh","SceneManager","sphere1","bb","curve","options","offset","mesh","set_texture","graphics","set_screen_size","render","CameraManager","ClearDepthNormalMaterial","clear_depth","clear_normal","_DepthNormal","DepthNormalMaterial","_FarPlane","far_plane","DepthAndNormalsRenderer","WebGLRenderTarget","clear_depth_normal_mat","depth_normal_material","__resize_RT_if_necessary","clear","blit_clear_with_material","setSize","render_target","Blitter","_blit_scene","_blit_material","_blit_quad","_blit_camera","OrthographicCamera","dst","src_texture","isWebGLRenderTarget","texture","src_width","src_height","getSize","__render","mat","dst_RT","current_rt","getRenderTarget","setRenderTarget","core_attributes","context_attributes","threejs_attributes","_renderer","blitter","no_render","current_render_mode","generateDepthNormalTexture","depth_and_normals_renderer","is_webgl2","canvas_context","force_webgl2","xr_enabled","alpha","antialias","desynchronized","failIfMajorPerformanceCaveat","powerPreference","premultipliedAlpha","preserveDrawingBuffer","stencil","logarithmicDepthBuffer","WebGLRenderer","enabled","autoClear","setPixelRatio","Configuration","extensions","domElement","Capabilities","getMaxAnisotropy","maxVertexTextures","is_floating_point_texture_available","resize_observer","ResizeObserver","on_resize","observe","dom_element","depth_normals_RT","new_state","__update_current_camera","updateProjectionMatrix","updateMatrix","updateMatrixWorld","override_mat","__apply_override_material","on_pre_render","on_post_render","overrideMaterial","buffer","readRenderTargetPixels","clear_stencil","setClearColor","entries","entry","update_position","contentRect","update_size","setViewport","material_pass","src_RT","blit_with_material","blit","blob_callback","old_width","old_height","new_width","new_height","tile_width","tile_height","divisions_x","parseInt","divisions_y","old_dpr","getPixelRatio","ctx_2D","setViewOffset","drawImage","toBlob","clearViewOffset","blob","link","download","href","URL","createObjectURL","click","onclick","requestAnimationFrame","revokeObjectURL","removeAttribute","minFilter","magFilter","format","RGBAFormat","encoding","LinearEncoding","type","FloatType","stencilBuffer","depthBuffer","output","Float32Array","NormalMaterial","DebugNormalsRender","Graphics","KeyboardInput","ctrlz_pressed","ctrlz_fired","keys_keys","addEventListener","on_key_down","on_key_up","keyCode","ctrlKey","code","press_key","release_key","pressed","released","key_name","key","fired","down","removeEventListener","os","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","is_mobile","is_ipad","maxTouchPoints","is_ios","is_android","get_os","is_linux","is_mac","is_windows","platform","reflection_plane_context","target_geometry","target_position","GeometryBatch","batch_width","data_textures","object_names","zero_offset","write_offset","uniform_dirty_count","tmp_uploaded_data_count","uniform_name","default_value_v3","src_tex","__create_rgb_texture","dst_tex","one_pixel_tex","new_data_tex","__add_data_texture","__flood_data_texture_rgb","default_value_v4","__create_rgba_texture","__flood_data_texture_rgba","__create_rgba_float_texture","object_name","vector3","use_r","use_g","use_b","obj_index","__get_object_index","data_texture","__get_data_texture","__set_pixel_rgb","one_pixel","last_accessed_index","dirty_count","vector4","use_a","__set_pixel_rgba","upload_budget","__partial_texture_data_upload","__full_texture_data_upload","texture_data","copyTextureToTexture","index","v3","v4","Uint8Array","DataTexture","RGBFormat","dst_texture","one_pixel_text","geometry_batcher","batches","buffer_geometries","attr_accessor_uvs","texture_width","ceilPowerOfTwo","__init_uv_array","uv_index","vertex_count","count","buffer_attribute","BufferAttribute","upload_texture_data","uvs","ui","input","ui_elements","_tmp_normalized_pos","ss_scene","matrixWorldAutoUpdate","ws_scene","ss_camera","elem","set_screen_space_coordinate_system","set_world_space_coordinate_system","NDC","update_state","current_clicked_element","PerspectiveFrustumPointFitter","camera_quaternion","vertical_fov","v_fov","degToRad","h_fov","atan","tan","up_plane_normal","get_up_plane_normal","down_plane_normal","get_down_plane_normal","left_plane_normal","get_left_plane_normal","right_plane_normal","get_right_plane_normal","camera_forward_dir","applyQuaternion","sphere_center","pull_back_distance","get_distance_to_fit_rect","far_pos","up_plane","Plane","setFromNormalAndCoplanarPoint","down_plane","left_plane","right_plane","apply_center_correction_to_pos","closest_distance","inverse_dir","Line3","up_line_intersection","down_line_intersection","left_line_intersection","right_line_intersection","intersectLine","new_up_distance","new_down_distance","new_left_distance","new_right_distance","vertical_min","horizontal_min","forward_correction","target_pos","vertical_offset","get_vertical_correction","horizontal_offset","get_horizontal_correction","closest_distance_to_up_plane","closest_distance_to_down_plane","up_dir","down_line","up_line","down_dist","up_dist","correction","closest_distance_to_right_plane","closest_distance_to_left_plane","right_dir","left_line","right_line","left_dist","right_dist","Quaternion","setFromAxisAngle","distV","distH","OrthographicFrustumPointFitter","inverse_camera_quat","inverse","inverted_points","getCenter","distance_to_center","camera_utilities","tmp_mat","Matrix4","ray","Ray","tmp_size","tmp_unproj","tmp_vec","plane_position","plane_normal","get_forward_dir","isPerspectiveCamera","unproject_mouse_position","unproject","intersectPlane","zoom_scale","world_space_center","camera_forward","project_points_on_plane","projected_points_center","up","right","cross","inverse_mat","getInverse","applyMatrix4","projected_center","get_zoom_to_fit_rect","isOrthographicCamera","obj_x","obj_y","object_aspect","object","getWorldPosition","project","left","top","bottom","p1","p2","p3","p4","p5","p6","p7","p8","fit_points","camera_backward_dir","fitter","camera_pos","reference_position_plane","camera_ray","reference_position","camera_position","result","reference_rotation","reference_zoom","forward","initializer","init","CameraUtilities","GeometryBatcher","OS","ReflectionPlaneContext","UI","Debug","render_loop","SSAOMaterial","_InverseProjMatrix","_ProjectionMatrix","_Bias","_Radius","_SampleKernel","__get_sample_kernel","_RandomRotation","__get_rotation_kernel","sample_kernel","rotation_kernel","rotation_texture","wrapS","RepeatWrapping","wrapT","SSAOComposeMaterial","_AO","DisplayNormalTextureMaterial","depth_normals_vert","BoxBlurMaterial","_SampleDir","Blurrer","RT1","RT2","box_blur_mat","NormalAORender","ssao_mat","ssao_compose_mat","debug_normals","ssaa","use_ssaa","main_RT","SSAO_RT","blurrer","__check_RT_size","__update_uniforms","blur","projectionMatrix","NormalRender","VRRender","render_spectator_camera","spectator_camera","isPresenting","xrCam","getCamera","currentRenderTarget","GaussianBlurMaterial","kernel_radius","KERNEL_RADIUS","SIGMA","texSize","direction","LuminosityHighPassMaterial","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","GaussianBlurrer","current_width","current_height","separableBlurMaterials","renderTargetsHorizontal","renderTargetsVertical","kernelSizeArray","rt_pars","LinearFilter","renderTargetBright","generateMipmaps","init_materials","init_RT","luminosity_high_pass_mat","use_luminosity_high_pass","resize_RT","inputRenderTarget","set_direction","dispose_RT","hor","ver","texture_height","set_size","dispose_materials","UnrealBloomRender","bloom_compose_mat","blur_RT","add_mat","set_RT_0","set_RT_1","set_RT_2","set_RT_3","set_RT_4","set_bloom_strength","set_bloom_radius","set_add_texture","val","set_tint_color_0","set_tint_color_1","set_tint_color_2","set_tint_color_3","set_tint_color_4","TOrthographicCamera","view_component_manager","components","enabled_components","Set","__set_components_opacities","component","delete","component_name","RenderLoop","target_application","is_running","frames_passed","time_accumulator","__update","on_post_start","__set_frame_interpolation","ViewComponentManager","on_frame_end","setAnimationLoop","stop","screen","apply_pixel_density_v2","apply_pixel_density","get_pixel_size","SimpleTextDrawer","text_margin","text_size","get_text_size","globalAlpha","textBaseline","textAlign","fillText","ViewComponent","hidden","register_component","enable_component","disable_component","toggle_hidden","HorizontalPlane","VerticalPlane","ArrayUtilities","source","apply","array","items_left_count","closest_point","obj","ids","FrustumPointFitter","get_hozirontal_correction","closest_up_point","closest_down_point","closest_right_point","closest_left_point","GeometryUtilities","geometry_buffer","indices","positions","vertices","getX","getY","getZ","add_barycentric_attribute","non_indexed_geometry_buffer","bar_coordinates","ImageUtilities","getImageData","imagedata","mesh_sampler","sample_count","face_areas","min_area","normals","tangents","faces","index_0","index_1","index_2","v1","v2","face","c","n2","n3","normal","tangent","uv_a","uv_b","uv_c","area","get_face_area","normalized_faces_array","get_uniform_face_distribution","selected_faces","select_random_faces","sample_data_from_faces","sampled_points","sampled_normals","sampled_tangents","sampled_uvs","w1","w2","sample_point_in_face","amount","selected_face","minimum_area","extended_triangle_indices","repetitions_needed","j","vec1","vec2","w3","model_utilities","result_callback","fromGeometry","geometries","get_mesh","gltf","animations","skinnedMeshes","isSkinnedMesh","cloneBones","cloneSkinnedMeshes","isBone","skeleton","cloneSkinnedMesh","orderedCloneBones","bones","cloneBone","Skeleton","boneInverses","matrixWorld","cast","receive","castShadow","receiveShadow","object_type","ObjectUtilities","item","Array","isArray","sources","is_object","merge_deep","nodeType","attributes","attribute","nodeName","nodeValue","hasChildNodes","childNodes","xml_to_json","old","StringUtilities","hexValues","hex","words","substr","charAt","TimeUtilities","time_str","hours","minutes","seconds","Grid","derivatives","plane_geometry","convert_to_non_indexed_geometry","rotation","_Thickness","_Length","_ElapsedTime","setup","next_position","previous_position","orientation","coverage","accumulated_length","next_point","__get_next_position","previous_point","__get_previous_position","vertexList","nextPositionList","previousPositionList","orientationList","coverageList","setIndex","_length","thickness","parent","WorldImage","pivot","_ScreenAligned","_Scale","_Opacity","DoubleSide","current_scale","computeBoundingBox","tmp_bb_size","boundingBox","img","screen_aligned","boolean","Text2D","is_static","simple_text_drawer","draw_settings","draw_on_texture","LinearMipMapLinearFilter","update_texture","UIElementMaterial","intensity","_PixelOffset","_NDC","_PivotPoint","_DepthOffset","ScreenSpacePosition","WorldSpacePosition","tmp_vec3","tmp_vec2","UIElementState","ui_element","normalized_mouse_position","OnIdle","is_mouse_over","_on_enter_state","OnMouseEnter","on_mouse_enter","_on_hover_state","_on_exit_state","OnMouseExit","on_mouse_exit","_on_idle_state","OnMouseHover","__trigger_on_hover","on_mouse_hover","UIElement","is_clickable","position_strategy","_position","on_hover","mouse_pos_tmp","cached_NDC_position","screen_pos_tmp","texture_size","matrixAutoUpdate","pixel_offset","pivot_point","use_depth","depth_offset","visible","get_size","normalized_mouse_pos","get_pos_NDC","to_screen_position","rect","Box2","containsPoint","projected_pos","screen_pos","UpdatableMaterialMesh","self","onBeforeRender","TextGlyph","plane_bounds","atlas_bounds","SDFText","glyph_layout","glyphs","glyph_is_dirty","matrix_is_dirty","color_is_dirty","matrix","__opacity","__text","__generate_glyphs","compose","tilt","new_orientation","new_tilt","multiply","update_glyphs","op","cursor","unicode","charCodeAt","glyph","planeBounds","text_glyph","atlasBounds","advance","box2","first_glyph","union","box2_size","SDFTextMaterial","_Texture","_Boldness","_AtlasSize","SDFTextBatch","font_layout","atlas_texture","instanced_geometry","InstancedBufferGeometry","instanceCount","Float32BufferAttribute","transformsCol0","InstancedBufferAttribute","max_allocations","transformsCol1","transformsCol2","transformsCol3","glyph_bounds","usage","DynamicDrawUsage","text_elements","set_atlas_size","atlas","set_boldness","text_str","text_elem","remove_elem","force_update","glyph_bounds_atr","plane_bounds_atr","color_atr","matrix_needs_update","glyph_needs_update","color_needs_update","glyph_count","update_matrix","clear_glyph_dirty","clear_color_dirty","glyph_i","buffer_i","setXYZW","VectorInterpolator","tmp","MedianFilterMaterial","kernel3x3","_SourceTex","_SourceTexSize","isVideoTexture","videoWidth","videoHeight","isTexture","MedianFilter","median_filter_mat","tex_size","DualFilteringBlurMaterial","upsample","AlphaFilterMaterial","use_alpha_mask","_Offset","DualFilteringBlurrer","RT0","RT3","RT4","upscale_blur_mat","downscale_blur_mat","alpha_filter_mat","check_RT_resize","ParticleAttribute","attr_name","update_material","write","particle_attribute","particle_count","resolution","calculate_resolution","HalfFloatType","attribute_writter_scene","swap_RT","storage_material","deleteAttribute","GPUParticleSystem","build_point_mesh","attribute_writter_mesh","build_attribute_writter_mesh","item_size","instance_count","geo","instanced_geo","build_uv_storage_attribute","Points","ParticleStorageMaterial","ParticlePositionAttribute","pos_attr","build_RT","store_geometry_attribute_in_RT","CustomDataTexture","multiplier","RGBDataTexture","RGBADataTexture","RGBFloatDataTexture","RGBAFloatDataTexture","BatchedMesh","id_table","max_texture_width","batched_count","batch_height","mesh_name","set_rgb","get_mesh_index","set_rgba","MeshBatcher","meshes","attr_mesh_id","create_batched_mesh","AudioClip","loop","volume","positional","audio","audio_listener","TPositionalAudio","TAudio","setBuffer","setLoop","gain","setVolume","pause","is_playing","isPlaying","AudioLoader","instantiate_audio","AudioContext","createBuffer","arrayBuffer","array_buffer","decodeAudioData","audio_buffer","BasisLoader","loader","load","basis","xhr","msg","__set_error","CubemapLoader","extension","CubeTextureLoader","setPath","urls","DAELoader","ColladaLoader","FileLoader","TFileLoader","file","FontLoader","TFontLoader","GLTFLoader","TGLTFLoader","GLTFDRACOLoader","setDRACOLoader","HDRCubeTextureLoader","THDRCubeTextureLoader","url_suffix","setDataType","UnsignedByteType","hdr","JSONLoader","OBJLoader","TOBJLoader","PointArrayLoader","parse_path","raw_data","string_array","pop","RGBETextureLoader","RGBELoader","TextLoader","AsyncTextureLoader","flipY","premultiplyAlpha","colorSpaceConversion","load_with_old_method","load_with_new_method","Texture","Image","onload","colorSpace","SRGBColorSpace","NoColorSpace","onerror","original_url","fetchOptions","res","createImageBitmap","imageOrientation","imageBitmap","TextureLoader","VideoLoader","ResourceBatch","batch_name","resource_loaders","loading_finished","finished","has_errors","print_error","get_loaded_bytes","get_total_bytes"],"mappings":"6sDA8GK,MAACA,GAAU,IA7GhB,MAEEC,aAQE,OANAC,KAAKC,aAAe,GACpBD,KAAKE,MAAQC,OAAOC,UAAUC,UAAUC,cAExCN,KAAKO,mBAAqB,OAAQH,UAClCJ,KAAKQ,MAAQR,KAAKO,0BAA4BH,UAAUK,GAAGC,mBAAmB,iBAEtE,GAER,KAAKV,KAAKE,MAAMS,QAAQ,SAAW,EACjCX,KAAKC,aAAe,UACpB,MACF,KAAKD,KAAKE,MAAMS,QAAQ,QAAU,EAChCX,KAAKC,aAAe,gBACpB,MACF,KAAKD,KAAKE,MAAMS,QAAQ,QAAU,KAAOR,OAAOS,IAC9CZ,KAAKC,aAAe,QACpB,MACF,KAAKD,KAAKE,MAAMS,QAAQ,WAAa,KAAOR,OAAOU,OACjDb,KAAKC,aAAe,SACpB,MACF,KAAKD,KAAKE,MAAMS,QAAQ,YAAc,EACpCX,KAAKC,aAAe,YACpB,MACF,KAAKD,KAAKE,MAAMS,QAAQ,YAAc,EACpCX,KAAKC,aAAe,UACpB,MACF,KAAKD,KAAKE,MAAMS,QAAQ,WAAa,EACnCX,KAAKC,aAAe,SACpB,MACF,QACED,KAAKC,aAAe,QAItBD,KAAKc,QAAUd,KAAKe,cAGtBC,WAEE,OAAOhB,KAAKC,aAGdgB,gBAEE,MAA6B,WAAtBjB,KAAKC,aAGdiB,gBAEE,MAA6B,WAAtBlB,KAAKC,aAGdkB,cAEE,MAA6B,YAAtBnB,KAAKC,aAGdmB,uBAEE,MAA6B,kBAAtBpB,KAAKC,aAGdoB,eAEE,SAAUrB,KAAKkB,WAAalB,KAAKsB,YAActB,KAAKoB,kBAGtDG,eAEE,OAAOvB,KAAKiB,UAGdO,gCAEE,OAAOxB,KAAKqB,SAAW,OAASrB,KAAKuB,SAAW,WAAa,MAG/DxB,cAEE,MAAM0B,EAAKrB,UAAUC,UACrB,IAAIqB,EAAM,GACNZ,EAAU,EAEVa,EAAIF,EAAGG,MAAM,iEAAmE,GAkBpF,MAhBI,WAAWC,KAAKF,EAAE,MAEpBD,EAAO,kBAAkBI,KAAKL,IAAO,GACrCX,EAAW,OAASY,EAAI,IAAM,KAEnB,WAATC,EAAE,KAEJD,EAAMD,EAAGG,MAAM,uBACJ,MAAPF,IAAaZ,EAAUY,EAAIK,MAAM,GAAGC,KAAK,KAAKC,QAAQ,MAAO,WAGnEN,EAAIA,EAAE,GAAK,CAACA,EAAE,GAAIA,EAAE,IAAM,CAACvB,UAAU8B,QAAS9B,UAAU+B,WAAY,MACjB,OAA9CT,EAAMD,EAAGG,MAAM,6BAAqCD,EAAES,OAAO,EAAG,EAAGV,EAAI,IAE5EZ,EAAUa,EAAEK,KAAK,KAEVK,OAAOvB,EAAQwB,MAAM,KAAK,MC1GrC,MAAMC,GAEJxC,eAGAA,cAAcyC,GAEZ,OAAOH,OAAOG,KAAOA,GAAKA,EAAI,GAAM,EAGtCzC,gBAAgByC,GAEd,OAAOH,OAAOG,KAAOA,GAAKA,EAAI,GAAM,EAGtCzC,iBAAiByC,GAEf,OAAOxC,KAAKyC,OAAOD,IAAMxC,KAAK0C,SAASF,GAGzCzC,eAAe4C,GAEb,IAEEC,KAAKC,MAAMF,GAEb,MAAOG,GAEL,OAAO,EAGT,OAAO,GC5BX,MAAMC,GAEJhD,YAAYiD,EAAaC,EAAKC,EAAO,GAEnClD,KAAKgD,YAAcA,EACnBhD,KAAKiD,IAAMA,EACXjD,KAAKmD,aAAe,EACpBnD,KAAKoD,YAAcF,EAEnBlD,KAAKqD,cAAe,EACpBrD,KAAKsD,WAAY,EACjBtD,KAAKuD,cAAgB,OAGvBxD,0BAA0ByD,EAAQC,GAEhCD,EAASjB,GAAWmB,UAAUF,GAAUA,EAAS,EACjDC,EAASlB,GAAWmB,UAAUD,GAAUA,EAAS,EAEjDzD,KAAKmD,aAAeK,EAEhBC,EAAQ,IAEVzD,KAAKoD,YAAcK,GAGjBzD,KAAKmD,aAAenD,KAAKoD,aAE3BO,QAAQC,KAAK,8EAA+E5D,KAAKiD,KAIrGlD,kBAEEC,KAAKqD,cAAe,EAGtBtD,YAAY8D,GAEV7D,KAAKsD,WAAY,EACjBtD,KAAKuD,cAAgBM,EAGvB9D,cAEE4D,QAAQG,MAAM,uBAAyB9D,KAAKgD,YAAc,cAAgBhD,KAAKiD,IAAM,SAAWjD,KAAKuD,eAGvGxD,KAAKgE,GAEH,QAAsDC,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAC7C,CACE,MAAMiB,EAAQC,GAAQlD,UAAY,WAAa,UAE/CmD,MAAMpE,KAAKiD,IAAK,CACdoB,OAAQ,MACRC,KAAM,OACNJ,MAAOA,EACPK,YAAa,cACbC,SAAU,WAETC,KAAKzE,KAAK0E,YAAYC,KAAK3E,KAAM+D,IACjCa,MAAM5E,KAAK6E,WAAWF,KAAK3E,YAI9B+D,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,kBAITjF,kBAAkBgE,EAAoBkB,GAEpC,MAAMC,EAAiBD,EAASE,QAC1BC,EAASH,EAASI,KAAKC,YAGvBC,GAAiBN,EAASO,QAAQC,IAAI,kBAG5C,IAAIC,EAAiB,EAErB,OACA,CACE,MAAMC,KAAEA,EAAIC,MAAEA,SAAgBR,EAAOS,OAErC,GAAIF,EAEF,MAGFD,GAAkBE,EAAME,OAExB9F,KAAK+E,0BAA0BW,EAAgBH,GAIjDvF,KAAK+F,sBAAsBhC,EAAoBmB,GAGjDnF,sBAAsBgE,EAAoBkB,IAI1ClF,WAAWiG,GAETrC,QAAQG,MAAMkC,IC7GlB,MAAMC,GAEJlG,eAGAA,kBAAkB6F,EAChBM,EACAC,EACAC,EACAC,GAEA,OAAST,EAAQM,IAA2BC,EAAuBD,IAA4BG,EAAqBD,GAAwBA,EAG9IrG,eAAe6F,EAAOU,EAAKC,GAEzB,OAAQX,GAASU,GAAOV,GAASW,EAGnCxG,WAAWyG,EAAQC,GAEjB,OAASD,EAASC,EAAWA,GAAWA,EAG1C1G,kBAAkB2G,GAmBhB,OAjBAA,EAAIC,EAAIC,KAAKC,MAAc,IAARH,EAAIC,GAASG,SAAS,IACzCJ,EAAIK,EAAIH,KAAKC,MAAc,IAARH,EAAIK,GAASD,SAAS,IACzCJ,EAAIM,EAAIJ,KAAKC,MAAc,IAARH,EAAIM,GAASF,SAAS,IAEpB,IAAjBJ,EAAIC,EAAEb,SAERY,EAAIC,EAAI,IAAMD,EAAIC,GAEC,IAAjBD,EAAIK,EAAEjB,SAERY,EAAIK,EAAI,IAAML,EAAIK,GAEC,IAAjBL,EAAIM,EAAElB,SAERY,EAAIM,EAAI,IAAMN,EAAIM,GAGb,IAAMN,EAAIC,EAAID,EAAIK,EAAIL,EAAIM,EAGnCjH,+BAA+BkH,EAAQC,GAErC,MAAMC,EAAkB,IAAIC,EACtBC,EAAkB,GACxB,IAAK,IAAIC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IAEjCJ,EAAMK,aAAaN,EAAOK,GAAIH,GAC9BE,EAAgBG,KAAKL,EAAgBhC,SAGvC,OAAOkC,EAGTtH,oBAAoB0H,EAAMC,EAAIC,EAAQC,GAEpC,IAAK,IAAIN,EAAI,EAAGA,EAAI,GAAIA,IAEtBK,EAAOE,SAASP,GAAKtH,KAAK8H,KAAKL,EAAKI,SAASP,GAAII,EAAGG,SAASP,GAAIM,GAIrE7H,cAAcgI,EAAIC,GAEhB,OAAOpB,KAAKqB,IAAIF,EAAKC,GAAM,KAG7BjI,YAAYmI,EAAGC,EAAGP,GAEhB,OAAQ,EAAIA,GAAKM,EAAIN,EAAIO,EAG3BpI,aAAa6F,EAAOU,EAAKC,GAEvB,OAAOK,KAAKL,IAAID,EAAKM,KAAKN,IAAIC,EAAKX,IAGrC7F,uBAAuByC,EAAG4F,GAExB,OAAS5F,EAAI4F,EAAKA,GAAKA,EAGzBrI,gBAAgBmI,EAAGpC,EAAS,GAE1B,OAAOA,EAASc,KAAKqB,IAAIhC,GAAMoC,gBAAgBH,EAAY,EAATpC,GAAcA,GAGlE/F,gBAAgBuI,GAEd,OAAOA,GAAW1B,KAAK2B,GAAK,KAG9BxI,gBAAgByI,GAEd,OAAOA,GAAW,IAAM5B,KAAK2B,IAG/BxI,kBAAkBuI,GAEhB,OAAOA,GAAW1B,KAAK2B,GAAK,KAG9BxI,kBAAkByI,GAEhB,OAAOA,GAAW,IAAM5B,KAAK2B,IAG/BxI,0BAA0B0I,GAKxB,OAHAA,EAAEP,GAAKO,EAAEC,EACTD,EAAEN,GAAKM,EAAEC,EACTD,EAAEE,GAAKF,EAAEC,EACFD,EAGT1I,sBAAsBkH,GAEpB,MAAM2B,EAAS3B,EAAO,GAAG9B,QACzB,IAAK,IAAImC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IAEjCsB,EAAOC,IAAI5B,EAAOK,IAGpB,OADAsB,EAAOE,eAAe,EAAI7B,EAAOnB,QAC1B8C,EAGT7I,0BAEE,MAAMgJ,EAAM,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,KAEpE,IAAIC,EAAM,IASV,OARAA,GAAOD,EAAInC,KAAKqC,MAAsB,GAAhBrC,KAAKsC,WAC3BF,GAAOD,EAAInC,KAAKqC,MAAsB,GAAhBrC,KAAKsC,WAE3BF,GAAOD,EAAInC,KAAKqC,MAAsB,GAAhBrC,KAAKsC,WAC3BF,GAAOD,EAAInC,KAAKqC,MAAsB,GAAhBrC,KAAKsC,WAE3BF,GAAOD,EAAInC,KAAKqC,MAAsB,GAAhBrC,KAAKsC,WAC3BF,GAAOD,EAAInC,KAAKqC,MAAsB,GAAhBrC,KAAKsC,WACpBF,EAGTjJ,gBAAgBmI,GAEd,OAAOjC,GAAMkD,MAAMjB,EAAG,EAAG,ICpJ7B,MAAMkB,GAEJrJ,YAAYsJ,EAAU,IAEpBrJ,KAAKsJ,uBAAyB,KAC9BtJ,KAAKuJ,cAAgB,KACrBvJ,KAAKwJ,eAAiBxJ,KAAKyJ,uBAC3BzJ,KAAK0J,SAAU,EAEf1J,KAAK2J,cAAgB,GACrB3J,KAAKqJ,QAAUA,EAEfrJ,KAAK4J,gBAAkBhH,KAAKC,MAAMD,KAAKiH,UAAUR,IAEjDrJ,KAAK8J,MAAQ,EAEb9J,KAAK+J,SAAW,GAEhB,MAAMC,EAAgBC,OAAOC,KAAKb,GAClC,IAAK,IAAI/B,EAAI,EAAGA,EAAI0C,EAAclE,OAAQwB,IAExCtH,KAAK+J,SAASC,EAAc1C,IAAM,GAGpCtH,KAAKmK,SAAW,EAGlBpK,OAEEC,KAAK0J,SAAU,EAGjB3J,OAEEC,KAAK0J,SAAU,EAGjB3J,QAEEC,KAAKuJ,cAAgB,KAGvBxJ,OAEE,MAAMoK,EAAWnK,KAAKoK,eACtBpK,KAAKqK,aAAarK,KAAKuJ,aAAcY,EAAW,MAChDnK,KAAKuJ,aAAeY,EAGtBpK,OAAOuK,GAEDtK,KAAK0J,UAEP1J,KAAKsJ,sBAAwBtJ,KAAKuJ,aAClCvJ,KAAKuJ,cAAgBe,EAAatK,KAAKwJ,eACvCxJ,KAAKqK,aAAarK,KAAKsJ,sBAAuBtJ,KAAKuJ,eAIvDxJ,aAAawK,GAEXvK,KAAKsJ,sBAAwBtJ,KAAKuJ,aAClCvJ,KAAKuJ,aAAetD,GAAMkD,MAAMoB,EAAM,EAAGvK,KAAKmK,UAC9CnK,KAAKqK,aAAarK,KAAKuJ,aAAcvJ,KAAKuJ,cAG5CxJ,wBAAwB6H,GAEtB5H,KAAKsJ,sBAAwBtJ,KAAKuJ,aAClCvJ,KAAKuJ,aAAetD,GAAMkD,MAAMvB,EAAG,EAAG,GAAK5H,KAAKmK,SAChDnK,KAAKqK,aAAarK,KAAKuJ,aAAcvJ,KAAKuJ,cAG5CxJ,eAEE,OAAOkG,GAAMkD,MAAMnJ,KAAKuJ,aAAevJ,KAAKoK,eAAgB,EAAG,GAGjErK,cAEE,OAAOC,KAAKuJ,aAAevJ,KAAKoK,eAGlCrK,iBAAiByK,EAAcC,GAE7BzK,KAAK2J,cAAcnC,KAAK,CACtBgD,aAAcA,EACdC,OAAQA,IAGVzK,KAAKmK,SAAWvD,KAAKL,IAAIvG,KAAKmK,SAAUK,GAG1CzK,wBAAwB0H,EAAMC,EAAIgD,EAAcC,GAAyB,GAEvE,GAAIA,EACJ,CACE,MAAMC,EAAY5K,KAAK+J,SAASW,EAAaG,qBAE3B7G,IAAd4G,GAEFjH,QAAQG,MAAM,GAAG4G,EAAaG,iDAGP,IAArBD,EAAU9E,OAEZ4E,EAAajD,KAAOzH,KAAK4J,gBAAgBc,EAAaG,gBAItDH,EAAajD,KAAOmD,EAAUA,EAAU9E,OAAS,GAAG4E,aAAahD,GAIrE,MAAMoD,EAAW,CACfrD,KAAMA,EACNC,GAAIA,EACJgD,aAAcA,GAGhB1K,KAAKmK,SAAWvD,KAAKL,IAAIvG,KAAKmK,SAAUzC,GACxC1H,KAAK+J,SAASW,EAAaG,gBAAgBrD,KAAKsD,GAGlD/K,yBAAyBiB,GAEvB,MAAM8J,EAAW9K,KAAK+K,uBAAuB/J,EAAMhB,KAAKuJ,cAExD,OAAIvJ,KAAKuJ,aAAeuB,EAASrD,KAExBqD,EAASJ,aAAaM,SAAS,GAGjCF,EAASJ,aAAaM,SAAS,GAGxCjL,2BAA2BiB,GAIzB,OAFiBhB,KAAK+K,uBAAuB/J,EAAMhB,KAAKuJ,cAExCmB,aAAaM,SAAS,GAGxCjL,qBAAqBiB,GAEnB,MAAM8J,EAAW9K,KAAK+K,uBAAuB/J,EAAMhB,KAAKuJ,cAClD3B,EAAI5H,KAAKiL,gBAAgBjL,KAAKuJ,aAAcuB,EAASrD,KAAMqD,EAASpD,IAE1E,OAAOoD,EAASJ,aAAaQ,gBAAgBtD,GAG/C7H,eAEE,OAAOC,KAAKmK,SAGdpK,aAAa0H,EAAMC,GAEb1H,KAAKuJ,aAAevJ,KAAKsJ,uBAE3BtJ,KAAKmL,cAAcnL,KAAKsJ,sBAAuBtJ,KAAKuJ,cAEtD,MAAMS,EAAgBC,OAAOC,KAAKlK,KAAK4J,iBAEvC,IAAK,IAAItC,EAAI,EAAGA,EAAI0C,EAAclE,OAAQwB,IAC1C,CACE,MAAMtG,EAAOgJ,EAAc1C,GACrBwD,EAAW9K,KAAK+K,uBAAuB/J,EAAMyG,GAEnDzH,KAAKqJ,QAAQrI,GAAQhB,KAAKoL,kBAAkBN,EAAUrD,IAI1D1H,cAAc0H,EAAMC,GAElB,IAAK,IAAIJ,EAAI,EAAGA,EAAItH,KAAK2J,cAAc7D,OAAQwB,IAC/C,CACE,MAAMkD,EAAexK,KAAK2J,cAAcrC,GAAGkD,aACvCvE,GAAMoF,QAAQb,EAAc/C,EAAMC,KAEpC/D,QAAQ2H,IAAI,eAAiBtL,KAAK2J,cAAcrC,GAAGmD,OAAOc,YAAYvK,KAAO,OAAUhB,KAAK2J,cAAcrC,GAAGkD,cAC7GxK,KAAK2J,cAAcrC,GAAGmD,OAAOe,YAKnCzL,kBAAkB+K,EAAUP,GAI1B,OAFAvK,KAAK8J,MAAQ9J,KAAKiL,gBAAgBV,EAAMO,EAASrD,KAAMqD,EAASpD,IAEzDoD,EAASJ,aAAaM,SAAS/E,GAAMkD,MAAMnJ,KAAK8J,MAAO,EAAG,IAGnE/J,cAAc0L,GAEZ,OAAOzL,KAAK+J,SAAS0B,GAGvB1L,qBAAqB0L,GAEnB,IAAK,IAAInE,EAAI,EAAGA,EAAItH,KAAK+J,SAAS0B,GAAc3F,OAAQwB,IACxD,CAGE,GAFiBtH,KAAK+J,SAAS0B,GAAcnE,GAEhCoD,aAAagB,QAExB,OAAO,EAIX,OAAO,EAGT3L,gBAAgB6F,EACdM,EACAC,GAEA,OAAOF,GAAM0F,UAAW/F,EAAQM,IAA2BC,EAAuBD,KAAqC,GAGzHnG,uBAAuB0L,EAAclB,GAEnC,IAAIqB,EAEJ,MAAMhB,EAAY5K,KAAK+J,SAAS0B,GAEhC,IAAK,IAAInE,EAAI,EAAGA,EAAIsD,EAAU9E,OAAQwB,IACtC,CACE,MAAMwD,EAAWF,EAAUtD,GAE3B,GAAIiD,GAAQO,EAASrD,MAAQ8C,GAAQO,EAASpD,GAG5C,OADAkE,EAAUd,EACHc,EAIX,IAAItF,EAAMuF,EAAAA,EAEV,IAAK,IAAIvE,EAAI,EAAGA,EAAIsD,EAAU9E,OAAQwB,IACtC,CACE,MAAMwD,EAAWF,EAAUtD,GACrBwE,EAAWlF,KAAKqB,IAAI6C,EAASpD,GAAK6C,GAEpCuB,EAAWxF,IAEbsF,EAAUd,EACVxE,EAAMwF,GAIV,OAAOF,EAGT7L,uBAEE,MAEMgM,EAFa,IAAIC,gBAAgB7L,OAAO8L,SAASC,QAEfzG,IAAI,wBAE5C,OAAIsG,EAEK1J,OAAO0J,GAIP,GC7Qb,MAAMI,GAEJpM,eAGAA,cAAcmI,GAEZ,OAAOA,EAGTnI,kBAAkBmI,GAEhB,OAAO,EAAItB,KAAKqB,IAAS,EAAJC,IAAmB,GAG1CnI,oBAAoBmI,GAElB,OAAO,EAAItB,KAAKwF,IAAQ,UAAJlE,EAAgB,GAGtCnI,qBAAqBmI,GAEnB,OAAOtB,KAAKyF,IAAQ,UAAJnE,EAAgB,GAGlCnI,wBAAwBmI,GAEtB,QAAStB,KAAKwF,IAAI,UAAYlE,GAAK,GAAK,EAG1CnI,qBAAqBmI,GAEnB,OAAOA,EAAIA,EAAIA,EAGjBnI,sBAAsBmI,GAEpB,OAAO,EAAItB,KAAK0F,IAAI,EAAIpE,EAAG,GAG7BnI,yBAAyBmI,GAEvB,OAAOA,EAAI,GACP,EAAIA,EAAIA,EAAIA,EACZ,EAAItB,KAAK0F,KAAK,EAAIpE,EAAI,EAAG,GAAK,EAGpCnI,oBAAoBmI,GAElB,OAAOA,EAAIA,EAGbnI,qBAAqBmI,GAEnB,OAAO,GAAK,EAAIA,IAAM,EAAIA,GAG5BnI,wBAAwBmI,GAEtB,OAAOA,EAAI,GACP,EAAIA,EAAIA,EACR,EAAItB,KAAK0F,KAAK,EAAIpE,EAAI,EAAG,GAAK,EAGpCnI,qBAAqBmI,GAEnB,OAAOA,EAAIA,EAAIA,EAAIA,EAGrBnI,sBAAsBmI,GAEpB,OAAO,EAAItB,KAAK0F,IAAI,EAAIpE,EAAG,GAG7BnI,yBAAyBmI,GAEvB,OAAOA,EAAI,GACP,EAAIA,EAAIA,EAAIA,EAAIA,EAChB,EAAItB,KAAK0F,KAAK,EAAIpE,EAAI,EAAG,GAAK,EAGpCnI,qBAAqBmI,GAEnB,OAAOA,EAAIA,EAAIA,EAAIA,EAAIA,EAGzBnI,sBAAsBmI,GAEpB,OAAO,EAAItB,KAAK0F,IAAI,EAAIpE,EAAG,GAG7BnI,yBAAyBmI,GAEvB,OAAOA,EAAI,GACP,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EACrB,EAAItB,KAAK0F,KAAK,EAAIpE,EAAI,EAAG,GAAK,EAGpCnI,oBAAoBmI,GAElB,OAAa,IAANA,EAAU,EAAItB,KAAK0F,IAAI,EAAG,GAAKpE,EAAI,IAG5CnI,qBAAqBmI,GAEnB,OAAa,IAANA,EAAU,EAAI,EAAItB,KAAK0F,IAAI,GAAI,GAAKpE,GAG7CnI,wBAAwBmI,GAEtB,OAAa,IAANA,EACH,EACM,IAANA,EACE,EACAA,EAAI,GACFtB,KAAK0F,IAAI,EAAG,GAAKpE,EAAI,IAAM,GAC1B,EAAItB,KAAK0F,IAAI,GAAI,GAAKpE,EAAI,KAAO,EAG5CnI,oBAAoBmI,GAElB,OAAO,EAAItB,KAAK2F,KAAK,EAAI3F,KAAK0F,IAAIpE,EAAG,IAGvCnI,qBAAqBmI,GAEnB,OAAOtB,KAAK2F,KAAK,EAAI3F,KAAK0F,IAAIpE,EAAI,EAAG,IAGvCnI,wBAAwBmI,GAEtB,OAAOA,EAAI,IACN,EAAItB,KAAK2F,KAAK,EAAI3F,KAAK0F,IAAI,EAAIpE,EAAG,KAAO,GACzCtB,KAAK2F,KAAK,EAAI3F,KAAK0F,KAAK,EAAIpE,EAAI,EAAG,IAAM,GAAK,EAGrDnI,oBAAoBmI,GAElB,OAAO,OAASA,EAAIA,EAAIA,EAAI,OAASA,EAAIA,EAG3CnI,qBAAqBmI,GAEnB,OAAO,EAAI,OAAStB,KAAK0F,IAAIpE,EAAI,EAAG,GAAK,OAAStB,KAAK0F,IAAIpE,EAAI,EAAG,GAGpEnI,wBAAwBmI,GAEtB,OAAOA,EAAI,GACNtB,KAAK0F,IAAI,EAAIpE,EAAG,IAAM,SAAsBA,EAAI,WAAc,GAC9DtB,KAAK0F,IAAI,EAAIpE,EAAI,EAAG,IAAM,WAAuB,EAAJA,EAAQ,GAAK,WAAa,GAAK,EAGnFnI,uBAAuBmI,GAErB,MAAMsE,EAAM,EAAI5F,KAAK2B,GAAM,EAE3B,OAAa,IAANL,EACH,EACM,IAANA,EACE,GACCtB,KAAK0F,IAAI,EAAG,GAAKpE,EAAI,IAAMtB,KAAKyF,KAAS,GAAJnE,EAAS,OAASsE,GAGhEzM,wBAAwBmI,GAEtB,OAAa,IAANA,EACH,EACM,IAANA,EACE,EACAtB,KAAK0F,IAAI,GAAI,GAAKpE,GAAKtB,KAAKyF,IAAsB,UAAb,GAAJnE,EAAS,MAAqB,EAGvEnI,2BAA2BmI,GAEzB,OAAa,IAANA,EACH,EACM,IAANA,EACE,EACAA,EAAI,IACAtB,KAAK0F,IAAI,EAAG,GAAKpE,EAAI,IAAMtB,KAAKyF,IAAwB,WAAnB,GAAKnE,EAAI,SAAwB,EACxEtB,KAAK0F,IAAI,GAAI,GAAKpE,EAAI,IAAMtB,KAAKyF,IAAwB,WAAnB,GAAKnE,EAAI,SAAuB,EAAI,EAGpFnI,sBAAsBmI,GAEpB,OAAO,EAAIlI,KAAKyM,gBAAgB,EAAIvE,GAGtCnI,uBAAuBmI,GAErB,MAAMwE,EAAK,OACLC,EAAK,KAEX,OAAIzE,EAAI,EAAIyE,EAEHD,EAAKxE,EAAIA,EAETA,EAAI,EAAIyE,EAERD,GAAMxE,GAAK,IAAMyE,GAAMzE,EAAI,IAE3BA,EAAI,IAAMyE,EAEVD,GAAMxE,GAAK,KAAOyE,GAAMzE,EAAI,MAI5BwE,GAAMxE,GAAK,MAAQyE,GAAMzE,EAAI,QAIxCnI,0BAA0BmI,GAExB,OAAOA,EAAI,IACN,EAAIlI,KAAKyM,gBAAgB,EAAI,EAAIvE,IAAM,GACvC,EAAIlI,KAAKyM,gBAAgB,EAAIvE,EAAI,IAAM,EAG9CnI,iBAAiB6H,GAEf,OAAO,EAAMhB,KAAK0F,IAAI1F,KAAKqB,IAAIrB,KAAKyF,IAAIzE,EAAI,IAAO,IAAQhB,KAAKgG,KAAKhG,KAAKyF,IAAIzE,IAAMhB,KAAKyF,IAAIzE,EAAI,IAAM,GAAO,IC3NlH,MAAMiF,GAEJ9M,YAAYmL,EAAkB,UAE5BlL,KAAKkL,qBAAkBlH,EAIrBhE,KAAKkL,gBAFwB,iBAApBA,EAEciB,GAAgBjB,GAIhBA,EAI3BnL,OAAOsJ,EAASzB,KCflB,MAAMkF,WAA2BD,GAE/B9M,YAAY8K,EAAgBpD,EAAO,EAAGC,EAAK,EAAGgE,GAAU,EAAOR,EAAkB,UAE/E6B,MAAM7B,GAENlL,KAAK6K,eAAiBA,EACtB7K,KAAKyH,KAAOA,EACZzH,KAAK0H,GAAKA,EACV1H,KAAK0L,QAAUA,EAGjB3L,OAAOsJ,EAASzB,GAEdyB,EAAQrJ,KAAK6K,gBAAkB5E,GAAM6B,KAAK9H,KAAKyH,KAAMzH,KAAK0H,GAAI1H,KAAKkL,gBAAgBtD,IAGrF7H,SAAS6H,GAEP,OAAO3B,GAAM6B,KAAK9H,KAAKyH,KAAMzH,KAAK0H,GAAI1H,KAAKkL,gBAAgBtD,KCT1D,MAACoF,GAAe,IAbrB,MAEEjN,cAEEC,KAAKiN,SAAMjJ,EAGbjE,QAAQkN,GAENjN,KAAKiN,IAAMA,ICPf,MAAMC,GAEJnN,YAAYiB,EAAMqD,EAAQ8I,GAExBnN,KAAKgB,KAAOA,EACZhB,KAAKqE,OAASA,EACdrE,KAAKmN,KAAOA,EAGdpN,UAEEqN,GAAYH,IAAIjN,KAAKgB,MAAMhB,KAAKqE,WAAWrE,KAAKmN,KAAK7K,MAAM,OCb/D,MAAM+K,GAEJtN,eAKAA,MAAMuN,GAEJ,MAEMC,GAFM,IAAIC,WAAYC,gBAAgBH,EAAc,YAE9BI,iBAAiB,cAEvCC,EAAmB,GACnBC,EAAW,GAEjB,IAAK,IAAItG,EAAI,EAAGA,EAAIiG,EAAgBzH,OAAQwB,IAC5C,CACE,MAAMuG,EAAON,EAAgBjG,GACvBwG,EAAcD,EAAKE,cACnB/H,EAAO8H,EAAYE,aAAa,SAIhCvG,EAFQzH,KAAKiO,oBAAoBJ,GAElB,IACf1D,EAAW+D,WAAWL,EAAKG,aAAa,UAAY,IAG1D,GAAIF,EAAYE,aAAa,SAASG,SAAS,YAC/C,CACE,MAAMC,EAAapI,EAAK1D,MAAM,KACxB+L,EAAeD,EAAW,GAC1BE,EAAiBF,EAAW,GAElCR,EAASpG,KAAK,CACZxG,KAAMqN,EACNhK,OAAQiK,EACRC,QAAS9G,EAAkB,GAAX0C,IAOpB,GAHsB2D,EAAYE,aAAa,SAASG,SAAS,gBAC3CL,EAAYE,aAAa,SAASG,SAAS,UAEnC,KAATnI,IAAgBA,EAAKmI,SAAS,KACnD,CACE,MAAMC,EAAapI,EAAK1D,MAAM,KAExBuI,EAAiBuD,EAAW,GAE5BI,EAAaJ,EAAW,GAAG9L,MAAM,MACjCmM,EAAWP,WAAWM,EAAW,IACjCtD,EAAkBsD,EAAW,GAET,IAAtBJ,EAAWtI,QAEbnC,QAAQG,MAAM,4BAA6BkC,GAGnB,IAAtBwI,EAAW1I,QAEbnC,QAAQG,MAAM,4BAA6BkC,GAG7C2H,EAAiBnG,KAAK,CACpBqD,eAAgBA,EAChB6D,UAAWjH,EACXkH,QAASlH,EAAO0C,EAChBsE,SAAUA,EACVvD,gBAAiBA,KASvB,OAJAyC,EAAiBiB,MAAK,CAACC,EAAG7H,IAEjB6H,EAAEH,UAAY1H,EAAE0H,YAElB,CACLf,iBAAkBA,EAClBC,SAAUA,GAId7N,oBAAoB8N,GAElB,MAAMiB,EAAQjB,EAAKG,aAAa,KAChC,OAAiB,OAAVc,EAAiB,EAAIZ,WAAWY,IClF3C,MAAMC,GAEJhP,YAAYiP,GAEVhP,KAAKgP,mBAAqBA,EAG5BjP,qBAAqBkP,EAAgBC,EAAiBtF,GAEpDA,EAAkBA,GAAmB5J,KAAKgP,mBAC1C,MAAMG,EAASF,EAAetB,iBACxBC,EAAWqB,EAAerB,SAE1BwB,EAAiBpP,KAAKqP,gBAAgBrP,KAAKgP,mBAAoBhP,KAAKsP,iBAAiBL,EAAetB,mBAE1G,IAAK,IAAIrG,EAAI,EAAGA,EAAI8H,EAAetJ,OAAQwB,SAEmDtD,IAAxFmL,EAAOI,MAAKC,GAAWA,EAAQ3E,iBAAmBuE,EAAe9H,GAAGuD,kBAEtEsE,EAAO3H,KAAK4H,EAAe9H,IAI/B,MAAMmI,EAAY,IAAIrG,GAAgB8F,GAEtC,IAAK,IAAI5H,EAAI,EAAGA,EAAI6H,EAAOrJ,OAAQwB,IACnC,CACE,MAAMM,EAAIuH,EAAO7H,GACXoD,EAAe,IAAIoC,GACvBlF,EAAEiD,eACFqE,EAAgBtH,EAAEiD,gBAClBjD,EAAE6G,SACF7G,EAAE8D,QACF9D,EAAEsD,iBAGJuE,EAAUC,wBAAwB9H,EAAE8G,UAAW9G,EAAE+G,QAASjE,GAAc,GAG1E,IAAK,IAAIpD,EAAI,EAAGA,EAAIsG,EAAS9H,OAAQwB,IACrC,CACE,MAAMM,EAAIgG,EAAStG,GACbqI,EAAe,IAAIzC,GAAYtF,EAAE5G,KAAM4G,EAAEvD,OAAQuD,EAAEuF,MACzDsC,EAAUG,iBAAiBhI,EAAE2G,QAASoB,GAGxC,OAAOF,EAGT1P,gBAAgB8P,EAAOC,GAErB,MAAMX,EAAS,GAETjF,EAAOD,OAAOC,KAAK2F,GAEzB,IAAK,IAAIvI,EAAI,EAAGA,EAAI4C,EAAKpE,OAAQwB,IAE/B6H,EAAO3H,KAAK,CACVqD,eAAgBX,EAAK5C,GACrBoH,UAAW,EACXC,QAASmB,EAAe,EAAIA,EAAe,EAC3CrB,SAAUoB,EAAM3F,EAAK5C,IACrBoE,SAAS,EACTR,gBAAiB,sBAIrB,OAAOiE,EAGTpP,aAAagQ,EAAK1G,GAEhB,MAAM2G,GAAkB,IAAK3C,IAAwBxK,MAAMkN,GACrDZ,EAASa,EAAgBrC,iBACzBC,EAAWoC,EAAgBpC,SAC3B6B,EAAY,IAAIrG,GAAgBC,GAEtC,IAAK,IAAI/B,EAAI,EAAGA,EAAI6H,EAAOrJ,OAAQwB,IACnC,CACE,MAAMM,EAAIuH,EAAO7H,GACXoD,EAAe,IAAIoC,GACvBlF,EAAEiD,eACFxB,EAAQzB,EAAEiD,gBACVjD,EAAE6G,SACF7G,EAAE8D,QACF9D,EAAEsD,iBAGJuE,EAAUC,wBAAwB9H,EAAE8G,UAAW9G,EAAE+G,QAASjE,GAAc,GAG1E,IAAK,IAAIpD,EAAI,EAAGA,EAAIsG,EAAS9H,OAAQwB,IACrC,CACE,MAAMM,EAAIgG,EAAStG,GACbqI,EAAe,IAAIzC,GAAYtF,EAAE5G,KAAM4G,EAAEvD,QAC/CoL,EAAUG,iBAAiBhI,EAAE2G,QAASoB,GAGxC,OAAOF,EAGT1P,iBAAiBoP,GAEf,IAAIW,GAAgB,EAEpB,IAAK,IAAIxI,EAAI,EAAGA,EAAI6H,EAAOrJ,OAAQwB,IACnC,CACE,MAEM2I,EAFQd,EAAO7H,GAEIqH,QAEzBmB,EAAeG,EAAaH,EAAeG,EAAaH,EAG1D,OAAOA,GC8BN,MAACI,GAAgB,IArJtB,MAEEnQ,OAEEC,KAAKmQ,MAAQ,GAEbnQ,KAAKoQ,iBAA6B,eAClCpQ,KAAKqQ,iBAA6B,gBAClCrQ,KAAKsQ,mBAA6B,iBAClCtQ,KAAKuQ,eAA6B,iBAElCvQ,KAAKwQ,uBAA6B,yBAClCxQ,KAAKyQ,eAA6B,iBAClCzQ,KAAK0Q,0BAA6B,wBAElC1Q,KAAK2Q,oBAA6B,kBAClC3Q,KAAK4Q,oBAA6B,kBAClC5Q,KAAK6Q,qBAA6B,wBAElC7Q,KAAK8Q,kBAA6B,gBAElC9Q,KAAK+Q,0BAA6B,4BAClC/Q,KAAKgR,yBAA6B,2BAElChR,KAAKiR,yBAA6B,2BAClCjR,KAAKkR,wBAA6B,0BAElClR,KAAKmR,4BAA+B,8BACpCnR,KAAKoR,2BAA+B,6BAEpCpR,KAAKqR,kBAAoB,gBAG3BtR,KAAKuR,EAAOC,GAEV,MAAMpB,EAAQnQ,KAAKmQ,MAAMmB,GAEzB,QAActN,IAAVmM,EAEF,OAEF,IAAI7I,EAAI6I,EAAMrK,OACd,KAAOwB,KAEL6I,EAAM7I,GAAGiK,GAIbxR,GAAGuR,EAAOE,QAEyB,IAAtBxR,KAAKmQ,MAAMmB,KAEpBtR,KAAKmQ,MAAMmB,GAAS,IAGtBtR,KAAKmQ,MAAMmB,GAAO9J,KAAKgK,GAGzBzR,kBAAkB0R,GAEhBzR,KAAK0R,KAAK1R,KAAKoQ,iBAAkBqB,GAGnC1R,oBAAoB4R,GAElB3R,KAAK0R,KAAK1R,KAAKqQ,iBAAkBsB,GAGnC5R,oBAAoB6R,GAElB5R,KAAK0R,KAAK1R,KAAKsQ,mBAAoBsB,GAGrC7R,sBAEEC,KAAK0R,KAAK1R,KAAKuQ,gBAGjBxQ,4BAA4B8R,GAE1B7R,KAAK0R,KAAK1R,KAAKwQ,uBAAwBqB,GAGzC9R,sBAEEC,KAAK0R,KAAK1R,KAAKyQ,gBAGjB1Q,mBAAmB+R,GAEjB9R,KAAK0R,KAAK1R,KAAKqR,kBAAmBS,GAGpC/R,2BAA2B4R,GAEzB3R,KAAK0R,KAAK1R,KAAK0Q,0BAA2BiB,GAG5C5R,qBAAqBgS,GAEnB/R,KAAK0R,KAAK1R,KAAK2Q,oBAAqBoB,GAGtChS,qBAAqBiS,GAEnBhS,KAAK0R,KAAK1R,KAAK4Q,oBAAqBoB,GAGtCjS,2BAA2BkS,GAEzBjS,KAAK0R,KAAK1R,KAAK6Q,qBAAsBoB,GAGvClS,oBAAoBmS,GAElBlS,KAAK0R,KAAK1R,KAAK8Q,kBAAmBoB,GAGpCnS,+BAA+B8P,GAE7B7P,KAAK0R,KAAK1R,KAAK+Q,0BAA2BlB,GAG5C9P,8BAA8B8P,GAE5B7P,KAAK0R,KAAK1R,KAAKgR,yBAA0BnB,GAG3C9P,8BAA8B8P,GAE5B7P,KAAK0R,KAAK1R,KAAKiR,yBAA0BpB,GAG3C9P,6BAA6B8P,GAE3B7P,KAAK0R,KAAK1R,KAAKkR,wBAAyBrB,GAG1C9P,iCAAiC8P,GAE/B7P,KAAK0R,KAAK1R,KAAKmR,4BAA6BtB,GAG9C9P,gCAAgC8P,GAE9B7P,KAAK0R,KAAK1R,KAAKoR,2BAA4BvB,KC3G1C,MAAC9L,GAAqB,IApC3B,MAEEhE,OAEEC,KAAKmS,UAAY,GACjBnS,KAAKiE,iBAAmB,GAG1BlE,aAAaiB,EAAMiC,EAAK8O,GAET9H,OAAOC,KAAKlK,KAAKiE,kBAErBkK,SAASlL,GAEhBjD,KAAKmS,UAAUnR,GAAQhB,KAAKiE,iBAAiBhB,IAI7CjD,KAAKmS,UAAUnR,GAAQ+Q,EACvB/R,KAAKiE,iBAAiBhB,GAAO8O,GAG/BK,GAAaC,qBAAqB,CAAErR,KAAMA,EAAM4E,MAAOmM,IAGzDhS,aAAaiB,GAEX,OAAOhB,KAAKmS,UAAUnR,GAGxBjB,IAAIiB,GAEF,OAAOhB,KAAKmS,UAAUnR,KClC1B,MAAMsR,GAEJvS,mBAAmBwS,GAEjB,MAAMC,EAASD,EAAU7E,iBAAiB,OAE1C,IAAK,IAAIpG,EAAI,EAAGA,EAAIkL,EAAO1M,OAAQwB,IACnC,CACE,MAAMmL,EAAQD,EAAOlL,GAEjBmL,EAAMC,QAAQC,MAEhBF,EAAME,IAAMF,EAAMC,QAAQC,KAI9B,MAAMC,EAAgBL,EAAU7E,iBAAiB,UAEjD,IAAK,IAAIpG,EAAI,EAAGA,EAAIsL,EAAc9M,OAAQwB,IAC1C,CACE,MAAMuL,EAAeD,EAActL,GAE/BuL,EAAaH,QAAQC,MAEvBE,EAAa7M,KAAO6M,EAAaH,QAAQC,MAK/C5S,mBAAmBwS,GAEjB,MAAMO,EAASP,EAAU7E,iBAAiB,SAE1C,IAAK,IAAIpG,EAAI,EAAGA,EAAIwL,EAAOhN,OAAQwB,IACnC,CACE,MAAMyL,EAAQD,EAAOxL,GAEjByL,EAAML,QAAQC,MAEhBI,EAAMJ,IAAMI,EAAML,QAAQC,MAKhC5S,oBAAoBwS,GAElB,MAAMS,EAAUT,EAAU7E,iBAAiB,UAE3C,IAAK,IAAIpG,EAAI,EAAGA,EAAI0L,EAAQlN,OAAQwB,IACpC,CACE,MAAM2L,EAASD,EAAQ1L,GAEnB2L,EAAOP,QAAQC,MAEjBM,EAAON,IAAMM,EAAOP,QAAQC,MAKlC5S,qBAAqBwS,EAAWW,GAE9B,MAAMrL,EAAW0K,EAAU7E,iBAAiBwF,GAE5C,IAAK,IAAI5L,EAAI,EAAGA,EAAIO,EAAS/B,OAAQwB,IACrC,CACE,MAAMkI,EAAU3H,EAASP,GAErBkI,EAAQkD,QAAQC,MAElBnD,EAAQmD,IAAMnD,EAAQkD,QAAQC,OCnEtC,MAAMQ,GAEJpT,cAEEC,KAAKoT,YAAc,GACnBpT,KAAKgP,mBAAqB,GAG5BjP,IAAIsT,EAAiBC,EAAepE,GAElC,IAAK,IAAI5H,EAAI,EAAGA,EAAItH,KAAKoT,YAAYtN,OAAQwB,IAE3C,GAAItH,KAAKoT,YAAY9L,GAAGG,OAAS4L,GAAmBrT,KAAKoT,YAAY9L,GAAGI,KAAO4L,EAC/E,CAEE,OADyB,IAAIvE,GAAuB/O,KAAKgP,oBAAoBuE,qBAAqBvT,KAAKoT,YAAY9L,GAAGtB,KAAMkJ,GAKhI,IAAK,IAAI5H,EAAI,EAAGA,EAAItH,KAAKoT,YAAYtN,OAAQwB,IAE3C,GAAItH,KAAKoT,YAAY9L,GAAGI,KAAO4L,QAA8CtP,IAA7BhE,KAAKoT,YAAY9L,GAAGG,KACpE,CAEE,OADyB,IAAIsH,GAAuB/O,KAAKgP,oBAAoBuE,qBAAqBvT,KAAKoT,YAAY9L,GAAGtB,KAAMkJ,GAKhIvL,QAAQG,MAAM,0CAA2CuP,EAAiBC,GAI5EvT,gBAAgBqT,GAEd,IAAK,IAAI9L,EAAI,EAAGA,EAAI8L,EAAYtN,OAAQwB,IAEtCtH,KAAKoT,YAAY5L,KAAK4L,EAAY9L,IAItCvH,gBAAgBqT,GAEdpT,KAAKoT,YAAcA,EAGrBrT,uBAAuBiP,GAErBhP,KAAKgP,mBAAqBA,GC2CzB,MAACzE,GAAO,IAzFb,MAEExK,cAEEC,KAAKwT,eAAiB,CAAC,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,MAGxFzT,OAEEC,KAAKyT,QAAU,IAAIC,EACnB1T,KAAK2T,aAAe,EACpB3T,KAAK4T,oBAAsB,EAC3B5T,KAAK6T,eAAiB,EACtB7T,KAAK8T,iBAAmB,IAAIC,EAAQ,EAAG,GACvC/T,KAAKgU,wBAA0B,EAC/BhU,KAAKiU,iBAAmB,EAAI,GAG9B1K,mBAEE,OAAOvJ,KAAK6T,eAGdvJ,iBAEE,OAAOtK,KAAK2T,aAGdO,wBAEE,OAAOlU,KAAK4T,oBAGdO,kBAIE,OAFAnU,KAAK8T,iBAAiB5L,EAAIlI,KAAKsK,WAC/BtK,KAAK8T,iBAAiB3L,EAAInI,KAAKuJ,aACvBvJ,KAAK8T,iBAGfM,0BAEE,OAAOpU,KAAKgU,wBAGdK,UAEE,OAAOrU,KAAKiU,iBAGdK,SAEE,OAAOtU,KAAKsK,WAGdiK,UAEE,OAAOvU,KAAKkU,kBAGdnU,0BAA0B6F,GAExB5F,KAAKgU,wBAA0BpO,EAGjC7F,WAEEC,KAAK2T,aAAe3T,KAAKyT,QAAQe,WACjCxU,KAAK6T,eAAiB7T,KAAKyT,QAAQgB,iBAEnCzU,KAAKwT,eAAekB,QACpB1U,KAAKwT,eAAehM,KAAKxH,KAAKsK,WAAa,IAAOtK,KAAKsK,WAAa,MAEpEtK,KAAK2U,gCAGP5U,gCAEEC,KAAK4T,oBAAsB,EAE3B,IAAK,IAAItM,EAAI,EAAGA,EAAItH,KAAKwT,eAAe1N,OAAQwB,IAE9CtH,KAAK4T,qBAAuB5T,KAAKwT,eAAelM,GAGlDtH,KAAK4T,oBAAsB5T,KAAK4T,oBAAsB5T,KAAKwT,eAAe1N,SCxF9E,MAAM8O,GAEJ7U,YAAYiB,GAEVhB,KAAKgB,KAAOA,EAGdjB,SAIAA,QAIAA,QAIAA,gBAIAA,YAIAA,iBAIAA,UAIAA,gBAIAA,wBAAwB8U,EAAkBC,EAAqBC,GAG7D/U,KAAKgV,kBAAkBH,EAAkBC,EAAqBC,GAGhEhV,uBAAuB8U,EAAkBC,EAAqBC,IAK9DhV,kBAAkB8U,EAAkBC,EAAqBC,IAIzDhV,eAIAA,YCvDF,MAAMkV,GAEJlV,YAAYmV,GAEVlV,KAAKmV,WAAa,IAAIP,GACtB5U,KAAKoV,cAAgB,IAAIR,GAEzB5U,KAAKgP,mBAAqB,GAC1BhP,KAAKqV,mBAAqB,GAE1BrV,KAAKkV,iBAAmBA,EAExBlV,KAAKsV,eAAgB,EAGvBvV,YAAY8P,EAAO0F,GAAO,GAEpBvV,KAAKsV,eAEPtV,KAAKwV,oBAGPxV,KAAKmV,WAAanV,KAAKoV,cACvBpV,KAAKoV,cAAgBvF,EAErB7P,KAAKmV,WAAWM,cAChBzV,KAAKoV,cAAcM,OAEnB1V,KAAK+U,iBAAmB/U,KAAKkV,iBAAiBzP,IAAIzF,KAAKmV,WAAWnU,KAAMhB,KAAKoV,cAAcpU,KAAMhB,KAAKqV,oBACtGrV,KAAKoV,cAAcO,eAEnB3V,KAAK+U,iBAAiBa,OAEtB5V,KAAKsV,eAAgB,EAEjBC,IAEFvV,KAAK+U,iBAAiBQ,OACtBvV,KAAK6V,UAIT9V,SAEMC,KAAKsV,eAEPtV,KAAK8V,uBAED9V,KAAK+U,iBAAiBgB,gBAExB/V,KAAKsV,eAAgB,EAErBtV,KAAK8V,uBAEL9V,KAAKwV,oBAELxV,KAAKoV,cAAcY,aAKrBhW,KAAKoV,cAAcS,SAIvB9V,gBAEEC,KAAKoV,cAAca,gBAGrBlW,eAEEC,KAAKoV,cAAcc,eAGrBnW,UAAU8P,GAER7P,KAAKoV,cAAgBvF,EAGvB9P,uBAAuBiP,GAErB/E,OAAOkM,OAAOnW,KAAKgP,mBAAoBA,GACvC/E,OAAOkM,OAAOnW,KAAKqV,mBAAoBrG,GAGzCjP,uBAEEC,KAAK+U,iBAAiBc,OAAOO,GAAK9L,YAClCtK,KAAKmV,WAAWkB,uBAAuBrW,KAAKqV,mBAAoBrV,KAAK+U,iBAAiBuB,eAAgBtW,KAAK+U,kBAC3G/U,KAAKoV,cAAcmB,wBAAwBvW,KAAKqV,mBAAoBrV,KAAK+U,iBAAiBuB,eAAgBtW,KAAK+U,kBAGjHhV,oBAEMC,KAAKmV,WAAWnU,OAAShB,KAAKoV,cAAcpU,MAE9ChB,KAAKmV,WAAWqB,OAGlBxW,KAAKmV,WAAWsB,WC+Ff,MAACC,GAAe,IAnMrB,MAEE3W,cAEEC,KAAK2W,MAAQ,GAEb3W,KAAKkV,iBAAmB,IAAI/B,GAC5BnT,KAAK4W,mBAAqB,IAAI3B,GAA2BjV,KAAKkV,kBAE9DlV,KAAK6W,wBAA0B,GAE/B7W,KAAK8W,qBAAuB,GAG9B/W,gBAEEC,KAAK4W,mBAAmBX,gBAG1BlW,SAEEC,KAAK4W,mBAAmBf,SAExB7V,KAAK+W,wBAGPhX,eAEEC,KAAK4W,mBAAmBV,eAG1BnW,WAAWiX,EAAWC,GAAa,EAAM1B,GAAO,GAE9C,MAAM9M,EAAIzI,KAAKyF,IAAIuR,GACnBhX,KAAK4W,mBAAmBM,YAAYzO,EAAG8M,GAEnC0B,IAEFjX,KAAKmX,qBAAqB1O,EAAExF,KAC5BjD,KAAKoX,uBAAuB3O,EAAExF,MAGhCjD,KAAKqX,mBAAmBL,GAG1BjX,YAAYuX,EAAYL,GAAa,EAAO1B,GAAO,GAEjD,MAAMgC,EAAYvX,KAAKyF,IAAI6R,GACrBE,EAAkBxX,KAAKyF,IAAI,cAEjC+R,EAAgBC,cAAcF,GAC9BvX,KAAK0X,WAAWF,EAAgBxW,KAAMiW,EAAY1B,GAGpDxV,yBAAyB4X,GAEvB3X,KAAK6W,wBAAwBrP,KAAKmQ,GAGpC5X,mBAAmBiX,GAEjB,IAAK,IAAI1P,EAAI,EAAGA,EAAItH,KAAK6W,wBAAwB/Q,OAAQwB,IACzD,CACqBtH,KAAK6W,wBAAwBvP,GACrCsQ,eAAeZ,IAI9BjX,cAAc8X,GAEZ7X,KAAK2W,MAAMnP,KAAKqQ,GAGlB9X,SAASiX,GAEP,IAAK,IAAI1P,EAAI,EAAGA,EAAItH,KAAK2W,MAAM7Q,OAAQwB,IAErC,GAAItH,KAAK2W,MAAMrP,GAAGtG,OAASgW,EAEzB,OAAO,EAGX,OAAO,EAGTjX,gBAAgBqT,GAEdpT,KAAKkV,iBAAiB4C,gBAAgB1E,GAGxCrT,gBAAgBqT,GAEdpT,KAAKkV,iBAAiB6C,gBAAgB3E,GAGxCrT,SAASiX,GAEP,MAAMa,EAAO7X,KAAKyF,IAAIuR,GAEtBhX,KAAK4W,mBAAmBoB,UAAUH,GAGpC9X,yBAAyBkY,GAEvBjY,KAAK8W,qBAAuBmB,EAG9BlY,mBAEE,OAAOC,KAAK4W,mBAAmBxB,cAGjCrV,iBAAiBiX,GAEfrT,QAAQC,KAAK,2CACb5D,KAAKyF,IAAIuR,GAGXjX,IAAIiX,GAEF,IAAK,IAAI1P,EAAI,EAAGA,EAAItH,KAAK2W,MAAM7Q,OAAQwB,IAErC,GAAItH,KAAK2W,MAAMrP,GAAGtG,OAASgW,EAEzB,OAAOhX,KAAK2W,MAAMrP,GAGtB3D,QAAQG,MAAM,wCAAyCkT,GAIzDjX,gBAAgBkD,GAEdU,QAAQC,KAAK,kDACb5D,KAAKkY,WAAWjV,GAGlBlD,WAAWkD,GAET,IAAK,IAAIqE,EAAI,EAAGA,EAAItH,KAAK2W,MAAM7Q,OAAQwB,IAErC,GAAItH,KAAK2W,MAAMrP,GAAGrE,MAAQA,EAExB,OAAOjD,KAAK2W,MAAMrP,GAGtB3D,QAAQG,MAAM,+CAAgDb,GAIhElD,uBAAuBiP,GAErBhP,KAAKkV,iBAAiBiD,uBAAuBnJ,GAC7ChP,KAAK4W,mBAAmBuB,uBAAuBnJ,GAGjDjP,qBAAqBkD,GAEnB9C,OAAOiY,QAAQC,UAAU,GAAI,GAAIpV,GAGnClD,uBAAuBiB,GAErB,MAAMsX,EAAQtY,KAAKuY,aAAavX,GAEhCwX,SAASF,MAAQA,EAAQ,GAAGA,OAAWtY,KAAK8W,uBAAyB9W,KAAK8W,qBAG5E/W,wBAEE,IAAK,IAAIuH,EAAI,EAAGA,EAAItH,KAAK2W,MAAM7Q,OAAQwB,IAErCtH,KAAK2W,MAAMrP,GAAGmR,YAAYzY,KAAK4W,mBAAmBvB,oBAItDtV,aAAa2Y,GAEX,IAAIC,EAAaD,EAAOE,cAAc3W,QAAQ,IAAK,IAGnD,OAFA0W,EAAa3Y,KAAK6Y,sBAAsBF,GAEjCA,EAGT5Y,sBAAsB2Y,GAEpB,OAAOA,EAAOzW,QACZ,gBACC6W,GAAUA,EACR7W,QAAQ,IAAK,KACbA,QAAQ,IAAK,SC5LtB,MAAM8W,WAAwBnE,GAE5B7U,aAAYiB,KAAEA,EAAIiC,IAAEA,EAAGsP,UAAEA,IAEvBxF,MAAM/L,GAENhB,KAAKuS,UAAYA,EACjBvS,KAAKiD,IAAMA,EAEX,IAAI+M,EAAkBgJ,GAAkBvT,IAAI,GAAGzE,UAE/CgP,EAAkBA,GAAmB,CACnCrC,iBAAkB,GAClBC,SAAU,IAGZ,MAAMwF,EAAc,CAClB,CACE1L,GAAI1G,EACJgF,KAAMgK,IAIViJ,GAAYC,cAAclZ,MAC1BiZ,GAAYnB,gBAAgB1E,GAG9BrT,OAEEC,KAAKuS,UAAU4G,UAAUtQ,IAAI,gBAC7B7I,KAAKuS,UAAU4G,UAAUC,OAAO,eAChCpZ,KAAKuS,UAAU4G,UAAUC,OAAO,UAGlCrZ,WAEEC,KAAKuS,UAAU4G,UAAUC,OAAO,gBAChCpZ,KAAKuS,UAAU4G,UAAUC,OAAO,eAChCpZ,KAAKuS,UAAU4G,UAAUC,OAAO,UAGlCrZ,cAEEC,KAAKuS,UAAU4G,UAAUtQ,IAAI,eAC7B7I,KAAKuS,UAAU4G,UAAUC,OAAO,gBAChCpZ,KAAKuS,UAAU4G,UAAUC,OAAO,UAGlCrZ,OAEEC,KAAKuS,UAAU4G,UAAUtQ,IAAI,UAC7B7I,KAAKuS,UAAU4G,UAAUC,OAAO,gBAChCpZ,KAAKuS,UAAU4G,UAAUC,OAAO,eAGlCrZ,mBAEEuS,GAAc+G,YAAYrZ,KAAKuS,WAGjCxS,mBAEEuS,GAAcgH,YAAYtZ,KAAKuS,WAGjCxS,YAAYsV,GAEVrV,KAAKuS,UAAUgH,MAAMC,QAAUnE,EAAmB,GAAGrV,KAAKgB,iBCxE9D,MAAMyY,GAEJ1Z,iBAGAA,YAGAA,WAGAA,iBAGAA,UAGAA,gBAGAA,kBAGAA,iBAGAA,iBC1BF,MAAM2Z,GAEJ3Z,eAKAA,UAKAA,SAASsJ,EAASsQ,IAKlB5Z,QAAQsJ,EAASsQ,IAKjB5Z,UAKAA,gQCrBF,MAAM6Z,WAA2BC,EAE/B9Z,YAAY+Z,EAAMC,EAAMC,GAEtBjN,MAAM,CACJkN,aAAcH,GAAUI,GACxBC,eAAgBJ,GAAQK,GACxBJ,SAAUA,GAAc,CACtBK,OAAQ,CAAEzU,MAAO,IAAI0U,EAAM,gBCNnC,MAAMC,WAAqBV,EAEzB9Z,YAAYya,EAAaC,EAAaC,GAEpC3N,MAAM,CACJiN,SAAU,CACRW,SAAU,CAAE/U,MAAO,MACnBgV,YAAa,CAAEhV,MAAO,IAAImO,EAAQ,EAAG,IACrC8G,kBAAmB,CAAEjV,MAAO,IAAImO,EAAQ,EAAG,KAE7C2G,QAASA,GAAW,GACpBT,aAAcQ,mGACdN,eAAgBK,uHAChBM,YAAY,EACZC,SAAUC,EACVC,WAAW,EACXC,UAAWC,KCpBjB,MAAMC,WAAoBb,GAExBxa,YAAYsb,GAEVtO,gMAEA/M,KAAKga,SAASsB,WAAa,CAAE1V,WAAO5B,GAGtCjE,gBAAgBwb,GAEdvb,KAAKga,SAASsB,WAAW1V,MAAQ2V,GCVrC,MAAMC,WAAmCjB,GAEvCxa,YAAYsb,GAEVtO,m7BAAY/I,EAAW,CACrByX,SAAUJ,IAEZrb,KAAKga,SAASW,SAAkB,CAAE/U,WAAO5B,GACzChE,KAAKga,SAAS0B,YAAkB,CAAE9V,WAAO5B,GACzChE,KAAKga,SAAS2B,eAAkB,CAAE/V,MAAO,GAEzC5F,KAAKga,SAAS4B,aAAgB,CAAEhW,MAAO,MACvC5F,KAAKga,SAAS6B,aAAgB,CAAEjW,MAAO,MACvC5F,KAAKga,SAAS8B,aAAgB,CAAElW,MAAO,MACvC5F,KAAKga,SAAS+B,aAAgB,CAAEnW,MAAO,MACvC5F,KAAKga,SAASgC,aAAgB,CAAEpW,MAAO,MAEvC5F,KAAKga,SAASiC,cAAgB,CAAErW,MAAO,GACvC5F,KAAKga,SAASkC,aAAgB,CAAEtW,MAAO,CAAC,EAAK,GAAK,GAAK,GAAK,KAC5D5F,KAAKga,SAASmC,YAAgB,CAAEvW,MAAO,GAEvC,MAAMwW,EAAkB,CACtB,IAAI9B,EAAM,WACV,IAAIA,EAAM,WACV,IAAIA,EAAM,WACV,IAAIA,EAAM,WACV,IAAIA,EAAM,YAGZta,KAAKga,SAASoC,gBAAkB,CAAExW,MAAOwW,GAG3Crc,SAASsc,GAEPrc,KAAKga,SAAS4B,aAAahW,MAAQyW,EAGrCtc,SAASsc,GAEPrc,KAAKga,SAAS6B,aAAajW,MAAQyW,EAGrCtc,SAASsc,GAEPrc,KAAKga,SAAS8B,aAAalW,MAAQyW,EAGrCtc,SAASsc,GAEPrc,KAAKga,SAAS+B,aAAanW,MAAQyW,EAGrCtc,SAASsc,GAEPrc,KAAKga,SAASgC,aAAapW,MAAQyW,EAGrCtc,mBAAmB6F,GAEjB5F,KAAKga,SAASiC,cAAcrW,MAAQA,EAGtC7F,iBAAiB6F,GAEf5F,KAAKga,SAASmC,YAAYvW,MAAQA,EAGpC7F,iBAAiBuc,GAEftc,KAAKga,SAASoC,gBAAgBxW,MAAM,GAAG2W,IAAID,GAG7Cvc,iBAAiBuc,GAEftc,KAAKga,SAASoC,gBAAgBxW,MAAM,GAAG2W,IAAID,GAG7Cvc,iBAAiBuc,GAEftc,KAAKga,SAASoC,gBAAgBxW,MAAM,GAAG2W,IAAID,GAG7Cvc,iBAAiBuc,GAEftc,KAAKga,SAASoC,gBAAgBxW,MAAM,GAAG2W,IAAID,GAG7Cvc,iBAAiBuc,GAEftc,KAAKga,SAASoC,gBAAgBxW,MAAM,GAAG2W,IAAID,IChE1C,MAACE,GAAiB,IA9BvB,MAEEzc,OAEEC,KAAKyc,cAAWzY,EAEhBhE,KAAK0c,gBAAa1Y,EAGpB4H,YAAY+Q,GAEV3c,KAAKyc,SAAWE,EAGlB/Q,cAEE,OAAO5L,KAAKyc,SAGdG,cAAcD,GAEZ3c,KAAK0c,WAAaC,EAGpBC,gBAEE,OAAO5c,KAAK0c,aChBX,MAACG,GAAe,IAVrB,MAEE9c,OAEEC,KAAK8c,eAAiB,EACtB9c,KAAK+c,kCAAmC,EACxC/c,KAAKgd,uBAAwB,ICAjC,MAAMC,GAEJld,YAAYmd,GAEVld,KAAKkd,kBAAoBA,EACzBld,KAAKmd,aAAe,KAEpBnd,KAAKod,OAAS5E,SAAS6E,cAAc,UACrCrd,KAAKsd,IAAMtd,KAAKod,OAAOG,WAAW,MAGpCxd,cAAcyd,EAAY,SAExB,GAAyB,MAArBxd,KAAKmd,cAAwBnd,KAAKkd,kBACtC,CACE,MAAM7X,EAAOmT,SAASiF,qBAAqB,QAAQ,GAC7CC,EAAQlF,SAAS6E,cAAc,OAC/BM,EAAYnF,SAASoF,eAAe,eAC1CF,EAAMG,YAAYF,GAClBD,EAAMI,aAAa,QAAS,QAAQN,oCACpCnY,EAAKwY,YAAYH,GACjB1d,KAAKmd,aAAeO,EAAMK,aAC1B1Y,EAAK2Y,YAAYN,GAEnB,OAAO1d,KAAKmd,aAGdpd,cAAcke,EAAMC,EAAO,cAEzB,MAAMhb,EAAO,IAAI6Q,EAIjB,OAHA/T,KAAKsd,IAAIY,KAAOA,EAChBhb,EAAKgF,EAAItB,KAAKuX,KAAKne,KAAKsd,IAAIc,YAAYH,GAAMI,OAC9Cnb,EAAKiF,EAAIvB,KAAKuX,KAAKne,KAAKse,cAAcJ,IAC/Bhb,EAGTnD,YAAYke,EAAMM,EAAa,IAM7B,OAJAA,EAAWL,KAAOK,EAAWL,MAAQ,aACrCK,EAAWC,WAAaD,EAAWC,YAAc,UAEjDxe,KAAKye,OAAOR,EAAMM,EAAYve,KAAKod,OAAQpd,KAAKsd,KACzCtd,KAAKod,OAGdrd,gBAAgBke,EAAMM,GAEpB,MAAMnB,EAASpd,KAAK0e,YAAYT,EAAMM,GAChCI,EAAiB,IAAIC,EAAcxB,EAAQyB,EAC/CC,EACAA,EACAC,EACAA,GAIF,OAHAJ,EAAeK,iBAAkB,EACjCL,EAAeM,aAAc,EAEtBN,EAGT5e,OAAOke,EAAMM,IAGbxe,UAAUud,EAAKpV,EAAGC,EAAGkW,EAAOa,EAAQC,EAAQC,EAAMC,GAUhD,QARsB,IAAXA,IAETA,GAAS,QAEW,IAAXF,IAETA,EAAS,GAEW,iBAAXA,EAETA,EAAS,CAAEG,GAAIH,EAAQI,GAAIJ,EAAQK,GAAIL,EAAQM,GAAIN,OAGrD,CACE,MAAMO,EAAgB,CAAEJ,GAAI,EAAGC,GAAI,EAAGC,GAAI,EAAGC,GAAI,GACjD,IAAK,MAAME,KAAQD,EAEjBP,EAAOQ,GAAQR,EAAOQ,IAASD,EAAcC,GAGjDrC,EAAIsC,YACJtC,EAAIuC,OAAO3X,EAAIiX,EAAOG,GAAInX,GAC1BmV,EAAIwC,OAAO5X,EAAImW,EAAQc,EAAOI,GAAIpX,GAClCmV,EAAIyC,iBAAiB7X,EAAImW,EAAOlW,EAAGD,EAAImW,EAAOlW,EAAIgX,EAAOI,IACzDjC,EAAIwC,OAAO5X,EAAImW,EAAOlW,EAAI+W,EAASC,EAAOK,IAC1ClC,EAAIyC,iBAAiB7X,EAAImW,EAAOlW,EAAI+W,EAAQhX,EAAImW,EAAQc,EAAOK,GAAIrX,EAAI+W,GACvE5B,EAAIwC,OAAO5X,EAAIiX,EAAOM,GAAItX,EAAI+W,GAC9B5B,EAAIyC,iBAAiB7X,EAAGC,EAAI+W,EAAQhX,EAAGC,EAAI+W,EAASC,EAAOM,IAC3DnC,EAAIwC,OAAO5X,EAAGC,EAAIgX,EAAOG,IACzBhC,EAAIyC,iBAAiB7X,EAAGC,EAAGD,EAAIiX,EAAOG,GAAInX,GAC1CmV,EAAI0C,YACAZ,GAEF9B,EAAI8B,OAEFC,GAEF/B,EAAI+B,UCtFL,MAACY,GAAgB,IAftB,MAEElgB,KAAKmgB,EAAa,IAEhBlgB,KAAKmgB,IAAM,EAEXngB,KAAKiN,IAAO,GAGdlN,UAAUqgB,MCfZ,MAAMC,GAEJtgB,eAIAugB,mBAEE,OAAO,EAGTvgB,SAAS8X,IAKT9X,OAAO8X,IAIP9X,QAAQ8X,KChBV,MAAM0I,GAEJxgB,cAEEC,KAAK4H,EAAI,EACT5H,KAAKwgB,kBAAoB,EAG3BF,mBAEE,OAAO,EAGTvgB,SAAS0gB,IAIT1gB,OAAO0gB,GAELzgB,KAAK4H,GAAKwO,GAAK9L,WAAamW,EAAStW,SAErCnK,KAAKwgB,kBAAoBC,EAASvV,gBAAgBlL,KAAK4H,GACvD5H,KAAKwgB,kBAAoBva,GAAMkD,MAAMnJ,KAAKwgB,kBAAmB,EAAG,GAEhEC,EAASC,mBAAmBza,GAAM6B,KAAK2Y,EAAShZ,KAAMgZ,EAAS/Y,GAAI1H,KAAKwgB,oBAEpExgB,KAAKwgB,mBAAqB,QAE5BC,EAASC,mBAAmBD,EAAS/Y,IAErC+Y,EAASE,kBAAkB,IAAIN,IAC/BI,EAASG,kBAAkBH,IAI/B1gB,QAAQ8X,KCnCV,MAAMgJ,GAEJ9gB,aAAYyP,QACVA,EAAOsR,aACPA,EAAYrZ,KACZA,EAAO,EAACC,GACRA,EAAK,EAACyC,SACNA,EAAW,EAAC4W,aACZA,EAAe,GAAEC,aACjBA,EAAgB,GAAE9V,gBAClBA,EAAkBiB,GAAgB8U,kBAAiBL,kBACnDA,EAAoB,WAIpB5gB,KAAKwP,QAAUA,EACfxP,KAAK8gB,aAAeA,EACpB9gB,KAAKyH,KAAOA,EACZzH,KAAK0H,GAAKA,EACV1H,KAAK+gB,aAAeA,EACpB/gB,KAAKghB,aAAeA,EACpBhhB,KAAKmK,SAAWA,EAChBnK,KAAKkL,gBAAkBA,EACvBlL,KAAK4gB,kBAAoBA,EAEzB5gB,KAAKoV,cAAgB,IAAIiL,GAG3BtgB,UAEEC,KAAK2gB,kBAAkB,IAAIJ,IAG7BxgB,OAEEC,KAAK2gB,kBAAkB,IAAIN,IAG7BtgB,mBAAmB6F,GAEjB5F,KAAKwP,QAAQ+J,MAAMvZ,KAAK8gB,cAAgB,GAAG9gB,KAAK+gB,eAAenb,IAAQ5F,KAAKghB,eAG9EjhB,SAEEC,KAAKoV,cAAcS,OAAO7V,MAG5BsgB,mBAEE,OAAOtgB,KAAKoV,cAAckL,aAG5BvgB,kBAAkB8P,GAEhB7P,KAAKoV,cAAcqB,QAAQzW,MAC3BA,KAAKoV,cAAgBvF,EACrB7P,KAAKoV,cAAcY,SAAShW,OCrDhC,MAAMkhB,WAAmBC,EAEvBphB,YAAYqhB,EAAQ,GAElBrU,QAEA,MAAMsU,EAAc,GACpBA,EAAY7Z,KAAK,IAAIJ,EAAQ,EAAG,EAAG,IACnCia,EAAY7Z,KAAK,IAAIJ,EAAQ,EAAG,EAAG,MAEnC,MAAMka,EAAgB,IAAIC,EAAkB,CAAEC,MAAO,QAAUtG,UAAWC,IACpEsG,GAAgB,IAAIC,GAAiBC,cAAcN,GACnDO,EAAiB,IAAIC,EAAKJ,EAAeH,GAC/CM,EAAeE,YAAc,IAE7B,MAAMC,EAAe,GACrBA,EAAava,KAAK,IAAIJ,EAAQ,EAAG,EAAG,IACpC2a,EAAava,KAAK,IAAIJ,EAAQ,EAAG,IAAM,IAEvC,MAAM4a,EAAiB,IAAIT,EAAkB,CAAEC,MAAO,QAAUtG,UAAWC,IACrE8G,GAAiB,IAAIP,GAAiBC,cAAcI,GACpDG,EAAkB,IAAIL,EAAKI,EAAgBD,GACjDE,EAAgBJ,YAAc,IAE9B,MAAMK,EAAa,GACnBA,EAAW3a,KAAK,IAAIJ,EAAQ,EAAG,EAAG,IAClC+a,EAAW3a,KAAK,IAAIJ,EAAQ,IAAM,EAAG,IAErC,MAAMgb,EAAe,IAAIb,EAAkB,CAAEC,MAAO,SAAUtG,UAAWC,IACnEkH,GAAe,IAAIX,GAAiBC,cAAcQ,GAClDG,EAAgB,IAAIT,EAAKQ,EAAcD,GAC7CE,EAAcR,YAAc,IAE5B9hB,KAAK8hB,YAAc,IAEnB9hB,KAAK6I,IAAI+Y,GACT5hB,KAAK6I,IAAIqZ,GACTliB,KAAK6I,IAAIyZ,GAETtiB,KAAKohB,MAAM7E,IAAI6E,EAAOA,EAAOA,GAG/BrhB,UAIAA,YCXG,MAACwiB,GAAgB,IAzCtB,MAEExiB,OAEEC,KAAKyc,SAAW,IAAI+F,EACpBxiB,KAAKyc,SAASzb,KAAO,gBAGvBjB,UAAUiB,IAKV4K,cAEE,OAAO5L,KAAKyc,SAGd7Q,YAAY6W,GAEVziB,KAAKyc,SAAWgG,EAGlB1iB,UAWE,IATAC,KAAK4L,QAAQ8W,UAASC,IAEhBA,EAAMC,WAERD,EAAMC,SAASC,UACfF,EAAMG,SAASD,cAIZ7iB,KAAK4L,QAAQmX,SAASjd,OAAS,GAEpC9F,KAAK4L,QAAQwN,OAAOpZ,KAAK4L,QAAQmX,SAAS,MCjChD,MAAMC,WAAaC,EAEjBljB,YAAYmD,EAAMggB,EAAU1B,GAE1Bte,EAAWA,GAAQ,IAAIkE,EAAQ,EAAG,EAAG,GACrC8b,EAAWA,GAAY,IAAI9b,EAAQ,EAAG,EAAG,GACzCoa,EAAWA,GAAS,SAGpBzU,MAFiB,IAAIoW,EAAYjgB,EAAKgF,EAAGhF,EAAKiF,EAAGjF,EAAKyF,EAAGua,EAAShb,EAAGgb,EAAS/a,EAAG+a,EAASva,GACzE,IAAIya,EAAkB,CAAE5B,MAAOA,MCTpD,MAAM6B,WAAeJ,EAEnBljB,YAAYof,EAAQqC,GAElBA,EAAQA,GAAS,UAIjBzU,MAFiB,IAAIuW,EADrBnE,EAASA,GAAU,EAC+B,GAAI,IACrC,IAAIiE,EAAkB,CAAE5B,MAAOA,MCJpD,MAAM+B,WAAcN,EAElBljB,YAAYyhB,EAAO1b,EAAQ0d,GAEzBhC,EAAQA,GAAS,UAGjB,MACMiC,GAHN3d,EAASA,GAAU,GAEC,GAEd4d,EAAe,IAAIC,EAAuB,IAAM,IAAMF,EAAiB,IAC7EC,EAAaE,UAAU,EAAGH,EAAkB,EAAG,GAE/C,MAAMI,EAAgB,IAAIC,EAAmB,GALzB,GAK2C,IAC/DD,EAAcD,UAAU,EAAGH,EAAkBM,GAAiB,GAE9D,MAAMC,EAAkBC,GAAoBC,sBAAsB,CAACR,EAAcG,IACjFG,EAAgBG,QAAQ,MAGxBpX,MAAMiX,EADW,IAAIZ,EAAkB,CAAE5B,MAAOA,KAG5CgC,GAEFxjB,KAAKokB,WAAWC,mBAAmB,IAAIjd,EAAQ,EAAG,EAAG,GAAIoc,GAG3DxjB,KAAKskB,KAAOd,EAGdA,QAAQA,GAENxjB,KAAKokB,WAAWC,mBAAmB,IAAIjd,EAAQ,EAAG,EAAG,GAAIoc,GACzDxjB,KAAKskB,KAAOd,EAGdA,UAEE,OAAOxjB,KAAKskB,KAGdxe,WAAWF,GAET5F,KAAKohB,MAAMzY,EAAI/C,EAGjBE,aAEE,OAAO9F,KAAKohB,MAAMzY,GCmBjB,MAAC4b,GAAU,IAvEhB,MAEExkB,OAEEC,KAAKqe,MAAQ,EACbre,KAAKkf,OAAS,EAEdlf,KAAKwkB,SAAW,IAAIzQ,EAEpB/T,KAAKykB,aAAe,EACpBzkB,KAAK0kB,cAAgB,EACrB1kB,KAAK2kB,aAAe,IAAI5Q,EAAQ/T,KAAKqe,MAAOre,KAAKkf,QAEjDlf,KAAKmgB,IAAM,EACXngB,KAAK4kB,WAAa,IAAI7Q,EAAQ,EAAI/T,KAAKqe,MAAO,EAAIre,KAAKkf,QAGzDnf,gBAAgBmI,EAAGC,GAEjBnI,KAAKwkB,SAASjI,IAAIrU,EAAGC,GAGvBpI,SAEEC,KAAK6kB,cAAe,EAGtB9kB,YAAYse,EAAOa,GAEjBlf,KAAKqe,MAAQA,EACbre,KAAKkf,OAASA,EAEdlf,KAAK4kB,WAAa,IAAI7Q,EAAQ,EAAI/T,KAAKqe,MAAO,EAAIre,KAAKkf,QAEvDlf,KAAK2kB,aAAazc,EAAImW,EACtBre,KAAK2kB,aAAaxc,EAAI+W,EAEtBlf,KAAKykB,aAAepG,EAAQre,KAAKmgB,IACjCngB,KAAK0kB,cAAgBxF,EAASlf,KAAKmgB,IAEnCngB,KAAK6kB,cAAe,EAGtB9kB,uBAAuB+kB,GAIrB,OAFAA,EAAQhc,eAAe,EAAI9I,KAAKmgB,KAEzB2E,EAGT/kB,oBAAoB6F,GAElB,OAAOA,GAAS,EAAI5F,KAAKmgB,KAG3BpgB,iBAEE,OAAOC,KAAK4kB,WAGdG,mBAEE,OAAO/kB,KAAKqe,MAAQre,KAAKkf,OAG3B8F,eAEE,OAAOhlB,KAAKqe,MAAQre,KAAKkf,SCnE7B,MAAM+F,WAAmCrL,GAEvC7Z,YAAYmI,EAAGC,EAAGO,EAAGwc,GA4BnBnY,MA1Ba,ogBAiBA,8JASK,CAChB4N,SAAU,CAAE/U,WAAO5B,GACnBmhB,qBAAsB,CAAEvf,MAAO,IAAImO,GACnCqR,YAAa,CAAExf,MAAO,IAAImO,GAC1BsR,aAAc,CAAEzf,MAAO,IAAImO,KAI/BhU,aAAamI,EAAGC,GAEdnI,KAAKga,SAASmL,qBAAqBvf,MAAM2W,IAAIrU,EAAGC,GAGlDpI,YAAYwb,EAAK7S,EAAGwc,GAElBllB,KAAKga,SAASW,SAAS/U,MAAQ2V,EAC/Bvb,KAAKga,SAASqL,aAAazf,MAAM2W,IAAIhB,EAAI9I,MAAM4L,MAAO9C,EAAI9I,MAAMyM,aAEtDlb,IAAN0E,IAEF1I,KAAKga,SAASqL,aAAazf,MAAMsC,EAAIQ,QAE7B1E,IAANkhB,IAEFllB,KAAKga,SAASqL,aAAazf,MAAMuC,EAAI+c,GAIzCnlB,gBAAgB2I,EAAGwc,GAEjBllB,KAAKga,SAASoL,YAAYxf,MAAM2W,IAAI7T,EAAGwc,IC3D3C,MAAMI,WAA0BC,EAE9BxlB,YAAYylB,EAAKC,EAAQC,EAAMC,GAE7B5Y,MAAMyY,EAAKC,EAAQC,EAAMC,GAEzB3lB,KAAK4lB,YAAc,IAAItL,EAAM,WAC7Bta,KAAK6lB,YAAc,EAGrB9lB,KAAK4c,GAKH,OAHA5P,MAAM+Y,KAAKnJ,GACX3c,KAAK4lB,YAAYE,KAAKnJ,EAAOiJ,aAC7B5lB,KAAK6lB,YAAclJ,EAAOkJ,YACnB7lB,MCqPN,MAAC+lB,GAAQ,IA1Od,MAEEhmB,OAEEC,KAAKgmB,YAAc,IAAI5e,EAAQ,EAAG,EAAG,GACrCpH,KAAKimB,aAAe,IAAI7e,EAAQ,EAAG,EAAG,GACtCpH,KAAKkmB,qBAAkBliB,EAEvBhE,KAAKmmB,uBAAyB,GAE9BnmB,KAAKsd,SAAMtZ,EACXhE,KAAKyiB,MAAQ,IAAID,EACjBxiB,KAAK2c,OAAS,IAAI2I,GAAkB,GAAIc,GAAQrB,aAAc,GAAK,KACnE/kB,KAAK2c,OAAOkJ,YAAc,EAG5B9lB,WAAWsmB,EAAQ7C,EAAKhC,EAAQ,UAE9B,MAAM8E,EAAQ,IAAI/C,GAAM/B,EAAOgC,EAAI1d,SAAU0d,EAAIre,QAAQohB,aAGzD,OAFAD,EAAM9B,SAASsB,KAAKO,GACpBrmB,KAAKyiB,MAAM5Z,IAAIyd,GACRA,EAGTvmB,YAEE,MAAMymB,EAAO,IAAItF,GAEjB,OADAlhB,KAAKyiB,MAAM5Z,IAAI2d,GACRA,EAGTzmB,aAAa0mB,GAEXzmB,KAAK0mB,SAAWD,EAGlB1mB,eAAe4mB,EAAatI,EAAOa,EAAQsC,GAEzCnD,EAASA,GAAS,IAClBa,EAASA,GAAU,IACnBlf,KAAKsd,IAAIsJ,UAAapF,GAAS,qBAC/BxhB,KAAKsd,IAAIuJ,SAASF,EAAYze,EAAImW,EAAQ,EACvCre,KAAKsd,IAAIF,OAAO8B,OAASyH,EAAYxe,EAAK+W,EAAS,EAAGb,EAAOa,GAGlEnf,QAEMC,KAAKsd,KAEPtd,KAAKsd,IAAIwJ,UAAU,EAAG,EAAG9mB,KAAKsd,IAAIF,OAAOiB,MAAOre,KAAKsd,IAAIF,OAAO8B,QAIpEnf,aAAa0H,EAAMC,EAAI8Z,GAErBxhB,KAAKsd,IAAIyJ,YAAevF,GAAS,qBACjCxhB,KAAKsd,IAAIsC,YACT5f,KAAKsd,IAAIuC,OAAOpY,EAAKS,EAAGT,EAAKU,GAC7BnI,KAAKsd,IAAIwC,OAAOpY,EAAGQ,EAAGR,EAAGS,GACzBnI,KAAKsd,IAAI0C,YACThgB,KAAKsd,IAAI+B,SAGXtf,UAAUkH,EAAQua,EAAQ,UAExB,MAAMsB,EAAW,IAAIvB,EAAkB,CACrCC,MAAOA,IAGHoB,GAAW,IAAIlB,GAAiBC,cAAc1a,GAE9C+f,EAAO,IAAInF,EAAKe,EAAUE,GAGhC,OAFAkE,EAAKC,eAAgB,EACrBjnB,KAAKyiB,MAAM5Z,IAAIme,GACRA,EAGTjnB,UAAUmnB,EAAKhkB,EAAMse,GAEnBte,EAAOA,GAAQ,EACfse,EAAQA,GAAS,SACjB0F,EAAMA,GAAO,IAAI9f,EAEjB,MAAM+f,EAAO,IAAInE,GAAK,IAAI5b,EAAQlE,EAAMA,EAAMA,QAAOc,EAAWwd,GAGhE,OAFA2F,EAAK3C,SAASsB,KAAKoB,GACnBlnB,KAAKyiB,MAAM5Z,IAAIse,GACRA,EAGTpnB,mBAAmB0H,EAAMC,EAAIwX,EAAS,EAAGsC,EAAQ,UAAW4F,EAAQ,IAElE,MAAMlkB,EAAOuE,EAAK4f,WAAW3f,GACvByf,EAAO,IAAInE,GAAK,IAAI5b,EAAQggB,EAAOlI,EAAQhc,QAAOc,EAAWwd,GAE7D5Y,EAASlB,EAAGvC,QAAQmiB,IAAI7f,GAAMqB,eAAe,IAC7Cye,EAAc3e,EAAOzD,QAAQohB,YAanC,OAZA3d,EAAOC,IAAIpB,GAEX0f,EAAK3C,SAASsB,KAAKld,GAOnBue,EAAK/C,WAAWC,mBAAmB,IAAIjd,EAAQ,EAAG,GAAI,GAAImgB,GAE1DvnB,KAAKyiB,MAAM5Z,IAAIse,GACRA,EAGTpnB,WAAWse,EAAOa,EAAQsC,GAExB,MAAMoB,EAAW,IAAI4E,EAAcnJ,EAAOa,GACpC4D,EAAW,IAAIjJ,EAAe,CAClCG,SAAU,CACRK,OAAQ,CAAEzU,MAAO,IAAI6hB,EAAQ,EAAG,EAAG,EAAG,MAExCxN,aAAcyN,GACdvN,eAAgBwN,GAChBC,aAAa,EACb9M,YAAY,IAGR5T,EAAQ,IAAI+b,EAAKL,EAAUE,GAGjC,OAFA5b,EAAM4a,aAAe,IACrB9hB,KAAKyiB,MAAM5Z,IAAI3B,GACRA,EAGTnH,gBAAgBmnB,EAAKhkB,EAAMse,GAEzBte,EAAOA,GAAQ,EACfse,EAAQA,GAAS,SAEjB,MAAMqG,GAAM,IAAIC,GAAOC,qBAAqB,IAAI3gB,EAAW,IAAIA,EAAQlE,EAAMA,EAAMA,IAC7E8kB,EAAS,IAAIC,EAAWJ,EAAKrG,GAEnC,OADAwG,EAAOxD,SAASsB,KAAKoB,GAAO,IAAI9f,GACzB4gB,EAGTjoB,YAAYmnB,EAAKhkB,EAAMse,GAErBte,EAAOA,GAAQ,EACfse,EAAQA,GAAS,SACjB0F,EAAMA,GAAO,IAAI9f,EAEjB,MAAM8gB,EAAS,IAAI7E,GAAOngB,EAAMse,GAGhC,OAFA0G,EAAO1D,SAASsB,KAAKoB,GACrBlnB,KAAKyiB,MAAM5Z,IAAIqf,GACRA,EAGTnoB,iBAAiBooB,EAAcC,GAAO,EAAO5G,EAAQ,UAEnD,MAAM6G,EAAU,IAAIC,EAAiBH,EAAcC,GACnDC,EAAQE,mBACR,MAAMthB,EAASohB,EAAQG,gBAAgB,KAGvC,OAFoBxoB,KAAKyoB,UAAUxhB,EAAQ,OAK7ClH,mBAAmBmoB,EAAQ1G,GAEzBA,EAAQA,GAAS,SACjB,MAAMoB,EAAW,IAAI8F,EAAeR,EAAO/I,OAAQ,GAAI,IACjD2D,EAAW,IAAIM,EAAkB,CAAE5B,MAAOA,IAC1CmH,EAAc,IAAI1F,EAAKL,EAAUE,GAGvC,OAFA6F,EAAYnE,SAASsB,KAAKoC,EAAOtf,QACjCggB,GAAahd,QAAQ/C,IAAI8f,GAClBA,EAGT5oB,iBAAiBmoB,GAEf,MAAMtF,EAAW,IAAI8F,EAAeR,EAAO/I,OAAQ,GAAI,IACjD2D,EAAW,IAAIjJ,EAAe,CAClCG,SAAU,CACRK,OAAQ,CAAEzU,MAAO,IAAI6hB,EAAQ,EAAG,EAAG,EAAG,MAExCxN,aAAcyN,GACdvN,eAAgBwN,GAChBC,aAAa,IAGTiB,EAAU,IAAI5F,EAAKL,EAAUE,GACnC+F,EAAQrE,SAASsB,KAAKoC,EAAOtf,QAC7BggB,GAAahd,QAAQ/C,IAAIggB,GAG3B9oB,kBAAkB+oB,GAEhB,MAAMd,EAAS,IAAIC,EAAWa,EAAI,UAClCF,GAAahd,QAAQ/C,IAAImf,GAG3BjoB,WAAWgpB,EAAOC,GAEhB,MAAMC,EAAS,IAAI7hB,EAAQ,EAAG,EAAG,GAC7B4hB,IAEFC,EAAO9gB,EAAI6gB,EAAQC,QAAU,GAG/B,IAAK,IAAI3hB,EAAI,EAAGA,EAAIyhB,EAAMjjB,OAAS,EAAGwB,IAEpCtH,KAAKyoB,UAAUM,EAAMzhB,GAAGnC,QAAQ0D,IAAIogB,GAASF,EAAMzhB,EAAI,GAAGnC,QAAQ0D,IAAIogB,IAI1ElpB,aAAawb,EAAK7S,EAAGwc,GAEnB,MAAMgE,EAAO,IAAIjG,EAAK,IAAIuE,EAAc,EAAG,GAAI,IAAIvC,IAKnD,OAJAjlB,KAAKmmB,uBAAuB3e,KAAK0hB,GACjClpB,KAAKyiB,MAAM5Z,IAAIqgB,GAEfA,EAAKpG,SAASqG,YAAY5N,EAAK7S,EAAGwc,GAC3BgE,EAGTnpB,OAAOqpB,GAEL,IAAK,IAAI9hB,EAAI,EAAGA,EAAItH,KAAKmmB,uBAAuBrgB,OAAQwB,IAEtDtH,KAAKmmB,uBAAuB7e,GAAGwb,SAASuG,gBAAgBjD,GAAQ/H,MAAO+H,GAAQlH,QAE7Elf,KAAKyiB,MAAMM,SAASjd,OAAS,GAE/BsjB,EAASE,OAAOtpB,KAAKyiB,MAAO8G,GAAc3d,WC5PhD,MAAM4d,WAAiCjP,GAErCxa,YAAY0pB,EAAaC,GAEvB3c,2aACA/M,KAAKga,SAAS2P,aAAe,CAAE/jB,MAAO,IAAI6hB,EAAQgC,EAAaC,EAAaxhB,EAAGwhB,EAAavhB,EAAGuhB,EAAa/gB,KCNhH,MAAMihB,WAA4B/P,EAEhC9Z,cAEEgN,MAAM,CACJiN,SAAU,CACR6P,UAAW,CAAEjkB,MAAO,IAEtBqU,6QACAE,+dAIJ2P,cAAclkB,GAEZ5F,KAAKga,SAAS6P,UAAUjkB,MAAQA,EAGlCkkB,gBAEE,OAAO9pB,KAAKga,SAAS6P,UAAUjkB,OChBnC,MAAMmkB,GAEJhqB,cAEEC,KAAKymB,GAAK,IAAIuD,EAAkB5D,GAAQ/H,MAAO+H,GAAQlH,QAEvDlf,KAAKiqB,uBAAyB,IAAIT,GAAyB,EAAG,IAAIpiB,EAAQ,EAAG,EAAG,IAChFpH,KAAKkqB,sBAAwB,IAAIN,GAGnC7pB,OAAOqpB,GAELppB,KAAKmqB,2BAELf,EAASgB,MAAMpqB,KAAKymB,QAAIziB,GAAW,GAAM,GAEzColB,EAASiB,yBAAyBrqB,KAAKymB,GAAIzmB,KAAKiqB,wBAEhDjqB,KAAKkqB,sBAAsBJ,UAAYP,GAAc3d,QAAQ+Z,IAE7DyD,EAASE,YAAOtlB,OAAWA,EAAWhE,KAAKymB,GAAIzmB,KAAKkqB,uBAGtDnqB,2BAEMC,KAAKymB,GAAGpI,QAAU+H,GAAQ/H,OAASre,KAAKymB,GAAGvH,SAAWkH,GAAQlH,QAEhElf,KAAKymB,GAAG6D,QAAQlE,GAAQ/H,MAAO+H,GAAQlH,QAI3CqL,oBAEE,OAAOvqB,KAAKymB,ICnChB,MAAM+D,GAEJzqB,YAAY4Z,GAEV3Z,KAAK2Z,SAAWA,EAChB3Z,KAAKyqB,YAAc,IAAIjI,EACvBxiB,KAAK0qB,eAAiB,IAAInQ,GAC1Bva,KAAK2qB,WAAa,IAAI1H,EACpB,IAAIuE,EAAc,EAAG,GAAIxnB,KAAK0qB,gBAChC1qB,KAAKyqB,YAAY5hB,IAAI7I,KAAK2qB,YAC1B3qB,KAAK4qB,aAAe,IAAIC,GAAoB,EAAG,EAAG,GAAI,GAAI,IAAO,KAGnE9qB,KAAK4S,EAAKmY,GAER9qB,KAAK2qB,WAAW7H,SAAW9iB,KAAK0qB,eAEhC,MAAMK,GAA0C,IAA5BpY,EAAIqY,oBAA+BrY,EAAIsY,QAAUtY,EAC/DuY,GAA0C,IAA5BvY,EAAIqY,oBAA+BrY,EAAI0L,MAAU1L,EAAIF,MAAM4L,MACzE8M,GAA0C,IAA5BxY,EAAIqY,oBAA+BrY,EAAIuM,OAAUvM,EAAIF,MAAMyM,OAE/Elf,KAAK2qB,WAAW7H,SAAS9I,SAASW,SAAS/U,MAAQmlB,EACnD/qB,KAAK2qB,WAAW7H,SAAS9I,SAASY,YAAYhV,MAAM2W,IAAI2O,EAAWC,GAE/DL,EAEF9qB,KAAK2qB,WAAW7H,SAAS9I,SAASa,kBAAkBjV,MAAM2W,IAAIuO,EAAIzM,MAAOyM,EAAI5L,QAI7Elf,KAAK2Z,SAASyR,QAAQprB,KAAK2qB,WAAW7H,SAAS9I,SAASa,kBAAkBjV,OAG5E5F,KAAKqrB,SAASP,GAGhB/qB,cAAcurB,EAAKR,GAEjB9qB,KAAK2qB,WAAW7H,SAAWwI,EAI3BtrB,KAAKqrB,SAASP,GAGhB/qB,mBAAmB4S,EAAKmY,EAAKQ,GAE3B,MAAMP,GAA0C,IAA5BpY,EAAIqY,oBAA+BrY,EAAIsY,QAAUtY,EAC/DuY,GAA0C,IAA5BvY,EAAIqY,oBAA+BrY,EAAI0L,MAAU1L,EAAIF,MAAM4L,MACzE8M,GAA0C,IAA5BxY,EAAIqY,oBAA+BrY,EAAIuM,OAAUvM,EAAIF,MAAMyM,OAE/Elf,KAAK2qB,WAAW7H,SAAWwI,EAC3BtrB,KAAK2qB,WAAW7H,SAAS9I,SAASW,SAAS/U,MAAQmlB,EACnD/qB,KAAK2qB,WAAW7H,SAAS9I,SAASY,YAAYhV,MAAM2W,IAAI2O,EAAWC,GAE/DL,EAEF9qB,KAAK2qB,WAAW7H,SAAS9I,SAASa,kBAAkBjV,MAAM2W,IAAIuO,EAAIzM,MAAOyM,EAAI5L,QAI7Elf,KAAK2Z,SAASyR,QAAQprB,KAAK2qB,WAAW7H,SAAS9I,SAASa,kBAAkBjV,OAG5E5F,KAAKqrB,SAASP,GAGhB/qB,yBAAyBwrB,EAAQD,GAE/BtrB,KAAK2qB,WAAW7H,SAAWwI,EAE3BtrB,KAAKqrB,SAASE,GAGhBxrB,UAEEC,KAAK2qB,WAAW/H,SAASC,UACzB7iB,KAAK2qB,WAAW7H,SAASD,UAG3B9iB,SAAS0mB,GAEPA,OAAYziB,IAAPyiB,EAAmB,KAAOA,EAE/B,MAAM+E,EAAaxrB,KAAK2Z,SAAS8R,kBAEjCzrB,KAAK2Z,SAAS+R,qBAAuB1nB,IAAPyiB,EAAmB,KAAOA,GACxDzmB,KAAK2Z,SAAS2P,OAAOtpB,KAAKyqB,YAAazqB,KAAK4qB,cAE5C5qB,KAAK2Z,SAAS+R,gBAAgBF,ICkT7B,MAACpC,GAAW,IA5XjB,MAEErpB,KAAKqd,EAAQuO,EAAiBC,EAAoBC,GAEhD7rB,KAAK8rB,eAAY9nB,EACjBhE,KAAK+rB,aAAU/nB,EACfhE,KAAKod,YAASpZ,EACdhE,KAAKgsB,eAAYhoB,EACjBhE,KAAKisB,yBAAsBjoB,EAC3BhE,KAAKksB,4BAA6B,EAClClsB,KAAKmsB,gCAA6BnoB,EAElChE,KAAKosB,WAAY,EACjBpsB,KAAKqsB,oBAAiBroB,EACtBhE,KAAK4rB,wBAAqB5nB,EAE1BhE,KAAK2rB,gBAAkB,CACrBW,cAAc,EACdC,YAAY,GAGdvsB,KAAK4rB,mBAAqB,CACxBY,OAAO,EACPC,WAAW,EACXrF,OAAO,EACPsF,gBAAgB,EAChBC,8BAA8B,EAC9BC,gBAAiB,mBACjBC,oBAAoB,EACpBC,uBAAuB,EACvBC,SAAS,GAGX/sB,KAAK6rB,mBAAqB,CACxBmB,wBAAwB,GAG1B/iB,OAAOkM,OAAOnW,KAAK2rB,gBAAiBA,GACpC1hB,OAAOkM,OAAOnW,KAAK4rB,mBAAoBA,GAEvC3hB,OAAOkM,OAAOnW,KAAK6rB,mBAAoB7rB,KAAK4rB,oBAC5C3hB,OAAOkM,OAAOnW,KAAK6rB,mBAAoBA,GAEnC7rB,KAAK2rB,gBAAgBW,aAEvBtsB,KAAKqsB,eAAiBjP,EAAOG,WAAW,SAAUvd,KAAK4rB,qBACjCxO,EAAOG,WAAW,QAASvd,KAAK4rB,qBAChCxO,EAAOG,WAAW,qBAAsBvd,KAAK4rB,oBAInE5rB,KAAKqsB,eAAiBjP,EAAOG,WAAW,QAASvd,KAAK4rB,qBAChCxO,EAAOG,WAAW,qBAAsBvd,KAAK4rB,oBAGrE5rB,KAAKosB,UAAqD,2BAAzCpsB,KAAKqsB,eAAe9gB,YAAYvK,KAIjDhB,KAAK6rB,mBAAmBzO,OAASA,EACjCpd,KAAK6rB,mBAAmBxiB,QAAUrJ,KAAKqsB,eAEvCrsB,KAAK8rB,UAAY,IAAImB,EAAcjtB,KAAK6rB,oBAEpC7rB,KAAK2rB,gBAAgBY,WAEvBvsB,KAAK8rB,UAAUrrB,GAAGysB,SAAU,EAI5BltB,KAAK8rB,UAAUqB,WAAY,EAG7BntB,KAAK8rB,UAAUsB,cAAc,GAE7BhH,GAAQjG,IAAMkN,GAAclN,IAEvBngB,KAAKosB,WAERpsB,KAAK8rB,UAAUwB,WAAW7nB,IAAI,0BAGhCzF,KAAK+rB,QAAU,IAAIvB,GAAQxqB,KAAK8rB,WAEhC9rB,KAAKod,OAASpd,KAAK8rB,UAAUyB,WAE7BvtB,KAAKgsB,UAAY,IAAItS,GAErB1Z,KAAKisB,oBAAsBjsB,KAAKgsB,UAChCwB,GAAa1Q,eAAiB9c,KAAK8rB,UAAUjP,aAAa4Q,mBAC1DD,GAAazQ,iCAAmC/c,KAAK8rB,UAAUjP,aAAa6Q,kBAAoB,EAChGF,GAAaxQ,sBAAwBhd,KAAK2tB,sCAE1C3tB,KAAKksB,4BAA6B,EAElClsB,KAAKmsB,2BAA6B,IAAIpC,GAEtC/pB,KAAK4tB,gBAAkB,IAAIC,eAAe7tB,KAAK8tB,UAAUnpB,KAAK3E,OAC9DA,KAAK4tB,gBAAgBG,QAAQ/tB,KAAKod,QAGpC4Q,kBAEE,OAAOhuB,KAAK8rB,UAAUyB,WAGxBU,uBAEE,OAAOjuB,KAAKmsB,2BAA2B5B,cAGzCxqB,UAAUmuB,GAIRluB,KAAKisB,oBAAoBxV,QAAQzW,KAAMA,KAAK8rB,WAC5C9rB,KAAKisB,oBAAsBiC,EAC3BluB,KAAKisB,oBAAoBjW,SAAShW,KAAMA,KAAK8rB,WAG/C/rB,SAEMC,KAAKksB,4BAEPlsB,KAAKmsB,2BAA2B7C,OAAOtpB,MAGzCA,KAAKmuB,0BAED5E,GAAc3d,SAEhB5L,KAAKisB,oBAAoB3C,SAG3BlD,GAAQvQ,SAGV9V,0BAEMwpB,GAAc3d,UAEhB2d,GAAc3d,QAAQ6Z,OAASW,GAAQrB,aACvCwE,GAAc3d,QAAQwiB,yBACtB7E,GAAc3d,QAAQyiB,eACtB9E,GAAc3d,QAAQ0iB,mBAAkB,IAI5CvuB,OAAO0iB,EAAO9F,EAAQ8J,EAAI8H,GAExBvuB,KAAKwuB,0BAA0B/L,EAAO8L,GAEtCvuB,KAAK8rB,UAAUJ,qBAAuB1nB,IAAPyiB,EAAmB,KAAOA,GACzDzmB,KAAK8rB,UAAUxC,OAAO7G,GAAUmG,GAAahd,QAC3C+Q,GAAU4M,GAAc3d,SAE1B5L,KAAKwuB,0BAA0B/L,OAAOze,GAGxCjE,aAAa0iB,GAEPA,EAAMgM,eAERhM,EAAMgM,gBAGJhM,EAAM6G,OAER7G,EAAM6G,SAINtpB,KAAKspB,OAAO7G,OAAOze,GAGjBye,EAAMiM,gBAERjM,EAAMiM,iBAIV3uB,0BAA0B0iB,EAAO6I,GAE/BA,OAActnB,IAARsnB,EAAoB,KAAOA,EAC7B7I,EAEFA,EAAMkM,iBAAmBrD,EAIzB1C,GAAahd,QAAQ+iB,iBAAmBrD,EAI5CvrB,YAAY0mB,EAAImI,GAEd5uB,KAAK8rB,UAAU+C,uBAAuBpI,EAAI,EAAG,EAAGA,EAAGpI,MAAOoI,EAAGvH,OAAQ0P,GAGvE7uB,MAAM0mB,EAAI9J,EAAQ8M,EAAaqF,GAE7B9uB,KAAK8rB,UAAUJ,qBAAuB1nB,IAAPyiB,EAAmB,KAAOA,GAErD9J,GAEF3c,KAAK8rB,UAAUiD,cAAcpS,EAAOiJ,YAAajJ,EAAOkJ,aAG1D7lB,KAAK8rB,UAAU1B,QAAQzN,IACnB8M,IACAqF,GAGN/uB,UAAUivB,GAER,IAAK,MAAMC,KAASD,EAElB5I,GAAQjG,IAAMkN,GAAclN,IAC5BiG,GAAQ8I,gBAAgBD,EAAME,YAAYjnB,EAAG+mB,EAAME,YAAYhnB,GAC/Die,GAAQgJ,YAAYH,EAAME,YAAY9Q,MAAO4Q,EAAME,YAAYjQ,QAE/Dlf,KAAKod,OAAOiB,MAAS+H,GAAQ3B,aAC7BzkB,KAAKod,OAAO8B,OAASkH,GAAQ1B,cAE7B1kB,KAAK8rB,UAAUuD,YAAY,EAAG,EAAGjJ,GAAQ3B,aAAc2B,GAAQ1B,eAE/D1kB,KAAKmuB,0BAITpuB,cAAcurB,EAAKR,GAEjB9qB,KAAK+rB,QAAQuD,cAAchE,EAAKR,GAGlC/qB,KAAKwvB,EAAQhE,EAAQD,GAEfA,EAEFtrB,KAAK+rB,QAAQyD,mBAAmBD,EAAQhE,EAAQD,GAIhDtrB,KAAK+rB,QAAQ0D,KAAKF,EAAQhE,GAI9BxrB,yBAAyBwrB,EAAQD,GAE/BtrB,KAAK+rB,QAAQ1B,yBAAyBkB,EAAQD,GAGhDvrB,gBAAgB2vB,EAAerR,EAAQ+H,GAAQ/H,MAAOa,EAASkH,GAAQlH,QAIrE,MAAMyQ,EAAYvJ,GAAQ/H,MACpBuR,EAAaxJ,GAAQlH,OAErB2Q,EAAYxR,EACZyR,EAAa5Q,EAEb6Q,EAAa,KACbC,EAAc,KAEdC,EAAcC,SAAStpB,KAAKuX,KAAK0R,EAAYE,IAC7CI,EAAcD,SAAStpB,KAAKuX,KAAK2R,EAAaE,IAEpD5J,GAAQgJ,YAAYW,EAAYC,GAChC,MAAMI,EAAUpwB,KAAK8rB,UAAUuE,gBAC/BrwB,KAAK8rB,UAAUsB,cAAc,GAE7BptB,KAAK8rB,UAAUxB,QAAQyF,EAAYC,GAAa,GAEhD,MACMM,EADY9X,SAAS6E,cAAc,UAChBE,WAAW,MAEpC+S,EAAOlT,OAAOiB,MAASwR,EACvBS,EAAOlT,OAAO8B,OAAS4Q,EAEvBvG,GAAc3d,QAAQ6Z,OAASW,GAAQrB,aACvCwE,GAAc3d,QAAQyiB,eACtB9E,GAAc3d,QAAQ0iB,mBAAkB,GAExC,IAAK,IAAIpmB,EAAI,EAAGA,EAAI+nB,EAAa/nB,IAE/B,IAAK,IAAIC,EAAI,EAAGA,EAAIgoB,EAAahoB,IAE/BohB,GAAc3d,QAAQ2kB,cAAcV,EAAuBC,EACzD1J,GAAQ/H,MAAQnW,EAAWke,GAAQlH,OAAS/W,EAC5Cie,GAAQ/H,MAAkB+H,GAAQlH,QACpClf,KAAKisB,oBAAoB3C,SAEzBgH,EAAOE,UAAUxwB,KAAK8rB,UAAUyB,WAAYnH,GAAQ/H,MAAQnW,EAAGke,GAAQlH,OAAS/W,GAMpFmoB,EAAOlT,OAAOqT,OAAOf,EAAe,qBAEpCnG,GAAc3d,QAAQ8kB,kBAEtBtK,GAAQgJ,YAAYO,EAAWC,GAC/B5vB,KAAK8rB,UAAUsB,cAAcgD,GAC7BpwB,KAAK8rB,UAAUxB,QAAQqF,EAAWC,GAAY,GAE9CrG,GAAc3d,QAAQ6Z,OAASW,GAAQrB,aACvCwE,GAAc3d,QAAQyiB,eACtB9E,GAAc3d,QAAQ0iB,mBAAkB,GAG1CvuB,oBAAoB4wB,GAElB,MAAMC,EAAOpY,SAAS6E,cAAc,KACpCuT,EAAKC,SAAW,eAEhBD,EAAKE,KAAOC,IAAIC,gBAAgBL,GAChCC,EAAKK,QAELL,EAAKM,QAAU,WAEbC,uBAAsB,WAEpBJ,IAAIK,gBAAgBR,EAAKE,SAE3BF,EAAKS,gBAAgB,SAIzBtxB,UAEEC,KAAK8rB,UAAUjJ,UACf7iB,KAAKisB,oBAAoBpJ,UACzB7iB,KAAK+rB,QAAQlJ,UAGf9iB,sCAEE,MAAM0mB,EAAK,IAAIuD,EAAkB,EAAG,EAAG,CACrCsH,UAAWvS,EACXwS,UAAWxS,EACXyS,OAAQC,EACRC,SAAUC,EACVC,KAAMC,EACNC,eAAe,EACfC,aAAa,IAgBTzG,EAAM,IAAIzR,EAAe,CAC7BI,aAdW,qGAeXE,eATW,oGAUXW,YAAY,EACZC,SAAUC,EACVC,WAAW,EACXC,UAAWC,IAGbnb,KAAKsvB,cAAchE,EAAK7E,GAExB,MAAMuL,EAAS,IAAIC,aAAa,GAGhC,OAFAjyB,KAAK8rB,UAAU+C,uBAAuBpI,EAAI,EAAG,EAAG,EAAG,EAAGuL,GAE/CprB,KAAKqB,IAAI+pB,EAAO,GAAK,SAAW,OCzY3C,MAAME,WAAuBrY,EAE3B9Z,cAEEgN,MAAM,CACJiN,SAAU,GAEVC,kLACAE,yHCPN,MAAMgY,WAA2BzY,GAE/B3Z,cAEEgN,QAGFhN,SAEEqyB,GAAShI,WAAMpmB,EAAWulB,GAAc3d,SAAS,GAAM,GAEvDwmB,GAAS9I,OAAOV,GAAahd,QAAS2d,GAAc3d,aAAS5H,EAAW,IAAIkuB,KCjBhF,MAAMG,GAEJtyB,KAAKwS,GAEHvS,KAAKsyB,eAAgB,EACrBtyB,KAAKuyB,aAAc,EAEnBvyB,KAAKkK,KAAO,GACZlK,KAAKwyB,UAAY,GACjBxyB,KAAKuS,UAAYA,EAEjBvS,KAAKuS,UAAUkgB,iBAAiB,UAAWzyB,KAAK0yB,YAAY/tB,KAAK3E,OAAO,GACxEA,KAAKuS,UAAUkgB,iBAAiB,QAASzyB,KAAK2yB,UAAUhuB,KAAK3E,OAAO,GAGtED,YAAY+C,GAEQ,KAAdA,EAAE8vB,SAAkB9vB,EAAE+vB,UAAY7yB,KAAKuyB,cAEzCvyB,KAAKsyB,eAAgB,EACrBtyB,KAAKuyB,aAAc,GAGjBzvB,EAAEgwB,MAEJ9yB,KAAK+yB,UAAUjwB,EAAEgwB,MAIrB/yB,UAAU+C,GAER9C,KAAKgzB,YAAYlwB,EAAEgwB,MAGrB/yB,QAEEC,KAAKsyB,eAAgB,EAErB,IAAK,IAAIhrB,EAAI,EAAGA,EAAItH,KAAKwyB,UAAU1sB,OAAQwB,IAEzCtH,KAAKkK,KAAKlK,KAAKwyB,UAAUlrB,IAAI2rB,SAAU,EACvCjzB,KAAKkK,KAAKlK,KAAKwyB,UAAUlrB,IAAI4rB,UAAW,EAI5CnzB,YAAYozB,GAEV,MAAMC,EAAMpzB,KAAKkK,KAAKipB,GAClBC,IAEFA,EAAIC,OAAQ,EACZD,EAAIE,MAAO,EACXF,EAAIF,UAAW,GAInBnzB,eAEEC,KAAKuyB,aAAc,EAEnB,IAAK,IAAIjrB,EAAI,EAAGA,EAAItH,KAAKwyB,UAAU1sB,OAAQwB,IAEzCtH,KAAKkK,KAAKlK,KAAKwyB,UAAUlrB,IAAI+rB,OAAQ,EACrCrzB,KAAKkK,KAAKlK,KAAKwyB,UAAUlrB,IAAIgsB,MAAO,EAIxCvzB,UAAUozB,GAER,MAAMC,EAAMpzB,KAAKkK,KAAKipB,GAClBC,KAEe,IAAbA,EAAIE,OAENF,EAAIH,SAAU,GAEhBG,EAAIE,MAAO,EACXF,EAAIC,OAAQ,GAIhBtzB,eAAeozB,GAEb,MAAMC,EAAMpzB,KAAKkK,KAAKipB,GACtB,QAAIC,GAEKA,EAAIH,QAKflzB,YAAYozB,GAEV,MAAMC,EAAMpzB,KAAKkK,KAAKipB,GACtB,QAAIC,GAEKA,EAAIE,KAKfvzB,gBAAgBozB,GAEd,MAAMC,EAAMpzB,KAAKkK,KAAKipB,GACtB,QAAIC,GAEKA,EAAIF,SAMfnzB,aAAaqzB,GAEXpzB,KAAKkK,KAAKkpB,GACR,CACED,SAAUC,EACVH,SAAS,EACTK,MAAM,EACND,OAAO,GAGXrzB,KAAKwyB,UAAYvoB,OAAOC,KAAKlK,KAAKkK,MAGpCnK,eAAeozB,UAENnzB,KAAKkK,KAAKipB,GAGnBpzB,UAEEC,KAAKuS,UAAUghB,oBAAoB,UAAWvzB,KAAK0yB,YAAY/tB,KAAK3E,OAAO,GAC3EA,KAAKuS,UAAUghB,oBAAoB,QAASvzB,KAAK2yB,UAAUhuB,KAAK3E,OAAO,IC5EtE,MAACwzB,GAAK,IAxDX,MAEEzzB,OAEEC,KAAKyzB,kBAAoB,CACvBC,QAAS,UACTC,IAAK,MACLC,MAAO,QACPC,IAAK,MACLC,QAAS,WAGX9zB,KAAK+zB,YAAe3zB,UAAUC,UAAUuB,MAAM,+GAC9C5B,KAAKg0B,WAAa5zB,UAAUC,UAAUuB,MAAM,QAAUxB,UAAU6zB,gBAAkB7zB,UAAU6zB,eAAiB,GAC7Gj0B,KAAKk0B,SAAW9zB,UAAUC,UAAUuB,MAAM,uBAAyB5B,KAAKg0B,QAExEh0B,KAAKm0B,WAAan0B,KAAKo0B,WAAap0B,KAAKyzB,kBAAkBC,QAC3D1zB,KAAKq0B,SAAWr0B,KAAKo0B,WAAap0B,KAAKyzB,kBAAkBG,MACzD5zB,KAAKs0B,OAASt0B,KAAKo0B,WAAap0B,KAAKyzB,kBAAkBI,IACvD7zB,KAAKu0B,WAAav0B,KAAKo0B,WAAap0B,KAAKyzB,kBAAkBK,QAG7D/zB,SAEE,MAAMM,EAAYF,OAAOC,UAAUC,UAC7Bm0B,EAAWr0B,OAAOC,UAAUo0B,SAIlC,IAAIhB,EAAK,KAuBT,OArB0C,IALnB,CAAC,YAAa,WAAY,SAAU,UAKxC7yB,QAAQ6zB,GAEzBhB,EAAKxzB,KAAKyzB,kBAAkBI,KAEe,IAPxB,CAAC,SAAU,OAAQ,QAOlBlzB,QAAQ6zB,GAE5BhB,EAAKxzB,KAAKyzB,kBAAkBE,KAEmB,IAZxB,CAAC,QAAS,QAAS,UAAW,SAY7BhzB,QAAQ6zB,GAEhChB,EAAKxzB,KAAKyzB,kBAAkBK,QAErB,UAAUjyB,KAAKxB,GAEtBmzB,EAAKxzB,KAAKyzB,kBAAkBC,SAEpBF,GAAM,QAAQ3xB,KAAK2yB,KAE3BhB,EAAKxzB,KAAKyzB,kBAAkBG,OAGvBJ,ICrCX,MAAMiB,GAA2B,IAdjC,MAEE10B,OAEEC,KAAK00B,qBAAkB1wB,EACvBhE,KAAK20B,gBAAkB,IAAIvtB,EAG7BrH,oBAAoB6iB,GAElB5iB,KAAK00B,gBAAkB9R,ICJ3B,MAAMgS,GAEJ70B,YAAY6iB,EAAUiS,GAEpB70B,KAAK4iB,SAAWA,EAEhB5iB,KAAK8iB,cAAW9e,EAChBhE,KAAKga,SAAW,GAChBha,KAAK60B,YAAcA,EAEnB70B,KAAK80B,cAAgB,GAErB90B,KAAK+0B,kBAAe/wB,EAEpBhE,KAAKg1B,YAAc,IAAIjhB,EACvB/T,KAAKi1B,aAAe,IAAIlhB,EAExB/T,KAAKk1B,oBAAsB,EAE3Bl1B,KAAKm1B,wBAA0B,EAGjCp1B,KAAKg1B,EAActa,EAAaD,GAE9Bxa,KAAK8iB,SAAW,IAAIjJ,EAAe,CACjCG,SAAUha,KAAKga,SACfC,aAAcQ,EACdN,eAAgBK,IAElBxa,KAAK+0B,aAAeA,EAGtBh1B,mBAAmBiB,EAAMgF,GAEvBhG,KAAKga,SAAShZ,GAAQ,CAAE4E,MAAOI,GAC/BhG,KAAK8iB,SAAS7D,aAAc,EAG9Blf,mBAAmBiB,EAAMgF,GAEvBhG,KAAKga,SAAShZ,GAAM4E,MAAQI,EAG9BjG,sBAAsBq1B,EAAcC,GAElC,MAAMC,EAAgBt1B,KAAKu1B,qBAAqBv1B,KAAK60B,aAC/CW,EAAgBx1B,KAAKu1B,qBAAqBv1B,KAAK60B,aAC/CY,EAAgBz1B,KAAKu1B,qBAAqB,GAE1CG,EAAe11B,KAAK21B,mBAAmBP,EAAcE,EAASE,EAASC,GAEzEJ,GAEFr1B,KAAK41B,yBAAyBF,EAAcL,GAIhDt1B,sBAAsBq1B,EAAcS,GAElC,MAAMP,EAAgBt1B,KAAK81B,sBAAsB91B,KAAK60B,aAChDW,EAAgBx1B,KAAK81B,sBAAsB91B,KAAK60B,aAChDY,EAAgBz1B,KAAK81B,sBAAsB,GAE3CJ,EAAe11B,KAAK21B,mBAAmBP,EAAcE,EAASE,EAASC,GAEzEI,GAEF71B,KAAK+1B,0BAA0BL,EAAcG,GAIjD91B,4BAA4Bq1B,EAAcS,GAExC,MAAMP,EAAgBt1B,KAAKg2B,4BAA4Bh2B,KAAK60B,aACtDW,EAAgBx1B,KAAKg2B,4BAA4Bh2B,KAAK60B,aACtDY,EAAgBz1B,KAAKg2B,4BAA4B,GAEjDN,EAAe11B,KAAK21B,mBAAmBP,EAAcE,EAASE,EAASC,GAEzEI,GAEF71B,KAAK+1B,0BAA0BL,EAAcG,GAIjD91B,sBAAsBk2B,EAAab,EAAcc,EAASC,EAAOC,EAAOC,GAEtE,MAAMC,EAAYt2B,KAAKu2B,mBAAmBN,GACpCO,EAAex2B,KAAKy2B,mBAAmBrB,GAE7Cp1B,KAAK02B,gBAAgBF,EAAa7jB,IAAK2jB,EAAWJ,EAASC,EAAOC,EAAOC,GACzEr2B,KAAK02B,gBAAgBF,EAAaG,UAAW,EAAGT,EAASC,EAAOC,EAAOC,GAEvEG,EAAaI,oBAAsBN,EAEnCE,EAAaK,cAGf92B,sBAAsBk2B,EAAab,EAAc0B,EAASX,EAAOC,EAAOC,EAAOU,GAE7E,MAAMT,EAAYt2B,KAAKu2B,mBAAmBN,GACpCO,EAAex2B,KAAKy2B,mBAAmBrB,GAE7Cp1B,KAAKg3B,iBAAiBR,EAAa7jB,IAAK2jB,EAAWQ,EAASX,EAAOC,EAAOC,EAAOU,GACjF/2B,KAAKg3B,iBAAiBR,EAAaG,UAAW,EAAGG,EAASX,EAAOC,EAAOC,EAAOU,GAC/EP,EAAaI,oBAAsBN,EAEnCE,EAAaK,cAGf92B,oBAAoB4Z,EAAUsd,GAE5B,IAAK,IAAI3vB,EAAI,EAAGA,EAAItH,KAAK80B,cAAchvB,OAAQwB,IAEzC2vB,EAAgB,GAAKj3B,KAAK80B,cAAcxtB,GAAGuvB,YAAc,IAEjB,IAAtC72B,KAAK80B,cAAcxtB,GAAGuvB,aAExB72B,KAAKk3B,8BAA8Bvd,EAAU3Z,KAAK80B,cAAcxtB,IAE9DtH,KAAK80B,cAAcxtB,GAAGuvB,YAAc,GAEtC72B,KAAKm3B,2BAA2Bxd,EAAU3Z,KAAK80B,cAAcxtB,IAG/DtH,KAAK80B,cAAcxtB,GAAGuvB,YAAc,EAEpCI,KAKNl3B,0BAEEC,KAAKk1B,oBAAsB,EAC3B,IAAK,IAAI5tB,EAAI,EAAGA,EAAItH,KAAK80B,cAAchvB,OAAQwB,IAEzCtH,KAAK80B,cAAcxtB,GAAGuvB,YAAc,GAEtC72B,KAAKk1B,sBAGT,OAAOl1B,KAAKk1B,oBAGdn1B,2BAA2B4Z,EAAUyd,GAGnCA,EAAatM,IAAI7L,aAAc,EAC/BtF,EAAS0d,qBACPr3B,KAAKg1B,YACLoC,EAAazkB,IACbykB,EAAatM,KAIjB/qB,8BAA8B4Z,EAAUyd,GAGtC,MAAME,EAAQF,EAAaR,qBACZ,IAAXU,IAKJt3B,KAAKi1B,aAAa9sB,EAAIvB,KAAKqC,MAAMquB,EAAQt3B,KAAK60B,aAC9C70B,KAAKi1B,aAAa/sB,EAAIovB,EAAQt3B,KAAK60B,YAAc70B,KAAKi1B,aAAa9sB,EACnEwR,EAAS0d,qBACPr3B,KAAKi1B,aACLmC,EAAaT,UACbS,EAAatM,MAIjB/qB,WAEE,OAAO,IAAIkjB,EAAKjjB,KAAK4iB,SAAU5iB,KAAK8iB,UAGtC/iB,gBAAgBy2B,EAAcc,EAAOpB,EAASC,EAAOC,EAAOC,GAEtDF,IAEFK,EAAa/jB,MAAMzM,KAAa,EAARsxB,EAAY,GAAKpB,EAAQhuB,GAE/CkuB,IAEFI,EAAa/jB,MAAMzM,KAAa,EAARsxB,EAAY,GAAKpB,EAAQ/tB,GAE/CkuB,IAEFG,EAAa/jB,MAAMzM,KAAa,EAARsxB,EAAY,GAAKpB,EAAQvtB,GAIrD5I,iBAAiBy2B,EAAcc,EAAOR,EAASX,EAAOC,EAAOC,EAAOU,GAE9DZ,IAEFK,EAAa/jB,MAAMzM,KAAa,EAARsxB,EAAY,GAAKR,EAAQ5uB,GAE/CkuB,IAEFI,EAAa/jB,MAAMzM,KAAa,EAARsxB,EAAY,GAAKR,EAAQ3uB,GAE/CkuB,IAEFG,EAAa/jB,MAAMzM,KAAa,EAARsxB,EAAY,GAAKR,EAAQnuB,GAE/CouB,IAEFP,EAAa/jB,MAAMzM,KAAa,EAARsxB,EAAY,GAAKR,EAAQpuB,GAIrD3I,yBAAyBy2B,EAAce,GAErC,IAAK,IAAIjwB,EAAI,EAAGA,EAAItH,KAAK60B,YAAc70B,KAAK60B,YAAavtB,IAEvDtH,KAAK02B,gBAAgBF,EAAa7jB,IAAKrL,EAAGiwB,GAAI,GAAM,GAAM,GAC1Df,EAAaK,cAIjB92B,0BAA0By2B,EAAcgB,GAEtC,IAAK,IAAIlwB,EAAI,EAAGA,EAAItH,KAAK60B,YAAc70B,KAAK60B,YAAavtB,IAEvDtH,KAAKg3B,iBAAiBR,EAAa7jB,IAAKrL,EAAGkwB,GAAI,GAAM,GAAM,GAAM,GACjEhB,EAAaK,cAIjB92B,qBAAqBse,GAEnB,MAAMrY,EAAO,IAAIyxB,WAAW,EAAIpZ,EAAQA,GACxC,OAAO,IAAIqZ,EAAY1xB,EAAMqY,EAAOA,EAAOsZ,GAG7C53B,sBAAsBse,GAEpB,MAAMrY,EAAO,IAAIyxB,WAAW,EAAIpZ,EAAQA,GACxC,OAAO,IAAIqZ,EAAY1xB,EAAMqY,EAAOA,EAAOoT,GAG7C1xB,4BAA4Bse,GAE1B,MAAMrY,EAAO,IAAIisB,aAAa,EAAI5T,EAAQA,GAC1C,OAAO,IAAIqZ,EAAY1xB,EAAMqY,EAAOA,EAAOoT,EAAYI,GAGzD9xB,mBAAmBq1B,GAEjB,IAAK,IAAI9tB,EAAI,EAAGA,EAAItH,KAAK80B,cAAchvB,OAAQwB,IAE7C,GAAItH,KAAK80B,cAAcxtB,GAAGtG,OAASo0B,EAEjC,OAAOp1B,KAAK80B,cAAcxtB,GAG9B3D,QAAQG,MAAM,gBAAkBsxB,EAAe,mBAIjDr1B,mBAAmBiB,GAEjB,IAAK,IAAIsG,EAAI,EAAGA,EAAItH,KAAK+0B,aAAajvB,OAAQwB,IAE5C,GAAItH,KAAK+0B,aAAaztB,KAAOtG,EAE3B,OAAOsG,EAGX3D,QAAQG,MAAM,YAAc9C,EAAO,mCAIrCjB,mBAAmBq1B,EAAcrK,EAAa6M,EAAaC,GAczD,OAZAD,EAAY3Y,aAAc,EAE1Bjf,KAAK80B,cAActtB,KAAK,CACtBxG,KAAMo0B,EACNziB,IAAKoY,EACLD,IAAK8M,EACLjB,UAAWkB,EACXjB,qBAAsB,EACtBC,YAAa,IAGf72B,KAAKga,SAASob,GAAgB,CAAExvB,MAAOgyB,GAChC53B,KAAK80B,cAAc90B,KAAK80B,cAAchvB,OAAS,GAGxD/F,UAEE,IAAK,IAAIuH,EAAI,EAAGA,EAAItH,KAAK80B,cAAchvB,OAAQwB,IAE7CtH,KAAK80B,cAAcxtB,GAAGqL,IAAIkQ,UAC1B7iB,KAAK80B,cAAcxtB,GAAGwjB,IAAIjI,UAC1B7iB,KAAK80B,cAAcxtB,GAAGqvB,UAAU9T,WCtPtC,MAAMiV,GAAmB,IAvDzB,MAEE/3B,OAEEC,KAAK+3B,QAAU,GAGjBh4B,MAAMi4B,GAEJ,MAAMC,EAAoB,GACpBC,EAAgBjyB,GAAMkyB,eAAevxB,KAAK2F,KAAKyrB,EAAkBlyB,SAGvE9F,KAAKo4B,gBAAgBH,EAAmBC,GAExC,IAAIG,EAAW,EAEf,IAAK,IAAI/wB,EAAI,EAAGA,EAAI0wB,EAAkBlyB,OAAQwB,IAC9C,CACE,MAAMgxB,EAAeN,EAAkB1wB,GAAG0G,aAAa,YAAYuqB,MAC7DpwB,EAAIvB,KAAKqC,MAAM3B,EAAI4wB,GACnBhwB,EAAIZ,EAAI4wB,EAAgB/vB,EAC9B,IAAK,IAAIowB,EAAQ,EAAGA,EAAQD,EAAcC,IAExCN,EAAkBI,GAAanwB,EAAIgwB,EAAiB,GAAMA,EAC1DD,EAAkBI,EAAW,GAAMlwB,EAAI+vB,EAAiB,GAAMA,EAC9DG,GAAY,EAIhB,MAAMG,EAAmB,IAAIC,EAAgB,IAAIxG,aAAagG,GAAoB,GAC5EjU,EAAkBC,GAAoBC,sBAAsB8T,GAIlE,OAHAhU,EAAgBlG,aAAa,mBAAoB0a,GAEjDx4B,KAAK+3B,QAAQvwB,KAAK,IAAIotB,GAAc5Q,EAAiBkU,IAC9Cl4B,KAAK+3B,QAAQ/3B,KAAK+3B,QAAQjyB,OAAS,GAG5C/F,oBAAoB4Z,GAElB,IAAK,IAAIrS,EAAI,EAAGA,EAAItH,KAAK+3B,QAAQjyB,OAAQwB,IAEvCtH,KAAK+3B,QAAQzwB,GAAGoxB,oBAAoB/e,EAAU,GAIlD5Z,gBAAgB44B,EAAKT,GAEnB,IAAK,IAAI5wB,EAAI,EAAGA,EAAI4wB,EAAgBA,EAAgB,EAAG5wB,IAErDqxB,EAAInxB,KAAK,KCgCV,MAACoxB,GAAK,IAlFX,MAEE74B,KAAK84B,GAEH74B,KAAK64B,MAAQA,EACb74B,KAAK84B,YAAc,GACnB94B,KAAK+4B,oBAAsB,IAAIhlB,EAC/B/T,KAAKg5B,SAAW,IAAIxW,EACpBxiB,KAAKg5B,SAASC,uBAAwB,EACtCj5B,KAAKg5B,SAAS/R,eAAgB,EAE9BjnB,KAAKk5B,SAAW,IAAI1W,EACpBxiB,KAAKk5B,SAASD,uBAAwB,EACtCj5B,KAAKk5B,SAASjS,eAAgB,EAE9BjnB,KAAKm5B,UAAY,IAAItO,GAAoB,EAAG,EAAG,GAAI,GAAI,IAAK,KAG9D9qB,eAAeq5B,GAEb,MAAM9B,EAAQt3B,KAAK84B,YAAYn4B,QAAQy4B,GACnC9B,GAAS,GAEXt3B,KAAK84B,YAAY12B,OAAOk1B,EAAO,GAGjCt3B,KAAKg5B,SAAS5f,OAAOggB,GACrBp5B,KAAKk5B,SAAS9f,OAAOggB,GAErBA,EAAKvW,UAGP9iB,yBAAyBq5B,GAEvBp5B,KAAK84B,YAAYtxB,KAAK4xB,GACtBp5B,KAAKg5B,SAASnwB,IAAIuwB,GAElBA,EAAKC,qCAGPt5B,wBAAwBq5B,GAEtBp5B,KAAK84B,YAAYtxB,KAAK4xB,GACtBp5B,KAAKk5B,SAASrwB,IAAIuwB,GAElBA,EAAKE,oCAGPv5B,SAMEC,KAAKm5B,UAAU/K,yBAEfpuB,KAAK+4B,oBAAoBjT,KAAK9lB,KAAK64B,MAAMU,KACzC,IAAK,IAAIjyB,EAAI,EAAGA,EAAItH,KAAK84B,YAAYhzB,OAAQwB,IAE3CtH,KAAK84B,YAAYxxB,GAAGkyB,aAAax5B,KAAK+4B,qBAI1Ch5B,OAAO4Z,GAGD3Z,KAAKg5B,SAASjW,SAASjd,OAAS,GAElCssB,GAAS9I,OAAOtpB,KAAKg5B,SAAUh5B,KAAKm5B,WAElCn5B,KAAKk5B,SAASnW,SAASjd,OAAS,GAElCssB,GAAS9I,OAAOtpB,KAAKk5B,SAAU3P,GAAc3d,SAIjD7L,QAEEC,KAAKy5B,6BAA0Bz1B,IClFnC,MAAM01B,GAEJ35B,cAEEC,KAAKkoB,OAAS,IAAI7E,EAGpBtjB,WAAWkH,EAAQ0yB,EAAmBC,EAAcnU,GAElDzlB,KAAKkoB,OAAOvG,cAAc1a,GAE1B,MAAM4yB,EAAQ5zB,GAAM6zB,SAASF,EAAe,GACtCG,EAAS,EAAInzB,KAAKozB,KAAKpzB,KAAKqzB,IAAIJ,GAASpU,GAAW,EAEpDyU,EAAkBl6B,KAAKm6B,oBAAoBR,EAAmBE,GAC9DO,EAAoBp6B,KAAKq6B,sBAAsBV,EAAmBE,GAClES,EAAoBt6B,KAAKu6B,sBAAsBZ,EAAmBI,GAClES,EAAqBx6B,KAAKy6B,uBAAuBd,EAAmBI,GAEpEW,EAAqB,IAAItzB,EAAQ,EAAG,GAAI,GAAGuzB,gBAAgBhB,GAE3DiB,EAAgB56B,KAAKkoB,OAAOtf,OAAOzD,QAEnC01B,EAAqB76B,KAAK86B,yBAA8C,EAArB96B,KAAKkoB,OAAO/I,OAAiC,EAArBnf,KAAKkoB,OAAO/I,OAAYya,EAAcnU,GACjHsV,EAAUH,EAAcz1B,QAAQ0D,IAAI6xB,EAAmBv1B,QAAQ2D,gBAAqC,EAAtB+xB,IAE9EG,GAAc,IAAIC,GAAQC,8BAA8BhB,EAAiBa,GACzEI,GAAc,IAAIF,GAAQC,8BAA8Bd,EAAmBW,GAE3EK,GAAe,IAAIH,GAAQC,8BAA8BZ,EAAmBS,GAC5EM,GAAe,IAAIJ,GAAQC,8BAA8BV,EAAoBO,GAEnF/6B,KAAKs7B,+BAA+BP,EAAS9zB,EAAQ0yB,EAAmBqB,EAAUG,EAAYC,EAAYC,GAE1GL,EAASE,8BAA8BhB,EAAiBa,GACxDI,EAAWD,8BAA8Bd,EAAmBW,GAE5DK,EAAWF,8BAA8BZ,EAAmBS,GAC5DM,EAAYH,8BAA8BV,EAAoBO,GAE9D,IAAIQ,EAAmB1vB,EAAAA,EAEvB,MAAM2vB,EAAcd,EAAmBv1B,QAAQ2D,gBAAqC,EAAtB+xB,GAC9D,IAAK,IAAIvzB,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAM0f,EAAO,IAAIyU,EAAMx0B,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ0D,IAAI2yB,IAE1DE,EAAwB,IAAIt0B,EAC5Bu0B,EAAyB,IAAIv0B,EAE7Bw0B,EAA0B,IAAIx0B,EAC9By0B,EAA0B,IAAIz0B,EAEpC4zB,EAASc,cAAc9U,EAAO0U,GAC9BP,EAAWW,cAAc9U,EAAM2U,GAE/BP,EAAWU,cAAc9U,EAAO4U,GAChCP,EAAYS,cAAc9U,EAAM6U,GAE5BH,EAAqB51B,SAAW,MAElCnC,QAAQ2H,IAAI,4BAA6BhE,GAEvCq0B,EAAuB71B,SAAW,MAEpCnC,QAAQ2H,IAAI,8BAA+BhE,GAEzCs0B,EAAuB91B,SAAW,MAEpCnC,QAAQ2H,IAAI,8BAA+BhE,GAEzCu0B,EAAwB/1B,SAAW,MAErCnC,QAAQ2H,IAAI,+BAAgChE,GAG9C,MAAMy0B,EAAoB90B,EAAOK,GAAGnC,QAAQmiB,IAAIoU,GAAsB51B,SAChEk2B,EAAoB/0B,EAAOK,GAAGnC,QAAQmiB,IAAIqU,GAAwB71B,SAElEm2B,EAAsBh1B,EAAOK,GAAGnC,QAAQmiB,IAAIsU,GAAwB91B,SACpEo2B,EAAsBj1B,EAAOK,GAAGnC,QAAQmiB,IAAIuU,GAAyB/1B,SAErEq2B,EAAkBv1B,KAAKN,IAAIy1B,EAAiBC,GAC5CI,EAAkBx1B,KAAKN,IAAI21B,EAAmBC,GAE9C51B,EAAMM,KAAKN,IAAI61B,EAAcC,GAE/B91B,EAAMi1B,IAERA,EAAmBj1B,GAIvB,MAAM+1B,EAAqB3B,EAAmBv1B,QAAQ2D,eAAeyyB,GAGrE,OAFyBR,EAAQ51B,QAAQ0D,IAAIwzB,GAK/Ct8B,+BAA+Bu8B,EAAYr1B,EAAQ0yB,EAAmBqB,EAAUG,EAAYC,EAAYC,GAEtG,MAAMkB,EAAkBv8B,KAAKw8B,wBAAwBv1B,EAAQk0B,EAAYH,EAAUrB,GAC7E8C,EAAoBz8B,KAAK08B,0BAA0Bz1B,EAAQm0B,EAAYC,EAAa1B,GAE1F2C,EAAWzzB,IAAI0zB,GACfD,EAAWzzB,IAAI4zB,GAGjB18B,wBAAwBkH,EAAQk0B,EAAYH,EAAUrB,GAEpD,IAAIgD,EAA+B9wB,EAAAA,EAC/B+wB,EAAkC/wB,EAAAA,EAItC,MAAMgxB,EAAS,IAAIz1B,EAAQ,EAAG,EAAG,GAAGuzB,gBAAgBhB,GACpD,IAAK,IAAIryB,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAMw1B,EAAc,IAAIrB,EAAMx0B,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ0D,IAAIg0B,EAAO13B,QAAQ2D,gBAAgB,OAChGi0B,EAAc,IAAItB,EAAMx0B,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ0D,IAAIg0B,EAAO13B,QAAQ2D,eAAe,OAE/F6yB,EAA0B,IAAIv0B,EAC9Bs0B,EAAuB,IAAIt0B,EAEjC+zB,EAAWW,cAAcgB,EAAYnB,GACrCX,EAASc,cAAciB,EAASrB,GAEhC,MAAMsB,EAAcrB,EAAuBtU,WAAWpgB,EAAOK,IACvD21B,EAAcvB,EAAqBrU,WAAWpgB,EAAOK,IAEvDo0B,EAAqB51B,SAAW,MAElCnC,QAAQ2H,IAAI,qCAAsChE,GAEhDq0B,EAAuB71B,SAAW,MAEpCnC,QAAQ2H,IAAI,uCAAwChE,GAGlD01B,EAAYJ,IAEdA,EAAiCI,GAG/BC,EAAUN,IAEZA,EAA+BM,GAKnC,MAAMC,GAAcP,EAA+BC,GAAkC,EAGrF,OAAOC,EAAO13B,QAAQ2D,gBAAgBo0B,GAGxCn9B,0BAA0BkH,EAAQm0B,EAAYC,EAAa1B,GAEzD,IAAIwD,EAAkCtxB,EAAAA,EAClCuxB,EAAkCvxB,EAAAA,EAItC,MAAMwxB,EAAY,IAAIj2B,EAAQ,EAAG,EAAG,GAAGuzB,gBAAgBhB,GAEvD,IAAK,IAAIryB,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAMg2B,EAAa,IAAI7B,EAAMx0B,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ0D,IAAIw0B,EAAUl4B,QAAQ2D,gBAAgB,OAClGy0B,EAAa,IAAI9B,EAAMx0B,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ0D,IAAIw0B,EAAUl4B,QAAQ2D,eAAe,OAEjG8yB,EAA0B,IAAIx0B,EAC9By0B,EAA0B,IAAIz0B,EAEpCg0B,EAAWU,cAAcwB,EAAY1B,GACrCP,EAAYS,cAAcyB,EAAY1B,GAEtC,MAAM2B,EAAa5B,EAAuBvU,WAAWpgB,EAAOK,IACtDm2B,EAAa5B,EAAwBxU,WAAWpgB,EAAOK,IAEzDs0B,EAAuB91B,SAAW,MAEpCnC,QAAQ2H,IAAI,8BAA+BhE,GAEzCu0B,EAAwB/1B,SAAW,MAErCnC,QAAQ2H,IAAI,+BAAgChE,GAG1Ck2B,EAAYJ,IAEdA,EAAiCI,GAG/BC,EAAaN,IAEfA,EAAkCM,GAKtC,MAAMP,GAAcC,EAAkCC,GAAkC,EAGxF,OAAOC,EAAUl4B,QAAQ2D,gBAAgBo0B,GAG3Cn9B,oBAAoB45B,EAAmBE,GAErC,MAAMK,EAAkB,IAAI9yB,EAAQ,GAAI,EAAG,GAG3C,OAFA8yB,EAAgBS,iBAAgB,IAAI+C,GAAaC,iBAAiB,IAAIv2B,EAAQ,EAAG,EAAG,GAAIyyB,IACxFK,EAAgBS,gBAAgBhB,GACzBO,EAGTn6B,sBAAsB45B,EAAmBE,GAEvC,MAAMO,EAAoB,IAAIhzB,EAAQ,EAAG,EAAG,GAG5C,OAFAgzB,EAAkBO,iBAAgB,IAAI+C,GAAaC,iBAAiB,IAAIv2B,EAAQ,EAAG,EAAG,IAAKyyB,IAC3FO,EAAkBO,gBAAgBhB,GAC3BS,EAGTr6B,sBAAsB45B,EAAmBI,GAEvC,MAAMO,EAAoB,IAAIlzB,EAAQ,EAAG,EAAG,GAG5C,OAFAkzB,EAAkBK,iBAAgB,IAAI+C,GAAaC,iBAAiB,IAAIv2B,EAAQ,EAAG,EAAG,GAAI2yB,IAC1FO,EAAkBK,gBAAgBhB,GAC3BW,EAGTv6B,uBAAuB45B,EAAmBI,GAExC,MAAMS,EAAqB,IAAIpzB,GAAS,EAAG,EAAG,GAG9C,OAFAozB,EAAmBG,iBAAgB,IAAI+C,GAAaC,iBAAiB,IAAIv2B,EAAQ,EAAG,EAAG,IAAK2yB,IAC5FS,EAAmBG,gBAAgBhB,GAC5Ba,EAGTz6B,yBAAyBse,EAAOa,EAAQ0a,EAAcnU,GAEpD,MAAMoU,EAASD,EAAe,EAAKhzB,KAAK2B,GAAK,IACvCwxB,EAAS,EAAInzB,KAAKozB,KAAKpzB,KAAKqzB,IAAIJ,GAASpU,GAAW,EAEpDmY,EAAQ1e,EAAStY,KAAKqzB,IAAIJ,GAC1BgE,EAAQxf,EAAQzX,KAAKqzB,IAAIF,GAC/B,OAAOnzB,KAAKL,IAAIK,KAAKqB,IAAI41B,GAAQj3B,KAAKqB,IAAI21B,KCvP9C,MAAME,GAEJ/9B,eAKAA,WAAWkH,EAAQ0yB,EAAmBC,EAAcnU,GAElD,MAAMsY,EAAsBpE,EAAkBx0B,QAAQ64B,UAEhDC,EAAkB,GAExB,IAAK,IAAI32B,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IAEjC22B,EAAgBz2B,KAAKP,EAAOK,GAAGnC,QAAQw1B,gBAAgBoD,IAGzD,MAAMlW,GAAM,IAAIC,GAAOnG,cAAcsc,GAC/B/6B,EAAO,IAAIkE,EACjBygB,EAAIuD,QAAQloB,GAEZ,MAAM4I,EAAW9L,KAAK86B,yBAAyB53B,EAAKgF,EAAI,EAAGhF,EAAKiF,EAAI,EAAGyxB,EAAcnU,GAE/E7c,EAAS,IAAIxB,EAKnB,OAJAygB,EAAIqW,UAAUt1B,GAEdA,EAAO+xB,gBAAgBhB,GAEhB,CACL/wB,OAAQA,EACRu1B,mBAAoBryB,GAIxB/L,yBAAyBse,EAAOa,EAAQ0a,EAAcnU,GAEpD,MAAMoU,EAASD,EAAe,EAAKhzB,KAAK2B,GAAK,IACvCwxB,EAAS,EAAInzB,KAAKozB,KAAKpzB,KAAKqzB,IAAIJ,GAASpU,GAAW,EAEpDmY,EAAQ1e,EAAStY,KAAKqzB,IAAIJ,GAC1BgE,EAAQxf,EAAQzX,KAAKqzB,IAAIF,GAC/B,OAAOnzB,KAAKL,IAAIK,KAAKqB,IAAI41B,GAAQj3B,KAAKqB,IAAI21B,KC0OzC,MAACQ,GAAmB,IAzQzB,MAEEr+B,KAAK84B,GAEH74B,KAAKq+B,QAAU,IAAIC,EACnBt+B,KAAKkH,MAAQ,IAAI+zB,EACjBj7B,KAAKu+B,IAAM,IAAIC,EAEfx+B,KAAKy+B,SAAW,IAAIr3B,EACpBpH,KAAK0+B,WAAa,IAAIt3B,EAEtBpH,KAAK64B,MAAQA,EAGf94B,WAAW4c,GAETA,EAASA,GAAU4M,GAAc3d,QACjC,MAAM+yB,EAAU,IAAIv3B,EAKpB,OAHAu3B,EAAQpiB,IAAI,EAAG,EAAG,GAClBoiB,EAAQhE,gBAAgBhe,EAAOyH,YAExBua,EAGT5+B,gBAAgB4c,GAEdA,EAASA,GAAU4M,GAAc3d,QACjC,MAAM+yB,EAAU,IAAIv3B,EAKpB,OAHAu3B,EAAQpiB,IAAI,EAAG,GAAI,GACnBoiB,EAAQhE,gBAAgBhe,EAAOyH,YAExBua,EAGT5+B,cAAc4c,GAEZA,EAASA,GAAU4M,GAAc3d,QACjC,MAAM+yB,EAAU,IAAIv3B,EAIpB,OAFAu3B,EAAQpiB,IAAI,EAAG,EAAG,GAClBoiB,EAAQhE,gBAAgBhe,EAAOyH,YACxBua,EAGT5+B,yBAAyBw5B,EAAK5c,GAE5BA,EAASA,GAAU4M,GAAc3d,QACjC,MAAM+yB,EAAU,IAAIv3B,EAEdyyB,EAASld,EAAO6I,IAAM,EAAK5e,KAAK2B,GAAK,IACrCwxB,EAAS,EAAInzB,KAAKozB,KAAKpzB,KAAKqzB,IAAIJ,GAASld,EAAO8I,QAAW,EAE3DmY,EAAQh3B,KAAKqzB,IAAIJ,GAASld,EAAOgJ,IACjCkY,EAAQj3B,KAAKqzB,IAAIF,GAASpd,EAAOgJ,IAIvC,OAFAgZ,EAAQpiB,IAAIshB,EAAQtE,EAAIrxB,EAAG01B,EAAQrE,EAAIpxB,GAAIwU,EAAOgJ,KAAKY,YAEhDoY,EAAQhE,gBAAgBhe,EAAOyH,YAGxCrkB,uBAAuB6+B,EAAgBC,EAActF,EAAK5c,GAExDA,EAASA,GAAU4M,GAAc3d,QACjC2tB,EAAMA,GAAOv5B,KAAK64B,MAAMU,IAExB,MAAMoF,EAAU,IAAIv3B,EAcpB,OAZApH,KAAKkH,MAAMg0B,8BAA8B2D,GAAgB7+B,KAAK8+B,gBAAgBniB,GAASiiB,GACnFjiB,EAAOoiB,oBAET/+B,KAAKu+B,IAAIhiB,IAAII,EAAO6H,SAAUxkB,KAAKg/B,yBAAyBzF,EAAK5c,KAIjE3c,KAAK0+B,WAAWniB,IAAIgd,EAAIrxB,EAAGqxB,EAAIpxB,EAAG,GAAG82B,UAAUtiB,GAC/C3c,KAAKu+B,IAAIhiB,IAAII,EAAO6H,SAAUxkB,KAAK0+B,aAGrC1+B,KAAKu+B,IAAIW,eAAel/B,KAAKkH,MAAOy3B,GAC7BA,EAGT5+B,qBAAqBkH,EAAQk4B,EAAa,GAExC,MACMC,GADgB,IAAI/b,GAAS1B,cAAc1a,GACR2B,OACnCy2B,EAAiBr/B,KAAK8+B,gBAAgBvV,GAAc3d,SAASzG,QAE7D+B,GAAQ,IAAI+zB,GAAQC,8BAA8BmE,EAAgBD,GAElE/3B,EAAkBpB,GAAMq5B,wBAAwBr4B,EAAQC,GAExDq4B,EAA0B,IAAIn4B,EACpC,IAAIygB,GAAO,IAAIC,GAAOnG,cAActa,GACpCwgB,EAAIqW,UAAUqB,GAEd,MAAMC,EAAK,IAAIp4B,EAAQ,EAAG,EAAG,GAAGuzB,gBAAgBpR,GAAc3d,QAAQwY,YAChEqb,EAAQD,EAAGr6B,QAAQu6B,MAAML,GAAgB9Y,YACzC+E,GAAM,IAAIgT,GAAU/hB,IAAIkjB,EAAMv3B,EAAGs3B,EAAGt3B,EAAGm3B,EAAen3B,EAAGk3B,EAAmBl3B,EAChFu3B,EAAMt3B,EAAGq3B,EAAGr3B,EAAGk3B,EAAel3B,EAAGi3B,EAAmBj3B,EACpDs3B,EAAM92B,EAAG62B,EAAG72B,EAAG02B,EAAe12B,EAAGy2B,EAAmBz2B,EACpD,EAAM,EAAkB,EAAU,GAE9Bg3B,GAAc,IAAIrB,GAAUsB,WAAWtU,GAC7C,IAAK,IAAIhkB,EAAI,EAAGA,EAAID,EAAgBvB,OAAQwB,IAE1CD,EAAgBC,GAAGu4B,aAAaF,GAGlC,MAAMz8B,EAAO,IAAIkE,EACjBygB,GAAO,IAAIC,GAAOnG,cAActa,GAChCwgB,EAAIuD,QAAQloB,GACZA,EAAK4F,eAAeq2B,GACpB,MAAMW,EAAmB,IAAI14B,EAG7B,OAFAygB,EAAIqW,UAAU4B,GAEP,CACLtb,SAAU+a,EACV9tB,KAAMzR,KAAK+/B,qBAAqB78B,EAAKgF,EAAI,EAAGhF,EAAKiF,EAAI,IAIzDpI,qBAAqBse,EAAOa,GAE1B,MAAM2a,EAAStQ,GAAc3d,QAAQ4Z,IAAM,EAAK5e,KAAK2B,GAAK,IACpDwxB,EAAS,EAAInzB,KAAKozB,KAAKpzB,KAAKqzB,IAAIJ,GAAStQ,GAAc3d,QAAQ6Z,QAAW,EAE1EmY,EAAQ1e,EAAStY,KAAKqzB,IAAIJ,GAC1BgE,EAAQxf,EAAQzX,KAAKqzB,IAAIF,GAE/B,OAAOnzB,KAAKL,IAAIK,KAAKqB,IAAI41B,GAAQj3B,KAAKqB,IAAI21B,IAG5C79B,oBAAoB+oB,EAAInM,GAEtB,GAAIA,EAAOqjB,qBACX,CACElX,EAAGsC,QAAQprB,KAAKy+B,UAEhB,MAAMwB,EAAQjgC,KAAKy+B,SAASv2B,EACtBg4B,EAAQlgC,KAAKy+B,SAASt2B,EACtBg4B,EAAgBF,EAAQC,EAC9B,OAAI9Z,GAAQrB,aAAeob,EAAgB,EAElC/Z,GAAQlH,OAASghB,EAIjB9Z,GAAQ/H,MAAQ4hB,EAI3B,CAEE,MAAM/8B,EAAO,IAAIkE,EAEjB,OADA0hB,EAAGsC,QAAQloB,GACJlD,KAAK+/B,qBAAqB78B,EAAKgF,EAAGhF,EAAKiF,IAIlDpI,oBAAoBqgC,EAAQzjB,GAE1BA,EAASA,GAAU4M,GAAc3d,QACjC,MAAM+yB,EAAU,IAAIv3B,EAOpB,OALAg5B,EAAOC,iBAAiB1B,GACxBA,EAAQ2B,QAAQ3jB,GAEhBgiB,EAAQz2B,GAAiB,GAAZy2B,EAAQz2B,EAAU,IAAQke,GAAa,MACpDuY,EAAQx2B,GAAK,GAAiB,GAAZw2B,EAAQx2B,EAAU,KAAQie,GAAQlH,OAC7Cyf,EAGT5+B,oBAAoBmnB,EAAKvK,GAEvBA,EAASA,GAAU4M,GAAc3d,QACjC,MAAM+yB,EAAU,IAAIv3B,EAOpB,OALAu3B,EAAQ7Y,KAAKoB,GACbyX,EAAQ2B,QAAQ3jB,GAEhBgiB,EAAQz2B,GAAiB,GAAZy2B,EAAQz2B,EAAU,IAAQke,GAAa,MACpDuY,EAAQx2B,GAAK,GAAiB,GAAZw2B,EAAQx2B,EAAU,KAAQie,GAAQlH,OAC7Cyf,EAGT5+B,kBAAkB4c,GAEhBA,EAAO4jB,MAAUna,GAAQ/H,MAAQ,EACjC1B,EAAO8iB,MAASrZ,GAAQ/H,MAAQ,EAChC1B,EAAO6jB,IAASpa,GAAQlH,OAAS,EACjCvC,EAAO8jB,QAAUra,GAAQlH,OAAS,EAClCvC,EAAO8I,OAASW,GAAQrB,aACxBpI,EAAOyR,wBAAuB,GAGhCruB,wBAAwB4c,EAAQmM,EAAI1H,EAAQ,GAE1C,MAAMoC,EAAM,IAAIpc,EAChBoc,EAAIsC,KAAKgD,EAAGviB,KAAK+gB,IAAIwB,EAAGxiB,KAExB,MAAMo6B,EAAK5X,EAAGxiB,IAAInB,QAEZw7B,EAAKD,EAAGv7B,QAAQ0D,IAAI,IAAIzB,EAAQoc,EAAItb,EAAG,EAAG,IAC1C04B,EAAKF,EAAGv7B,QAAQ0D,IAAI,IAAIzB,EAAQ,EAAGoc,EAAIrb,EAAG,IAC1C04B,EAAKH,EAAGv7B,QAAQ0D,IAAI,IAAIzB,EAAQ,EAAG,EAAGoc,EAAI7a,IAE1Cm4B,EAAKJ,EAAGv7B,QAAQ0D,IAAI,IAAIzB,EAAQoc,EAAItb,EAAG,EAAGsb,EAAI7a,IAC9Co4B,EAAKL,EAAGv7B,QAAQ0D,IAAI,IAAIzB,EAAQ,EAAGoc,EAAIrb,EAAGqb,EAAI7a,IAC9Cq4B,EAAKlY,EAAGviB,IAAIpB,QACZ87B,EAAKP,EAAGv7B,QAAQ0D,IAAI,IAAIzB,EAAQoc,EAAItb,EAAGsb,EAAIrb,EAAG,IACpD,OAAOnI,KAAKkhC,WAAWvkB,EAAQ,CAAC+jB,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,GAAK7f,GAGnErhB,WAAW4c,EAAQ1V,EAAQk4B,EAAa,GAEtC,GAAIxiB,EAAOoiB,oBACX,CACE,MAAMrE,EAAqB,IAAItzB,EAAQ,EAAG,GAAI,GAAGuzB,gBAAgBhe,EAAOyH,YAClE+c,EAAsBzG,EAAmBv1B,QAAQ2D,gBAAgB,GAEjEs4B,EAAS,IAAI1H,GAEb3U,EAAeqB,GAAQrB,aAEvBsc,EAAaD,EAAOF,WAAWj6B,EAAQ0V,EAAOyH,WAAYzH,EAAO6I,IAAM2Z,EAAYpa,GACnF8C,GAAM,IAAIC,GAAOnG,cAAc1a,GAC/B2B,EAAS,IAAIxB,EACnBygB,EAAIqW,UAAUt1B,GAEd,MAAM04B,GAA2B,IAAIrG,GAAQC,8BAA8BiG,EAAqBv4B,GAE1F24B,EAAa,IAAI/C,EAAI6C,EAAY3G,GAEjC8G,EAAqB,IAAIp6B,EAC/Bm6B,EAAWrC,eAAeoC,EAA0BE,GAIpD,MAAO,CACL/vB,KAHW4vB,EAAWha,WAAWma,GAIjCA,mBAAoBA,EACpBC,gBAAiBJ,GAIrB,CACE,MACMK,GADS,IAAI5D,IACGoD,WAAWj6B,EAAQjH,KAAK2hC,mBAAoBhlB,EAAO6I,IAAM2Z,EAAY/Y,GAAQrB,cAEnG/kB,KAAKwhC,mBAAmB1b,KAAK4b,EAAO94B,QACpC5I,KAAK4hC,eAAiBF,EAAOvD,mBAE7B,MAAM0D,EAAU,IAAIz6B,EAAQ,EAAG,EAAG,GAAGuzB,gBAAgBhe,EAAOyH,YAC5D,MAAO,CACL3S,KAAMiwB,EAAOvD,mBACbqD,mBAAoBE,EAAO94B,OAC3B64B,gBAAiBI,EAAQ/4B,eAAe44B,EAAOvD,wBC3NlD,MAAC2D,GAAc,IApCpB,MAEE/hC,eAIAA,KAAK84B,GAEHtP,GAAcwY,OACdC,GAAgBD,KAAKlJ,GACrBrL,GAAauU,OACb1U,GAAc0U,OACd3vB,GAAa2vB,OACbE,GAAgBF,OAEhBG,GAAGH,OACH59B,GAAQ49B,OACRI,GAAuBJ,OACvB/oB,GAAkB+oB,OAClBnZ,GAAamZ,OACb3b,GAAQ2b,OACR3rB,GAAK2rB,OACLK,GAAGL,KAAKlJ,GAERwJ,GAAMN,OAGRhiC,QAAQuiC,GAENlQ,GAASvP,UACT+F,GAAa/F,UAEbyf,EAAYzf,sNCrChB,MAAM0f,WAAqBhoB,GAEzBxa,cAEEgN,o2DAAY+M,IAEZ9Z,KAAKga,SAASwoB,mBAAqB,CAAE58B,MAAO,IAAI04B,GAChDt+B,KAAKga,SAASyoB,kBAAqB,CAAE78B,MAAO,IAAI04B,GAEhDt+B,KAAKga,SAAS0oB,MAAY,CAAE98B,MAAO,OACnC5F,KAAKga,SAAS2oB,QAAY,CAAE/8B,MAAO,IACnC5F,KAAKga,SAAS6P,UAAY,CAAEjkB,MAAO,KAEnC5F,KAAKga,SAAS4oB,cAAgB,CAAEh9B,MAAO5F,KAAK6iC,uBAC5C7iC,KAAKga,SAAS8oB,gBAAkB,CAAEl9B,MAAO5F,KAAK+iC,yBAGhDhjC,sBAEE,MAAMijC,EAAgB,GAGtB,IAAK,IAAI17B,EAAI,EAAGA,EAFI,GAEaA,IACjC,CACE,MAAMkc,EAAM,IAAIpc,EAAwB,EAAhBR,KAAKsC,SAAe,EAC1B,EAAhBtC,KAAKsC,SAAe,EACpBtC,KAAKsC,UACPsa,EAAI+C,YACJ,IAAInF,EAAQ9Z,EARM,GASlB8Z,EAAUnb,GAAM6B,KAAK,GAAK,EAAKsZ,EAAQA,GACvCoC,EAAI1a,eAAesY,GAEnB4hB,EAAcx7B,KAAKgc,GAErB,OAAOwf,EAGTjjC,wBAEE,MAAMkjC,EAAkB,IAAIxL,WAAW,IACvC,IAAK,IAAInwB,EAAI,EAAGA,EAAI,GAAIA,IAEtB27B,EAAoB,EAAJ37B,EAAQ,GAAKV,KAAKqC,MAAsB,IAAhBrC,KAAKsC,UAC7C+5B,EAAoB,EAAJ37B,EAAQ,GAAKV,KAAKqC,MAAsB,IAAhBrC,KAAKsC,UAC7C+5B,EAAoB,EAAJ37B,EAAQ,GAAK,EAG/B,MAAM47B,EAAmB,IAAIxL,EAAYuL,EAAiB,EAAG,EAAGtL,GAKhE,OAJAuL,EAAiBC,MAAQC,EACzBF,EAAiBG,MAAQD,EAEzBF,EAAiBjkB,aAAc,EACxBikB,GC5DX,MAAMI,WAA4B/oB,GAEhCxa,cAEEgN,wPACA/M,KAAKga,SAASupB,IAAM,CAAE39B,WAAO5B,ICFjC,MAAMw/B,WAAqCjpB,GAEzCxa,cAEEgN,i5BAAY02B,IACZzjC,KAAKga,SAAS6P,UAAqB,CAAEjkB,MAAO,GAC5C5F,KAAKga,SAASwoB,mBAAqB,CAAE58B,MAAO,IAAI04B,ICPpD,MAAMoF,WAAwBnpB,GAE5Bxa,cAEEgN,6sBACA/M,KAAKga,SAAS2pB,WAAa,CAAE/9B,MAAO,IAAImO,ICN5C,MAAM6vB,GAEJ7jC,YAAY4Z,GAEV3Z,KAAK6jC,IAAM,IAAI7Z,EAAkB,EAAG,GACpChqB,KAAK8jC,IAAM,IAAI9Z,EAAkB,EAAG,GACpChqB,KAAK+jC,aAAe,IAAIL,GAG1B3jC,KAAK0mB,GAECA,EAAGpI,QAAUre,KAAK6jC,IAAIxlB,OAASoI,EAAGvH,SAAWlf,KAAK6jC,IAAI3kB,SAExDlf,KAAK6jC,IAAIvZ,QAAQ7D,EAAGpI,MAAOoI,EAAGvH,QAC9Blf,KAAK8jC,IAAIxZ,QAAQ7D,EAAGpI,MAAOoI,EAAGvH,SAGhClf,KAAK+jC,aAAa/pB,SAAS2pB,WAAW/9B,MAAM2W,IAAI,EAAG,GACnD6V,GAAS3C,KAAKhJ,EAAIzmB,KAAK6jC,IAAK7jC,KAAK+jC,cACjC/jC,KAAK+jC,aAAa/pB,SAAS2pB,WAAW/9B,MAAM2W,IAAI,EAAG,GACnD6V,GAAS3C,KAAKzvB,KAAK6jC,IAAKpd,EAAIzmB,KAAK+jC,eCZrC,MAAMC,WAAuBtqB,GAE3B3Z,cAEEgN,QAEA/M,KAAKikC,SAAW,IAAI1B,GACpBviC,KAAKkkC,iBAAmB,IAAIZ,GAC5BtjC,KAAKmkC,cAAgB,IAAIX,GAEzBxjC,KAAKokC,KAAO/W,GAAcgX,SAAW,EAAI,EAEzCrkC,KAAKskC,QAAU,IAAIta,EAAkB5D,GAAQ/H,MAAQre,KAAKokC,KAAMhe,GAAQlH,OAASlf,KAAKokC,MAEtFpkC,KAAKukC,QAAU,IAAIva,EAAkB5D,GAAQ/H,MAAO+H,GAAQlH,QAE5Dlf,KAAKwkC,QAAU,IAAIZ,GACnBxR,GAASlG,4BAA6B,EAGxCnsB,SAEEC,KAAKykC,kBAELrS,GAAShI,MAAMpqB,KAAKskC,QAAS/a,GAAc3d,SAAS,GAAM,GAC1DwmB,GAAS9I,OAAOV,GAAahd,QAAS2d,GAAc3d,QAAS5L,KAAKskC,SAElEtkC,KAAK0kC,oBAELtS,GAAS3C,KAAK2C,GAASnE,iBAAkBjuB,KAAKukC,QAASvkC,KAAKikC,UAG5DjkC,KAAKwkC,QAAQG,KAAK3kC,KAAKukC,SACvBnS,GAAS3C,KAAKzvB,KAAKukC,aAASvgC,GAG5BhE,KAAKkkC,iBAAiBlqB,SAASupB,IAAI39B,MAAQ5F,KAAKukC,QAAQtZ,QACxDmH,GAAS3C,KAAKzvB,KAAKskC,aAAStgC,EAAWhE,KAAKkkC,kBAK9CnkC,oBAEEC,KAAKikC,SAASjqB,SAASwoB,mBAAmB58B,MAAMg6B,WAAWrW,GAAc3d,QAAQg5B,kBACjF5kC,KAAKikC,SAASjqB,SAASyoB,kBAAkB78B,MAAMkgB,KAAKyD,GAAc3d,QAAQg5B,kBAC1E5kC,KAAKikC,SAASjqB,SAAS6P,UAAUjkB,MAAQ2jB,GAAc3d,QAAQ+Z,IAGjE5lB,kBAEMC,KAAKskC,QAAQjmB,QAAU+H,GAAQ/H,MAAQre,KAAKokC,MAAQpkC,KAAKskC,QAAQplB,SAAWkH,GAAQlH,OAASlf,KAAKokC,OAEpGpkC,KAAKskC,QAAQha,QAAQlE,GAAQ/H,MAAQre,KAAKokC,KAAMhe,GAAQlH,OAASlf,KAAKokC,MACtEpkC,KAAKukC,QAAQja,QAAQlE,GAAQ/H,MAAO+H,GAAQlH,UC9DlD,MAAM2lB,WAAqBnrB,GAEzB3Z,cAEEgN,QAGFhN,SAEEqyB,GAAShI,WAAMpmB,EAAWulB,GAAc3d,SAAS,GAAM,GAEnDgd,GAAahd,QAAQ6iB,eAEvB7F,GAAahd,QAAQ6iB,gBAGnB7F,GAAahd,QAAQ0d,OAEvBV,GAAahd,QAAQ0d,SAIrB8I,GAAS9I,OAAOV,GAAahd,QAAS2d,GAAc3d,SAGlDgd,GAAahd,QAAQ8iB,gBAEvB9F,GAAahd,QAAQ8iB,kBC3B3B,MAAMoW,WAAiBprB,GAErB3Z,cAEEgN,QAGFhN,SAIM6oB,GAAahd,QAAQ6iB,eAEvB7F,GAAahd,QAAQ6iB,gBAGnB7F,GAAahd,QAAQ0d,OAEvBV,GAAahd,QAAQ0d,SAIrB8I,GAAS9I,OAAOV,GAAahd,QAAS2d,GAAc3d,QAASwmB,GAAStG,UAAUL,mBAGlFzrB,KAAK+kC,0BAEDnc,GAAahd,QAAQ8iB,gBAEvB9F,GAAahd,QAAQ8iB,iBAIzB3uB,0BAEE,MAAMilC,EAAmBzb,GAAc3M,UAEvC,GAAIooB,GAAoB5S,GAAStG,UAAUrrB,GAAGwkC,aAC9C,CAGE,MAAMC,EAAQ9S,GAAStG,UAAUrrB,GAAG0kC,UAAU5b,GAAc3d,SAE5Do5B,EAAiBJ,iBAAiB9e,KAAKyD,GAAc3d,QAAQg5B,kBAE7DI,EAAiBxgB,SAASsB,KAAKof,EAAM1gB,UACrCwgB,EAAiB5gB,WAAW0B,KAAKof,EAAM9gB,YAGvC,MAAMghB,EAAsBhT,GAAStG,UAAUL,kBAG/C2G,GAAStG,UAAUrrB,GAAGwkC,cAAe,EAGrC7S,GAAStG,UAAUJ,gBAAgB,MACnC0G,GAAStG,UAAUxC,OAAOV,GAAahd,QAASo5B,GAGhD5S,GAAStG,UAAUJ,gBAAgB0Z,GACnChT,GAAStG,UAAUrrB,GAAGwkC,cAAe,IC3D3C,MAAMI,WAA6B9qB,GAEjCxa,YAAYulC,GAEVv4B,6qBAAY/I,EAAW,CACrBuhC,cAAeD,EACfE,MAAOF,IAGTtlC,KAAKga,SAASyrB,QAAU,CAAE7/B,MAAO,IAAImO,EAAQ,GAAK,KAClD/T,KAAKga,SAAS0rB,UAAY,CAAE9/B,MAAO,IAAImO,EAAQ,GAAK,KAGtDhU,SAAS2I,EAAGwc,GAEVllB,KAAKga,SAASyrB,QAAQ7/B,MAAMsC,EAAIQ,EAChC1I,KAAKga,SAASyrB,QAAQ7/B,MAAMuC,EAAI+c,EAGlCnlB,cAAcmI,EAAGC,GAEfnI,KAAKga,SAAS0rB,UAAU9/B,MAAM2W,IAAIrU,EAAGC,ICtBzC,MAAMw9B,WAAmCprB,GAEvCxa,YAAYulC,GAEVv4B,ydAEA/M,KAAKga,SAAS4rB,oBAAsB,CAAEhgC,MAAO,KAC7C5F,KAAKga,SAAS6rB,YAAsB,CAAEjgC,MAAO,KAC7C5F,KAAKga,SAAS8rB,aAAsB,CAAElgC,MAAO,IAAI0U,EAAM,YACvDta,KAAKga,SAAS+rB,eAAsB,CAAEngC,MAAO,ICRjD,MAAMogC,GAEJjmC,YAAYsb,EAAQ,GAElBrb,KAAKimC,cAAgB,EACrBjmC,KAAKkmC,eAAiB,EAEtBlmC,KAAKmmC,uBAAyB,GAC9BnmC,KAAKomC,wBAA0B,GAC/BpmC,KAAKqmC,sBAAwB,GAE7BrmC,KAAKqb,MAAQA,EACbrb,KAAKsmC,gBAAkB,CAAC,EAAG,EAAG,EAAG,EAAG,IACpCtmC,KAAKumC,QAAU,CAAEjV,UAAWkV,EAAcjV,UAAWiV,EAAchV,OAAQC,GAE3EzxB,KAAKymC,mBAAqB,IAAIzc,EAAkB,EAAG,EAAGhqB,KAAKumC,SAC3DvmC,KAAKymC,mBAAmBxb,QAAQyb,iBAAkB,EAElD1mC,KAAK2mC,iBACL3mC,KAAK4mC,UAEL5mC,KAAK6mC,yBAA2B,IAAIlB,GAGtC5lC,KAAK0mB,EAAIqgB,GAEP9mC,KAAK+mC,UAAUtgB,EAAGpI,MAAOoI,EAAGvH,QAExB4nB,EAEF1U,GAAS3C,KAAKhJ,EAAIzmB,KAAKymC,mBAAoBzmC,KAAK6mC,0BAIhDzU,GAAS3C,KAAKhJ,EAAIzmB,KAAKymC,oBAGzB,IAAIO,EAAoBhnC,KAAKymC,mBAE7B,IAAK,IAAIn/B,EAAI,EAAGA,EAAItH,KAAKqb,MAAO/T,IAChC,CACE,MAAMgkB,EAAMtrB,KAAKmmC,uBAAuB7+B,GAExCgkB,EAAI2b,cAAc,EAAG,GACrB7U,GAAS3C,KAAKuX,EAAmBhnC,KAAKomC,wBAAwB9+B,GAAIgkB,GAElEA,EAAI2b,cAAc,EAAG,GACrB7U,GAAS3C,KAAKzvB,KAAKomC,wBAAwB9+B,GAAItH,KAAKqmC,sBAAsB/+B,GAAIgkB,GAE9E0b,EAAoBhnC,KAAKqmC,sBAAsB/+B,IAInDvH,sBAEE,OAAOC,KAAKomC,wBAAwB,GAAGnb,QAGzClrB,iBAEE,OAAOC,KAAKomC,wBAAwB,GAGtCrmC,UAEEC,KAAKknC,aAELlnC,KAAKymC,mBAAmBnc,QAAQ,EAAG,GAEnC,IAAK,IAAIhjB,EAAI,EAAGA,EAAItH,KAAKqb,MAAO/T,IAChC,CACE,MAAM6/B,EAAM,IAAInd,EAAkB,EAAG,EAAGhqB,KAAKumC,SACvCa,EAAM,IAAIpd,EAAkB,EAAG,EAAGhqB,KAAKumC,SAE7CY,EAAIlc,QAAQyb,iBAAkB,EAC9BU,EAAInc,QAAQyb,iBAAkB,EAE9B1mC,KAAKomC,wBAAwB5+B,KAAK2/B,GAClCnnC,KAAKqmC,sBAAsB7+B,KAAK4/B,IAIpCrnC,UAAUm4B,EAAemP,GAEvB,GAAIrnC,KAAKimC,gBAAkB/N,GAAiBl4B,KAAKkmC,iBAAmBmB,EAElE,OAGFrnC,KAAKimC,cAAgB/N,EACrBl4B,KAAKkmC,eAAiBmB,EAEtB,IAAIhpB,EAAQzX,KAAKC,MAAMqxB,EAAgB,GACnChZ,EAAStY,KAAKC,MAAMwgC,EAAiB,GAEzCrnC,KAAKymC,mBAAmBnc,QAAQjM,EAAOa,GAEvC,IAAK,IAAI5X,EAAI,EAAGA,EAAItH,KAAKqb,MAAO/T,IAE9BtH,KAAKqmC,sBAAsB/+B,GAAGgjB,QAAQjM,EAAOa,GAC7Clf,KAAKomC,wBAAwB9+B,GAAGgjB,QAAQjM,EAAOa,GAC/Clf,KAAKmmC,uBAAuB7+B,GAAGggC,SAASjpB,EAAOa,GAE/Cb,EAAUzX,KAAKC,MAAMwX,EAAQ,GAC7Ba,EAAUtY,KAAKC,MAAMqY,EAAS,GAIlCnf,eAAem4B,EAAemP,GAE5BrnC,KAAKunC,oBAEL,IAAK,IAAIjgC,EAAI,EAAGA,EAAItH,KAAKqb,MAAO/T,IAE9BtH,KAAKmmC,uBAAuB3+B,KAAK,IAAI69B,GAAqBrlC,KAAKsmC,gBAAgBh/B,KAInFvH,oBAEE,IAAK,IAAIuH,EAAI,EAAGA,EAAItH,KAAKmmC,uBAAuBrgC,OAAQwB,IAEtDtH,KAAKmmC,uBAAuB7+B,GAAGub,UAEjC7iB,KAAKmmC,uBAAuBrgC,OAAS,EAGvC/F,aAEE,IAAK,IAAIuH,EAAI,EAAGA,EAAItH,KAAKqmC,sBAAsBvgC,OAAQwB,IAErDtH,KAAKomC,wBAAwB9+B,GAAGub,UAChC7iB,KAAKqmC,sBAAsB/+B,GAAGub,UAEhC7iB,KAAKymC,mBAAmB5jB,UAExB7iB,KAAKomC,wBAAwBtgC,OAAS,EACtC9F,KAAKqmC,sBAAsBvgC,OAAS,GCnIxC,MAAM0hC,WAA0B9tB,GAE9B3Z,cAEEgN,QAEA/M,KAAKynC,uBAAoBzjC,EAEzBhE,KAAKskC,aAAUtgC,EACfhE,KAAK0nC,aAAU1jC,EACfhE,KAAKwkC,aAAUxgC,EAEfhE,KAAK2nC,QAAU,IAAIvsB,GAGrBrb,WAEEC,KAAKwkC,QAAU,IAAIwB,GACnBhmC,KAAKskC,QAAU,IAAIta,EAAkB5D,GAAQ/H,MAAO+H,GAAQlH,QAC5Dlf,KAAK0nC,QAAU,IAAI1d,EAAkB5D,GAAQ/H,MAAO+H,GAAQlH,QAE5Dlf,KAAKynC,kBAAoB,IAAIjsB,GAA2B,GACxDxb,KAAKwkC,QAAU,IAAIwB,GAAgB,GAEnChmC,KAAKynC,kBAAkBG,SAAS5nC,KAAKwkC,QAAQ6B,sBAAsB,GAAGpb,SACtEjrB,KAAKynC,kBAAkBI,SAAS7nC,KAAKwkC,QAAQ6B,sBAAsB,GAAGpb,SACtEjrB,KAAKynC,kBAAkBK,SAAS9nC,KAAKwkC,QAAQ6B,sBAAsB,GAAGpb,SACtEjrB,KAAKynC,kBAAkBM,SAAS/nC,KAAKwkC,QAAQ6B,sBAAsB,GAAGpb,SACtEjrB,KAAKynC,kBAAkBO,SAAShoC,KAAKwkC,QAAQ6B,sBAAsB,GAAGpb,SAEtEjrB,KAAKynC,kBAAkBQ,mBAAmB,GAC1CjoC,KAAKynC,kBAAkBS,iBAAiB,GAExCloC,KAAK2nC,QAAQQ,gBAAgBnoC,KAAKwkC,QAAQ4B,wBAAwB,GAAGnb,SAGvElrB,mBAAmBqoC,GAEjBpoC,KAAKynC,kBAAkBQ,mBAAmBG,GAG5CroC,iBAAiBqoC,GAEfpoC,KAAKynC,kBAAkBS,iBAAiBE,GAG1CroC,iBAAiBuc,GAEftc,KAAKynC,kBAAkBY,iBAAiB/rB,GAG1Cvc,iBAAiBuc,GAEftc,KAAKynC,kBAAkBa,iBAAiBhsB,GAG1Cvc,iBAAiBuc,GAEftc,KAAKynC,kBAAkBc,iBAAiBjsB,GAG1Cvc,iBAAiBuc,GAEftc,KAAKynC,kBAAkBe,iBAAiBlsB,GAG1Cvc,iBAAiBuc,GAEftc,KAAKynC,kBAAkBgB,iBAAiBnsB,GAG1Cvc,SAEEC,KAAKykC,kBAELrS,GAAShI,MAAMpqB,KAAKskC,QAAS/a,GAAc3d,SAAS,GAAM,GAC1DwmB,GAAS9I,OAAOV,GAAahd,QAAS2d,GAAc3d,QAAS5L,KAAKskC,SAGlEtkC,KAAKwkC,QAAQG,KAAK3kC,KAAKskC,SAAS,GAGhClS,GAAS9C,cAActvB,KAAKynC,kBAAmBznC,KAAKwkC,QAAQ4B,wBAAwB,IAGpFhU,GAAS3C,KAAKzvB,KAAKskC,aAAStgC,EAAWhE,KAAK2nC,SAG9C5nC,kBAEMC,KAAKskC,QAAQjmB,QAAU+H,GAAQ/H,OAASre,KAAKskC,QAAQplB,SAAWkH,GAAQlH,SAE1Elf,KAAKskC,QAAQha,QAAQlE,GAAQ/H,MAAO+H,GAAQlH,QAC5Clf,KAAK0nC,QAAQpd,QAAQlE,GAAQ/H,MAAO+H,GAAQlH,UCtGlD,MAAM2L,WAA2B6d,EAE/B3oC,YAAYwgC,EAAMd,EAAOe,EAAKC,EAAQ/a,EAAMC,GAE1C5Y,MAAMwzB,EAAMd,EAAOe,EAAKC,EAAQ/a,EAAMC,GAEtC3lB,KAAK4lB,YAAc,IAAItL,EAAM,WAC7Bta,KAAK6lB,YAAc,EAGrB9lB,KAAK4c,GAKH,OAHA5P,MAAM+Y,KAAKnJ,GACX3c,KAAK4lB,YAAYE,KAAKnJ,EAAOiJ,aAC7B5lB,KAAK6lB,YAAclJ,EAAOkJ,YACnB7lB,MCiDN,MAAC2oC,GAAyB,IAjE/B,MAEE5oC,cAEEC,KAAK4oC,WAAa,GAClB5oC,KAAK6oC,mBAAqB,IAAIC,IAGhC/oC,SAEEC,KAAK+oC,6BAEL,IAAK,MAAMC,KAAahpC,KAAK6oC,mBAE3BG,EAAUnzB,OAAOoD,GAAYrC,mBAAmBvB,oBAIpDtV,mBAAmBipC,GAEjBhpC,KAAK4oC,WAAWphC,KAAKwhC,GAGvBjpC,iBAAiBipC,GAIfhpC,KAAK6oC,mBAAmBhgC,IAAImgC,GAG9BjpC,kBAAkBipC,GAIhBhpC,KAAK6oC,mBAAmBI,OAAOD,GAGjCjpC,sBAAsBmpC,GAEpBvlC,QAAQC,KAAK,oDACb5D,KAAKyF,IAAIyjC,GAGXnpC,IAAImpC,GAEF,IAAK,IAAI5hC,EAAI,EAAGA,EAAItH,KAAK4oC,WAAW9iC,OAAQwB,IAE1C,GAAItH,KAAK4oC,WAAWthC,GAAGtG,OAASkoC,EAE9B,OAAOlpC,KAAK4oC,WAAWthC,GAG3B3D,QAAQG,MAAM,sDAAuDolC,GAIvEnpC,6BAEE,IAAK,IAAIuH,EAAI,EAAGA,EAAItH,KAAK4oC,WAAW9iC,OAAQwB,IAE1CtH,KAAK4oC,WAAWthC,GAAGmR,YAAYQ,GAAYrC,mBAAmBvB,sBCvDpE,MAAM8zB,GAEJppC,YAAYqpC,EAAoBhgB,EAAUyP,GAExCuQ,EAAqBA,GAAsB,IAAI3vB,GAE/CzZ,KAAKopC,mBAAqBA,EAC1BppC,KAAKopB,SAAWA,EAChBppB,KAAK64B,MAAQA,EAEb74B,KAAKqpC,YAAa,EAClBrpC,KAAKspC,cAAgB,EAErBtpC,KAAKupC,iBAAmB,EAG1BxpC,SAEE,GAAKC,KAAKqpC,WAAV,CAmBA,IAfAjzB,GAAKozB,WAGsB,IAAvBxpC,KAAKspC,eAEPtpC,KAAKopC,mBAAmBK,gBAG1BzpC,KAAK64B,MAAMhjB,SAEX7V,KAAKupC,kBAAoBnzB,GAAK9L,WAE9BtK,KAAKopC,mBAAmBnzB,gBACxBgD,GAAYhD,gBAELjW,KAAKupC,iBAAmBnzB,GAAKnC,kBAElCjU,KAAKopC,mBAAmBlzB,eACxB+C,GAAY/C,eACZlW,KAAKupC,kBAAoBnzB,GAAKnC,iBAEhCmC,GAAKszB,0BAA0B1pC,KAAKupC,iBAAmBnzB,GAAKnC,kBAE5DjU,KAAKopC,mBAAmBvzB,SAExBoD,GAAYpD,SACZ8zB,GAAqB9zB,SAErB7V,KAAKopC,mBAAmB3a,gBAExBzuB,KAAKopB,SAASvT,SACdusB,GAAGvsB,SACHusB,GAAG9Y,OAAOtpB,KAAKopB,UACfppB,KAAKopC,mBAAmB1a,iBAExB2T,GAAM/Y,OAAOtpB,KAAKopB,UAIlBppB,KAAKopC,mBAAmBQ,eACxB5pC,KAAKspC,gBAELtpC,KAAK64B,MAAMzO,QACXgY,GAAGhY,QACHiY,GAAMjY,SAGRrqB,QAEMC,KAAKqpC,aAEkB,IAAvBrpC,KAAKspC,eAEPtpC,KAAKopC,mBAAmBpzB,WAG1BhW,KAAKqpC,YAAa,EAElBrpC,KAAKopB,SAAS0C,UAAU+d,iBAAiB7pC,KAAK6V,OAAOlR,KAAK3E,QAG5DD,QAE0B,IAApBC,KAAKqpC,aAETrpC,KAAKqpC,YAAa,EAClBrpC,KAAKopC,mBAAmB3yB,UAExBzW,KAAKopB,SAAS0C,UAAU+d,iBAAiB,OAG3C9pC,UAAUmuB,GAERluB,KAAKopC,mBAAmB3yB,QAAQzW,MAChCA,KAAKopC,mBAAqBlb,EAC1BluB,KAAKopC,mBAAmBpzB,SAAShW,MAGnCD,UAEEC,KAAK8pC,OACL9pC,KAAKspC,cAAgB,GCzDpB,MAACS,GAAS,IAnDf,MAEEhqC,OAEE4D,QAAQC,KAAK,uDACbwiB,GAAQ2b,OAGVhiC,gBAAgBmI,EAAGC,GAEjBxE,QAAQC,KAAK,uDACbwiB,GAAQ8I,gBAAgBhnB,EAAGC,GAG7BpI,SAEE4D,QAAQC,KAAK,uDACbwiB,GAAQvQ,SAGV9V,YAAYse,EAAOa,GAEjBvb,QAAQC,KAAK,uDACbwiB,GAAQgJ,YAAY/Q,EAAOa,GAG7Bnf,uBAAuB+kB,GAGrB,OADAnhB,QAAQC,KAAK,uDACNwiB,GAAQ4jB,uBAAuBllB,GAGxC/kB,oBAAoB6F,GAGlB,OADAjC,QAAQC,KAAK,uDACNwiB,GAAQ6jB,oBAAoBrkC,GAGrC7F,iBAGE,OADA4D,QAAQC,KAAK,uDACNwiB,GAAQ8jB,iBAGjBnlB,mBAGE,OADAphB,QAAQC,KAAK,uDACNwiB,GAAQrB,eC5CnB,MAAMolB,WAAyBltB,GAE7Bld,cAEEgN,QACA/M,KAAKoqC,YAAc,IAAIr2B,EAAQ,EAAG,GAGpChU,OAAOke,EAAMM,EAAYnB,EAAQE,GAE/BA,EAAIY,KAAOK,EAAWL,KAEtB,MAAMmsB,EAAYrqC,KAAKsqC,cAAcrsB,EAAMM,EAAWL,MAGtDd,EAAOiB,MAAQzX,KAAKuX,KAAKksB,EAAUniC,EAAyB,EAArBlI,KAAKoqC,YAAYliC,GACxDkV,EAAO8B,OAAStY,KAAKuX,KAAKksB,EAAUliC,EAAyB,EAArBnI,KAAKoqC,YAAYjiC,GACzDmV,EAAIwJ,UAAU,EAAG,EAAG1J,EAAOiB,MAAOjB,EAAO8B,QAGzC5B,EAAIitB,YAAc,EAClBjtB,EAAIsJ,UAAYrI,EAAWC,YAAc,UACzClB,EAAIuJ,SAAS,EAAG,EAAGzJ,EAAOiB,MAAOjB,EAAO8B,QACxC5B,EAAIitB,YAAc,EAElBjtB,EAAIitB,YAAc,EAElBjtB,EAAIY,KAAOK,EAAWL,KACtBZ,EAAIsJ,UAAYrI,EAAWC,YAAc,UACzClB,EAAIktB,aAAe,SAEnBltB,EAAImtB,UAAYlsB,EAAWksB,WAAa,SAClB,WAAlBntB,EAAImtB,UAENntB,EAAIotB,SAASzsB,EAAMb,EAAOiB,MAAQ,EAAGjB,EAAO8B,OAAS,GAIrD5B,EAAIotB,SAASzsB,EAAM,EAAGb,EAAO8B,OAAS,ICxC5C,MAAMyrB,GAEJ5qC,aAAYiB,KAAEA,EAAIuR,UAAEA,IAElBvS,KAAKgB,KAAOA,EACZhB,KAAKuS,UAAYA,EACjBvS,KAAK4qC,QAAS,EAEdjB,GAAqBkB,mBAAmB7qC,MAG1CD,SAIAA,WAEEC,KAAKuS,UAAU4G,UAAUC,OAAO,UAChCuwB,GAAqBmB,iBAAiB9qC,MAEtCA,KAAK4qC,QAAS,EAGhB7qC,UAIAA,UAEEC,KAAKuS,UAAU4G,UAAUtQ,IAAI,UAC7B8gC,GAAqBoB,kBAAkB/qC,MAEvCA,KAAK4qC,QAAS,EAGhB7qC,YAAYsV,GAEVrV,KAAKuS,UAAUgH,MAAMC,QAAUnE,EAAmB,GAAGrV,KAAKgB,gBAC1DhB,KAAKgrC,gBAGPjrC,gBAEMC,KAAKuS,UAAUgH,MAAMC,QAAU,KAE7BxZ,KAAK4qC,QAEP5qC,KAAKgW,WAKFhW,KAAK4qC,QAER5qC,KAAKyW,UAKX1W,mBAEEuS,GAAc+G,YAAYrZ,KAAKuS,WAGjCxS,mBAEEuS,GAAcgH,YAAYtZ,KAAKuS,YCjEnC,MAAM04B,WAAwBhoB,EAE5BljB,YAAYse,EAAOa,EAAQsC,EAAOsB,GAEhCzE,EAAQA,GAAS,EACjBa,EAASA,GAAU,EACnBsC,EAAQA,GAAS,UACjBsB,EAAWA,GAAY,IAAIM,EAAkB,CAAE5B,MAAOA,IAEtD,MAAMoB,EAAW,IAAI4E,EAAcnJ,EAAOa,GAC1C0D,EAASuB,SAAQ,MACjBpX,MAAM6V,EAAUE,ICXpB,MAAMooB,WAAsBjoB,EAE1BljB,YAAYse,EAAOa,EAAQsC,EAAOsB,GAEhCzE,EAAQA,GAAS,EACjBa,EAASA,GAAU,EACnBsC,EAAQA,GAAS,UACjBsB,EAAWA,GAAY,IAAIM,EAAkB,CAAE5B,MAAOA,IAGtDzU,MADiB,IAAIya,EAAcnJ,EAAOa,GAC1B4D,ICdpB,MAAMqoB,GAEJprC,eAGAA,qBAAqBqrC,EAAQzjC,GAE3BA,EAAOH,KAAK6jC,MAAM1jC,EAAQyjC,GAG5BrrC,yBAAyBurC,EAAOpoC,GAE9B,MAAMqoC,EAAmBroC,EAAOooC,EAAMxlC,OAEtC,IAAK,IAAIwB,EAAI,EAAGA,EAAIikC,EAAkBjkC,IAEpCgkC,EAAM9jC,KAAK8jC,EAAMhkC,GAAGnC,SAIxBpF,mBAAmBurC,EAAOlS,GAExB,MAAM9B,EAAQgU,EAAM3qC,QAAQy4B,GACxB9B,GAAS,GAEXgU,EAAMlpC,OAAOk1B,EAAO,GAIxBv3B,yBAAyBkH,EAAQU,GAE/B,IAAI6jC,EAAgBvkC,EAAO,GACvBs0B,EAAmBiQ,EAAcnkB,WAAW1f,GAChD,IAAK,IAAIL,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IAE7BL,EAAOK,GAAG+f,WAAW1f,GAAU4zB,IAEjCiQ,EAAgBvkC,EAAOK,GACvBi0B,EAAmBt0B,EAAOK,GAAG+f,WAAW1f,IAG5C,OAAO6jC,EAGTzrC,8BAA8B0rC,GAE5B,MAAMC,EAAMzhC,OAAOC,KAAKuhC,GAClB1iC,EAAM,GACZ,IAAK,IAAIzB,EAAI,EAAGA,EAAIokC,EAAI5lC,OAAQwB,IAE9ByB,EAAIvB,KAAKikC,EAAIC,EAAIpkC,KAEnB,OAAOyB,GClDX,MAAM4iC,GAEJ5rC,cAEEC,KAAKkoB,OAAS,IAAI7E,EAGpBtjB,WAAWkH,EAAQ0yB,EAAmBC,EAAcnU,GAElDzlB,KAAKkoB,OAAOvG,cAAc1a,GAE1B,MAAM4yB,EAAQjzB,KAAKkzB,SAASF,EAAe,GACrCG,EAAS,EAAInzB,KAAKozB,KAAKpzB,KAAKqzB,IAAIJ,GAASpU,GAAW,EAEpDyU,EAAkBl6B,KAAKm6B,oBAAoBR,EAAmBE,GAC9DO,EAAoBp6B,KAAKq6B,sBAAsBV,EAAmBE,GAClES,EAAoBt6B,KAAKu6B,sBAAsBZ,EAAmBI,GAClES,EAAqBx6B,KAAKy6B,uBAAuBd,EAAmBI,GAEpEW,EAAqB,IAAItzB,EAAQ,EAAG,GAAI,GAAGuzB,gBAAgBhB,GAE3DiB,EAAgB56B,KAAKkoB,OAAOtf,OAAOzD,QAEnC01B,EAAqB76B,KAAK86B,yBAA8C,EAArB96B,KAAKkoB,OAAO/I,OAAiC,EAArBnf,KAAKkoB,OAAO/I,OAAYya,EAAcnU,GACjHsV,EAAUH,EAAcz1B,QAAQ0D,IAAI6xB,EAAmBv1B,QAAQ2D,gBAAqC,EAAtB+xB,IAE9EG,GAAc,IAAIC,GAAQC,8BAA8BhB,EAAiBa,GACzEI,GAAc,IAAIF,GAAQC,8BAA8Bd,EAAmBW,GAE3EK,GAAe,IAAIH,GAAQC,8BAA8BZ,EAAmBS,GAC5EM,GAAe,IAAIJ,GAAQC,8BAA8BV,EAAoBO,GAEnF/6B,KAAKs7B,+BAA+BP,EAAS9zB,EAAQ0yB,EAAmBqB,EAAUG,EAAYC,EAAYC,GAE1GL,EAASE,8BAA8BhB,EAAiBa,GACxDI,EAAWD,8BAA8Bd,EAAmBW,GAE5DK,EAAWF,8BAA8BZ,EAAmBS,GAC5DM,EAAYH,8BAA8BV,EAAoBO,GAE9D,IAAIQ,EAAmB1vB,EAAAA,EAEvB,MAAM2vB,EAAcd,EAAmBv1B,QAAQ2D,gBAAqC,EAAtB+xB,GAC9D,IAAK,IAAIvzB,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAM0f,EAAO,IAAIyU,EAAMx0B,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ0D,IAAI2yB,IAE1DE,EAAwB,IAAIt0B,EAC5Bu0B,EAAyB,IAAIv0B,EAE7Bw0B,EAA0B,IAAIx0B,EAC9By0B,EAA0B,IAAIz0B,EAEpC4zB,EAASc,cAAc9U,EAAO0U,GAC9BP,EAAWW,cAAc9U,EAAM2U,GAE/BP,EAAWU,cAAc9U,EAAO4U,GAChCP,EAAYS,cAAc9U,EAAM6U,GAE5BH,EAAqB51B,SAAW,MAElCnC,QAAQ2H,IAAI,4BAA6BhE,GAEvCq0B,EAAuB71B,SAAW,MAEpCnC,QAAQ2H,IAAI,8BAA+BhE,GAEzCs0B,EAAuB91B,SAAW,MAEpCnC,QAAQ2H,IAAI,8BAA+BhE,GAEzCu0B,EAAwB/1B,SAAW,MAErCnC,QAAQ2H,IAAI,+BAAgChE,GAG9C,MAAMy0B,EAAoB90B,EAAOK,GAAGnC,QAAQmiB,IAAIoU,GAAsB51B,SAChEk2B,EAAoB/0B,EAAOK,GAAGnC,QAAQmiB,IAAIqU,GAAwB71B,SAElEm2B,EAAsBh1B,EAAOK,GAAGnC,QAAQmiB,IAAIsU,GAAwB91B,SACpEo2B,EAAsBj1B,EAAOK,GAAGnC,QAAQmiB,IAAIuU,GAAyB/1B,SAErEq2B,EAAkBv1B,KAAKN,IAAIy1B,EAAiBC,GAC5CI,EAAkBx1B,KAAKN,IAAI21B,EAAmBC,GAE9C51B,EAAMM,KAAKN,IAAI61B,EAAcC,GAE/B91B,EAAMi1B,IAERA,EAAmBj1B,GAIvB,MAAM+1B,EAAqB3B,EAAmBv1B,QAAQ2D,eAAeyyB,GAGrE,OAFyBR,EAAQ51B,QAAQ0D,IAAIwzB,GAK/Ct8B,+BAA+Bu8B,EAAYr1B,EAAQ0yB,EAAmBqB,EAAUG,EAAYC,EAAYC,GAEtG,MAAMkB,EAAkBv8B,KAAKw8B,wBAAwBv1B,EAAQk0B,EAAYH,EAAUrB,GAC7E8C,EAAoBz8B,KAAK4rC,0BAA0B3kC,EAAQm0B,EAAYC,EAAa1B,GAE1F2C,EAAWzzB,IAAI0zB,GACfD,EAAWzzB,IAAI4zB,GAGjB18B,wBAAwBkH,EAAQk0B,EAAYH,EAAUrB,GAEpD,IAEIkS,EACAC,EAHAnP,EAA+B9wB,EAAAA,EAC/B+wB,EAAkC/wB,EAAAA,EAItC,MAAMgxB,EAAS,IAAIz1B,EAAQ,EAAG,EAAG,GAAGuzB,gBAAgBhB,GACpD,IAAK,IAAIryB,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAMw1B,EAAc,IAAIrB,EAAMx0B,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ0D,IAAIg0B,EAAO13B,QAAQ2D,gBAAgB,OAChGi0B,EAAc,IAAItB,EAAMx0B,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ0D,IAAIg0B,EAAO13B,QAAQ2D,eAAe,OAE/F6yB,EAA0B,IAAIv0B,EAC9Bs0B,EAAuB,IAAIt0B,EAEjC+zB,EAAWW,cAAcgB,EAAYnB,GACrCX,EAASc,cAAciB,EAASrB,GAEhC,MAAMsB,EAAcrB,EAAuBtU,WAAWpgB,EAAOK,IACvD21B,EAAcvB,EAAqBrU,WAAWpgB,EAAOK,IAEvDo0B,EAAqB51B,SAAW,MAElCnC,QAAQ2H,IAAI,qCAAsChE,GAEhDq0B,EAAuB71B,SAAW,MAEpCnC,QAAQ2H,IAAI,uCAAwChE,GAGlD01B,EAAYJ,IAEdA,EAAiCI,EACjC8O,EAAqB7kC,EAAOK,IAE1B21B,EAAUN,IAEZA,EAA+BM,EAC/B4O,EAAmB5kC,EAAOK,IAI9B3D,QAAQ2H,IAAIugC,EAAkBC,GAE9B,MAAM5O,GAAcP,EAA+BC,GAAkC,EAGrF,OAAOC,EAAO13B,QAAQ2D,gBAAgBo0B,GAGxCn9B,0BAA0BkH,EAAQm0B,EAAYC,EAAa1B,GAEzD,IAEIoS,EACAC,EAHA7O,EAAkCtxB,EAAAA,EAClCuxB,EAAkCvxB,EAAAA,EAItC,MAAMwxB,EAAY,IAAIj2B,EAAQ,EAAG,EAAG,GAAGuzB,gBAAgBhB,GAEvD,IAAK,IAAIryB,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE,MAAMg2B,EAAa,IAAI7B,EAAMx0B,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ0D,IAAIw0B,EAAUl4B,QAAQ2D,gBAAgB,OAClGy0B,EAAa,IAAI9B,EAAMx0B,EAAOK,GAAGnC,QAAS8B,EAAOK,GAAGnC,QAAQ0D,IAAIw0B,EAAUl4B,QAAQ2D,eAAe,OAEjG8yB,EAA0B,IAAIx0B,EAC9By0B,EAA0B,IAAIz0B,EAEpCg0B,EAAWU,cAAcwB,EAAY1B,GACrCP,EAAYS,cAAcyB,EAAY1B,GAEtC,MAAM2B,EAAa5B,EAAuBvU,WAAWpgB,EAAOK,IACtDm2B,EAAa5B,EAAwBxU,WAAWpgB,EAAOK,IAEzDs0B,EAAuB91B,SAAW,MAEpCnC,QAAQ2H,IAAI,8BAA+BhE,GAEzCu0B,EAAwB/1B,SAAW,MAErCnC,QAAQ2H,IAAI,+BAAgChE,GAG1Ck2B,EAAYJ,IAEdA,EAAiCI,EACjCwO,EAAqB/kC,EAAOK,IAE1Bm2B,EAAaN,IAEfA,EAAkCM,EAClCsO,EAAsB9kC,EAAOK,IAIjC,MAAM41B,GAAcC,EAAkCC,GAAkC,EAKxF,OAFAz5B,QAAQ2H,IAAIygC,EAAqBC,GAE1B3O,EAAUl4B,QAAQ2D,gBAAgBo0B,GAG3Cn9B,oBAAoB45B,EAAmBE,GAErC,MAAMK,EAAkB,IAAI9yB,EAAQ,GAAI,EAAG,GAG3C,OAFA8yB,EAAgBS,iBAAgB,IAAI+C,GAAaC,iBAAiB,IAAIv2B,EAAQ,EAAG,EAAG,GAAIyyB,IACxFK,EAAgBS,gBAAgBhB,GACzBO,EAGTn6B,sBAAsB45B,EAAmBE,GAEvC,MAAMO,EAAoB,IAAIhzB,EAAQ,EAAG,EAAG,GAG5C,OAFAgzB,EAAkBO,iBAAgB,IAAI+C,GAAaC,iBAAiB,IAAIv2B,EAAQ,EAAG,EAAG,IAAKyyB,IAC3FO,EAAkBO,gBAAgBhB,GAC3BS,EAGTr6B,sBAAsB45B,EAAmBI,GAEvC,MAAMO,EAAoB,IAAIlzB,EAAQ,EAAG,EAAG,GAG5C,OAFAkzB,EAAkBK,iBAAgB,IAAI+C,GAAaC,iBAAiB,IAAIv2B,EAAQ,EAAG,EAAG,GAAI2yB,IAC1FO,EAAkBK,gBAAgBhB,GAC3BW,EAGTv6B,uBAAuB45B,EAAmBI,GAExC,MAAMS,EAAqB,IAAIpzB,GAAS,EAAG,EAAG,GAG9C,OAFAozB,EAAmBG,iBAAgB,IAAI+C,GAAaC,iBAAiB,IAAIv2B,EAAQ,EAAG,EAAG,IAAK2yB,IAC5FS,EAAmBG,gBAAgBhB,GAC5Ba,EAGTz6B,yBAAyBse,EAAOa,EAAQ0a,EAAcnU,GAEpD,MAAMoU,EAASD,EAAe,EAAKhzB,KAAK2B,GAAK,IACvCwxB,EAAS,EAAInzB,KAAKozB,KAAKpzB,KAAKqzB,IAAIJ,GAASpU,GAAW,EAEpDmY,EAAQ1e,EAAStY,KAAKqzB,IAAIJ,GAC1BgE,EAAQxf,EAAQzX,KAAKqzB,IAAIF,GAC/B,OAAOnzB,KAAKL,IAAIK,KAAKqB,IAAI41B,GAAQj3B,KAAKqB,IAAI21B,KCzP9C,MAAMqO,GAEJlsC,uCAAuCmsC,GAErC,MAAMC,EAAUD,EAAgB5U,MAC1B8U,EAAYF,EAAgBl+B,aAAa,YAGzCq+B,EAAW,GAEjB,IAAK,IAAI/kC,EAAI,EAAGA,EAAI6kC,EAAQ5T,MAAOjxB,GAAK,EAGtC+kC,EAAS7kC,KAAK4kC,EAAUE,KAAKH,EAAQb,MAAMhkC,EAAI,KAC/C+kC,EAAS7kC,KAAK4kC,EAAUG,KAAKJ,EAAQb,MAAMhkC,EAAI,KAC/C+kC,EAAS7kC,KAAK4kC,EAAUI,KAAKL,EAAQb,MAAMhkC,EAAI,KAQ/C+kC,EAAS7kC,KAAK4kC,EAAUE,KAAKH,EAAQb,MAAMhkC,EAAI,KAC/C+kC,EAAS7kC,KAAK4kC,EAAUG,KAAKJ,EAAQb,MAAMhkC,EAAI,KAC/C+kC,EAAS7kC,KAAK4kC,EAAUI,KAAKL,EAAQb,MAAMhkC,EAAI,KAQ/C+kC,EAAS7kC,KAAK4kC,EAAUE,KAAKH,EAAQb,MAAMhkC,EAAI,KAC/C+kC,EAAS7kC,KAAK4kC,EAAUG,KAAKJ,EAAQb,MAAMhkC,EAAI,KAC/C+kC,EAAS7kC,KAAK4kC,EAAUI,KAAKL,EAAQb,MAAMhkC,EAAI,KAOjD,MAAMsb,EAAW,IAAIlB,EAIrB,OAFAkB,EAAS9E,aAAa,WAAY,IAAI2a,EAAgB,IAAIxG,aAAaoa,GAAW,IAClFJ,GAAkBQ,0BAA0B7pB,GACrCA,EAGT7iB,iCAAiC2sC,GAE/B,MAAMC,EAAkB,GAClBP,EAAYM,EAA4B1+B,aAAa,YAE3D,IAAK,IAAI1G,EAAI,EAAGA,EAAI8kC,EAAU7T,MAAOjxB,GAAK,EAExCqlC,EAAgBnlC,KAAK,GACrBmlC,EAAgBnlC,KAAK,GACrBmlC,EAAgBnlC,KAAK,GAErBmlC,EAAgBnlC,KAAK,GACrBmlC,EAAgBnlC,KAAK,GACrBmlC,EAAgBnlC,KAAK,GAErBmlC,EAAgBnlC,KAAK,GACrBmlC,EAAgBnlC,KAAK,GACrBmlC,EAAgBnlC,KAAK,GAEvBklC,EAA4B5uB,aAAa,cAAe,IAAI2a,EAAgB,IAAIxG,aAAa0a,GAAkB,KCrEnH,MAAMC,GAEJ7sC,eAGAA,sBAAsB0S,GAEpB,MAAM2K,EAAS5E,SAAS6E,cAAc,UACtCD,EAAOiB,MAAQ5L,EAAM4L,MACrBjB,EAAO8B,OAASzM,EAAMyM,OAEtB,MAAM7V,EAAU+T,EAAOG,WAAW,MAGlC,OAFAlU,EAAQmnB,UAAU/d,EAAO,EAAG,GAErBpJ,EAAQwjC,aAAa,EAAG,EAAGp6B,EAAM4L,MAAO5L,EAAMyM,QAGvDnf,iBAAiB+sC,EAAW5kC,EAAGC,GAE7B,MAAMqc,EAAuC,GAA3Btc,EAAI4kC,EAAUzuB,MAAQlW,GAClCnC,EAAO8mC,EAAU9mC,KACvB,OAAO,IAAIyhB,EAAQzhB,EAAKwe,EAAW,GAAIxe,EAAKwe,EAAW,GAAIxe,EAAKwe,EAAW,GAAIxe,EAAKwe,EAAW,KCqL9F,MAACuoB,GAAe,IA1MrB,MAEEhtC,eAKAA,OAAOikB,EAAiBgpB,GAEtB,MAAMC,EAAa,GAEnB,IAAIC,EAAW,SAEf,MAAMb,EAAWroB,EAAgBhW,aAAa,YACxCm/B,EAAUnpB,EAAgBhW,aAAa,UACvCo/B,EAAWppB,EAAgBhW,aAAa,WACxC2qB,EAAM3U,EAAgBhW,aAAa,MACnCm+B,EAAWnoB,EAAgBsT,MAE3B+V,EAAQ,GAEd,IAAK,IAAI/lC,EAAI,EAAGA,EAAI6kC,EAAQ5T,MAAOjxB,GAAK,EACxC,CACE,MAAMgmC,EAAUnB,EAAQb,MAAMhkC,EAAI,GAC5BimC,EAAUpB,EAAQb,MAAMhkC,EAAI,GAC5BkmC,EAAUrB,EAAQb,MAAMhkC,EAAI,GAE5BmmC,EAAK,IAAIrmC,EACfqmC,EAAGvlC,EAAImkC,EAASC,KAAKgB,GACrBG,EAAGtlC,EAAIkkC,EAASE,KAAKe,GACrBG,EAAG9kC,EAAI0jC,EAASG,KAAKc,GAErB,MAAMI,EAAK,IAAItmC,EACfsmC,EAAGxlC,EAAImkC,EAASC,KAAKiB,GACrBG,EAAGvlC,EAAIkkC,EAASE,KAAKgB,GACrBG,EAAG/kC,EAAI0jC,EAASG,KAAKe,GAErB,MAAMhW,EAAK,IAAInwB,EACfmwB,EAAGrvB,EAAImkC,EAASC,KAAKkB,GACrBjW,EAAGpvB,EAAIkkC,EAASE,KAAKiB,GACrBjW,EAAG5uB,EAAI0jC,EAASG,KAAKgB,GAErB,MAAMG,EAAO,CACX9+B,EAAG4+B,EACHzmC,EAAG0mC,EACHE,EAAGrW,GAGL,GAAI4V,EACJ,CACE,MAAMzgC,EAAK,IAAItF,EACfsF,EAAGxE,EAAIilC,EAAQb,KAAKgB,GACpB5gC,EAAGvE,EAAIglC,EAAQZ,KAAKe,GACpB5gC,EAAG/D,EAAIwkC,EAAQX,KAAKc,GAEpB,MAAMO,EAAK,IAAIzmC,EACfymC,EAAG3lC,EAAIilC,EAAQb,KAAKiB,GACpBM,EAAG1lC,EAAIglC,EAAQZ,KAAKgB,GACpBM,EAAGllC,EAAIwkC,EAAQX,KAAKe,GAEpB,MAAMO,EAAK,IAAI1mC,EACf0mC,EAAG5lC,EAAIilC,EAAQb,KAAKkB,GACpBM,EAAG3lC,EAAIglC,EAAQZ,KAAKiB,GACpBM,EAAGnlC,EAAIwkC,EAAQX,KAAKgB,GAEpB,MAAMO,EAASrhC,EAAGvH,QAAQ0D,IAAIglC,GAAIhlC,IAAIilC,GAAIvnB,YAC1ConB,EAAKI,OAASA,EAGhB,GAAIX,EACJ,CACE,MAAM1gC,EAAK,IAAItF,EACfsF,EAAGxE,EAAIklC,EAASd,KAAKgB,GACrB5gC,EAAGvE,EAAIilC,EAASb,KAAKe,GACrB5gC,EAAG/D,EAAIykC,EAASZ,KAAKc,GAErB,MAAMO,EAAK,IAAIzmC,EACfymC,EAAG3lC,EAAIklC,EAASd,KAAKiB,GACrBM,EAAG1lC,EAAIilC,EAASb,KAAKgB,GACrBM,EAAGllC,EAAIykC,EAASZ,KAAKe,GAErB,MAAMO,EAAK,IAAI1mC,EACf0mC,EAAG5lC,EAAIklC,EAASd,KAAKkB,GACrBM,EAAG3lC,EAAIilC,EAASb,KAAKiB,GACrBM,EAAGnlC,EAAIykC,EAASZ,KAAKgB,GAErB,MAAMQ,EAAUthC,EAAGvH,QAAQ0D,IAAIglC,GAAIhlC,IAAIilC,GAAIvnB,YAC3ConB,EAAKK,QAAUA,EAEjB,GAAIrV,EACJ,CACE,MAAMsV,EAAO,IAAIl6B,EACjBk6B,EAAK/lC,EAAIywB,EAAI2T,KAAKgB,GAClBW,EAAK9lC,EAAIwwB,EAAI4T,KAAKe,GAElB,MAAMY,EAAO,IAAIn6B,EACjBm6B,EAAKhmC,EAAIywB,EAAI2T,KAAKiB,GAClBW,EAAK/lC,EAAIwwB,EAAI4T,KAAKgB,GAElB,MAAMY,EAAO,IAAIp6B,EACjBo6B,EAAKjmC,EAAIywB,EAAI2T,KAAKkB,GAClBW,EAAKhmC,EAAIwwB,EAAI4T,KAAKiB,GAElBG,EAAKM,KAAOA,EACZN,EAAKO,KAAOA,EACZP,EAAKQ,KAAOA,EAGdd,EAAM7lC,KAAKmmC,GAEX,MAAMS,EAAOpuC,KAAKquC,cAAcV,GAChCT,EAAWtmC,KAAKN,IAAI8nC,EAAMlB,GAC1BD,EAAWzlC,KAAK4mC,GAGlB,MAAME,EAAyBtuC,KAAKuuC,8BAA8BtB,EAAYC,EAAUG,GAClFmB,EAAiBxuC,KAAKyuC,oBAAoBH,EAAwBtB,GAExE,OADqBhtC,KAAK0uC,uBAAuBF,GAInDzuC,uBAAuBstC,GAErB,MAAMsB,EAAiB,GACjBC,EAAkB,GAClBC,EAAmB,GACnBC,EAAc,GAEpB,IAAK,IAAIxnC,EAAI,EAAGA,EAAI+lC,EAAMvnC,OAAQwB,IAClC,CACE,MAAMqmC,EAAON,EAAM/lC,GAEbynC,EAAKnoC,KAAKsC,SACV8lC,EAAKpoC,KAAKsC,SAEhBylC,EAAennC,KAAKxH,KAAKivC,qBAAqBF,EAAIC,EAAIrB,EAAK9+B,EAAG8+B,EAAK3mC,EAAG2mC,EAAKC,GAAGzoC,SAC1EwoC,EAAKI,QAEPa,EAAgBpnC,KAAKmmC,EAAKI,OAAO5oC,SAE/BwoC,EAAKK,SAEPa,EAAiBrnC,KAAKmmC,EAAKK,QAAQ7oC,SAEjCwoC,EAAKM,MAEPa,EAAYtnC,KAAKxH,KAAKivC,qBAAqBF,EAAIC,EAAIrB,EAAKM,KAAMN,EAAKO,KAAMP,EAAKQ,MAAMhpC,SAGxF,MAAO,CAAE8B,OAAQ0nC,EAAgBxB,QAASyB,EAAiBxB,SAAUyB,EAAkBlW,IAAKmW,GAG9F/uC,oBAAoBstC,EAAO6B,GAEzB,MAAMV,EAAiB,GACvB,IAAK,IAAIlnC,EAAI,EAAGA,EAAI4nC,EAAQ5nC,IAC5B,CACE,MACM6nC,EAAgB9B,EADPzmC,KAAKqC,MAAMrC,KAAKsC,SAAWmkC,EAAMvnC,SAGhD0oC,EAAehnC,KAAK2nC,GAGtB,OAAOX,EAGTzuC,8BAA8BktC,EAAYmC,EAAc/B,GAEtD,MAAMgC,EAA4B,GAClC,IAAK,IAAI/nC,EAAI,EAAGA,EAAI2lC,EAAWnnC,OAAQwB,IACvC,CACE2lC,EAAW3lC,IAAM8nC,EACjB,MAAME,EAAqB1oC,KAAKqC,MAAMrC,KAAKC,MAAMomC,EAAW3lC,KAC5D,IAAK,IAAIioC,EAAI,EAAGA,EAAID,EAAoBC,IAEtCF,EAA0B7nC,KAAK6lC,EAAM/lC,IAGzC,OAAO+nC,EAGTtvC,cAAc4tC,GAEZ,MAAM6B,EAAO7B,EAAK3mC,EAAE7B,QAAQmiB,IAAIqmB,EAAK9+B,GAC/B4gC,EAAO9B,EAAKC,EAAEzoC,QAAQmiB,IAAIqmB,EAAK9+B,GACrC,OAAO2gC,EAAK9P,MAAM+P,GAAM3pC,SAAW,EAGrC/F,qBAAqBgvC,EAAIC,EAAIvB,EAAIC,EAAInW,GAE/BwX,EAAKC,EAAK,IAEZD,EAAK,EAAMA,EACXC,EAAK,EAAMA,GAGb,MAAMU,EAAK,GAAOX,EAAKC,GAEvB,OAAOvB,EAAGtoC,QAAQ2D,eAAeimC,GAAIlmC,IAAI6kC,EAAGvoC,QAAQ2D,eAAekmC,IAAKnmC,IAAI0uB,EAAGpyB,QAAQ2D,eAAe4mC,MCxCrG,MAACC,GAAkB,IA5JxB,MAEE5vC,SAAS0iB,EAAOmtB,GAEdntB,EAAMC,UAAUC,IAEVA,aAAiBM,IAEfN,EAAMC,WAERD,EAAMC,UAAW,IAAIlB,GAAiBmuB,aAAaltB,EAAMC,WAE3DgtB,EAAgBjtB,OAKtB5iB,eAAe0iB,GAEb,MAAMqtB,EAAa,GAMnB,OAJA9vC,KAAK+vC,SAASttB,GAAQE,IAEpBmtB,EAAWtoC,KAAKmb,EAAMC,aAEjBktB,EAGT/vC,gBAAgB0iB,EAAOK,EAAU9hB,GAE/ByhB,EAAMC,UAAUC,IAEVA,aAAiBM,SAGNjf,IAAThD,GAOE2hB,EAAM3hB,OAASA,KALnB2hB,EAAMG,SAAWA,MAczB/iB,oBAAoBiwC,GAElB,MAAM7qC,EAAQ,CACZ8qC,WAAYD,EAAKC,WACjBxtB,MAAOutB,EAAKvtB,MAAMtd,OAAM,IAGpB+qC,EAAgB,GAEtBF,EAAKvtB,MAAMC,UAAS7U,IAEdA,EAAKsiC,gBAEPD,EAAcriC,EAAK7M,MAAQ6M,MAI/B,MAAMuiC,EAAa,GACbC,EAAqB,GAE3BlrC,EAAMsd,MAAMC,UAAS7U,IAEfA,EAAKyiC,SAEPF,EAAWviC,EAAK7M,MAAQ6M,GAGtBA,EAAKsiC,gBAEPE,EAAmBxiC,EAAK7M,MAAQ6M,MAIpC,IAAK,MAAM7M,KAAQkvC,EACnB,CACE,MACMK,EADcL,EAAclvC,GACLuvC,SACvBC,EAAmBH,EAAmBrvC,GAEtCyvC,EAAoB,GAE1B,IAAK,IAAInpC,EAAI,EAAGA,EAAIipC,EAASG,MAAM5qC,SAAUwB,EAC7C,CACE,MAAMqpC,EAAYP,EAAWG,EAASG,MAAMppC,GAAGtG,MAC/CyvC,EAAkBjpC,KAAKmpC,GAGzBH,EAAiB7rC,KACf,IAAIisC,EAASH,EAAmBF,EAASM,cACzCL,EAAiBM,aAGrB,OAAO3rC,EAGTpF,kBAAkB0iB,EAAOsuB,EAAMC,GAE7BvuB,EAAMC,UAAUC,IAEVA,aAAiBM,IAEnBN,EAAMsuB,WAAaF,EACnBpuB,EAAMuuB,cAAgBF,MAK5BjxC,cAAc0iB,EAAOwT,EAAa2Z,GAEhCntB,EAAMC,UAAU+oB,IAEVA,EAAIzqC,OAASi1B,GAEf2Z,EAAgBnE,MAKtB1rC,WAAW0iB,EAAOwT,GAEhB,IAAImK,EAQJ,OAPA3d,EAAMC,UAAU+oB,IAEVA,EAAIzqC,OAASi1B,IAEfmK,EAASqL,MAGNrL,EAGTrgC,mBAAmB0iB,EAAO0uB,GAExB,IAAI/Q,EAQJ,OAPA3d,EAAMC,UAAU+oB,IAEVA,EAAIlgC,YAAYvK,OAASmwC,IAE3B/Q,EAASqL,MAGNrL,IC5JX,MAAMgR,GAEJrxC,iBAAiBsxC,GAEf,OAAQA,GAAwB,iBAATA,IAAsBC,MAAMC,QAAQF,GAG7DtxC,kBAAkB4H,KAAW6pC,GAE3B,IAAKA,EAAQ1rC,OAAQ,OAAO6B,EAC5B,MAAMyjC,EAASoG,EAAQ98B,QAEvB,GAAI08B,GAAgBK,UAAU9pC,IAAWypC,GAAgBK,UAAUrG,GAEjE,IAAK,MAAMhY,KAAOgY,EAEZgG,GAAgBK,UAAUrG,EAAOhY,KAE9BzrB,EAAOyrB,IAAMnpB,OAAOkM,OAAOxO,EAAQ,CAAE5H,CAACqzB,GAAM,KACjDge,GAAgBM,WAAW/pC,EAAOyrB,GAAMgY,EAAOhY,KAI/CnpB,OAAOkM,OAAOxO,EAAQ,CAAE5H,CAACqzB,GAAMgY,EAAOhY,KAK5C,OAAOge,GAAgBM,WAAW/pC,KAAW6pC,GAG/CzxC,mBAAmBgQ,GAGjB,IAAI07B,EAAM,GAEV,GAAqB,IAAjB17B,EAAI4hC,UAGN,GAAI5hC,EAAI6hC,WAAW9rC,OAAS,EAC5B,CACE2lC,EAAI,eAAiB,GACrB,IAAK,IAAI8D,EAAI,EAAGA,EAAIx/B,EAAI6hC,WAAW9rC,OAAQypC,IAC3C,CACE,MAAMsC,EAAY9hC,EAAI6hC,WAAWP,KAAK9B,GACtC9D,EAAI,eAAeoG,EAAUC,UAAYD,EAAUE,iBAI/B,IAAjBhiC,EAAI4hC,WAEXlG,EAAM17B,EAAIgiC,WAIZ,GAAIhiC,EAAIiiC,gBAEN,IAAK,IAAI1qC,EAAI,EAAGA,EAAIyI,EAAIkiC,WAAWnsC,OAAQwB,IAC3C,CACE,MAAM+pC,EAAOthC,EAAIkiC,WAAWZ,KAAK/pC,GAC3BwqC,EAAWT,EAAKS,SACtB,QAA+B,IAAnBrG,EAAIqG,GAEdrG,EAAIqG,GAAY9xC,KAAKkyC,YAAYb,OAGnC,CACE,QAAoC,IAAxB5F,EAAIqG,GAAc,KAC9B,CACE,MAAMK,EAAM1G,EAAIqG,GAChBrG,EAAIqG,GAAY,GAChBrG,EAAIqG,GAAUtqC,KAAK2qC,GAErB1G,EAAIqG,GAAUtqC,KAAKxH,KAAKkyC,YAAYb,KAI1C,OAAO5F,GC7EX,MAAM2G,GAEJryC,eAGAA,0BAEE,MAAMsyC,EAAY,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,KAC1E,IAAIC,EAAM,IAEV,IAAK,IAAIhrC,EAAI,EAAGA,EAAI,EAAGA,IACvB,CAEEgrC,GAAOD,EADOzrC,KAAKqC,MAAMrC,KAAKsC,SAAWmpC,EAAUvsC,SAIrD,OAAOwsC,EAGTvyC,kBAAkB2Y,GAEhB,MAAM65B,EAAQ75B,EAAOpW,MAAM,KAE3B,IAAK,IAAIgF,EAAI,EAAGA,EAAIirC,EAAMzsC,OAAQwB,IAEhCirC,EAAMjrC,GAAKirC,EAAMjrC,GAAG,GAAGsR,cAAgB25B,EAAMjrC,GAAGkrC,OAAO,GAGzD,OAAOD,EAAMvwC,KAAK,KAGpBjC,+BAA+B2Y,GAE7B,OAAOA,EAAO+5B,OAAO,GAAG75B,cAAgBF,EAAO3W,MAAM,GAGvDhC,0BAA0B2Y,GAExB,OAAOA,EAAOpY,cAAc2B,QAAQ,iBAAkB6W,GAAUA,EAAM/W,OAAO,GAAG6W,iBCtCpF,MAAM85B,GAEJ3yC,eAIAA,eAAe4yC,GAEbA,EAAWA,EAASrwC,MAAM,KAE1B,IAAIswC,EAAQvwC,OAAOswC,EAAS,IAC5BC,EAAgB,GAARA,EAAa,GAAK,IAE1B,IAAIC,EAAUxwC,OAAOswC,EAAS,IAC9BE,EAAoB,GAAVA,EAAe,IAEzB,IAAIC,EAAUzwC,OAAOswC,EAAS,IAG9B,OAFAG,GAAoB,IAEbF,EAAQC,EAAUC,GCT7B,MAAMC,WAAa9vB,EAEjBljB,cAEE,MAAM+iB,EAAW,IAAIjJ,EAAe,CAClCG,SAAU,CACRK,OAAQ,CAAEzU,MAAO,IAAI0U,EAAM,aAE7BL,6OACAE,0WACAmT,WAAY,CAAE0lB,aAAa,GAC3BprB,aAAa,EACb9M,YAAY,IAGRm4B,EAAiB,IAAIzrB,EAAc,IAAK,IAAK,IAAK,KAIxDza,MAF6Bk/B,GAAkBiH,gCAAgCD,GAEnDnwB,GAE5B9iB,KAAKmzC,SAASjrC,GAAI,MCtBtB,MAAM2Z,WAAaoB,EAEjBljB,YAAYkH,GAEV,MAAM2b,EAAW,IAAIlB,EACrBkB,EAAS9E,aAAa,WAAsB,IAAI2a,EAAgB,IAAIxG,aAAa,IAAK,IACtFrP,EAAS9E,aAAa,gBAAsB,IAAI2a,EAAgB,IAAIxG,aAAa,IAAK,IACtFrP,EAAS9E,aAAa,oBAAsB,IAAI2a,EAAgB,IAAIxG,aAAa,IAAK,IACtFrP,EAAS9E,aAAa,cAAsB,IAAI2a,EAAgB,IAAIxG,aAAa,IAAK,IACtFrP,EAAS9E,aAAa,WAAsB,IAAI2a,EAAgB,IAAIxG,aAAa,IAAK,IAiBtFllB,MAAM6V,EAfW,IAAI/I,EAAe,CAClCG,SAAU,CACRo5B,WAAY,CAAExtC,MAAO,IACrBytC,QAAS,CAAEztC,MAAO,GAClB0tC,aAAc,CAAE1tC,MAAO,GACvByU,OAAQ,CAAEzU,MAAO,IAAI0U,EAAM,aAE7BL,+sBACAE,8jBACAyN,aAAa,EACb9M,YAAY,EACZwS,WAAY,CAAE0lB,aAAa,MAMzB/rC,GAEFjH,KAAKuzC,MAAMtsC,GAIflH,MAAMkH,GAEJ,MAAMolC,EAAW,GACXmH,EAAgB,GAChBC,EAAoB,GACpBC,EAAc,GACdC,EAAW,GACjB,IAAIC,EAAqB,EAEzB,IAAK,IAAItsC,EAAI,EAAGA,EAAIL,EAAOnB,OAAQwB,IACnC,CACE+kC,EAAS7kC,KAAKP,EAAOK,GAAGY,GACxBmkC,EAAS7kC,KAAKP,EAAOK,GAAGa,GACxBkkC,EAAS7kC,KAAKP,EAAOK,GAAGqB,GACxB+qC,EAAYlsC,KAAK,GAEjB6kC,EAAS7kC,KAAKP,EAAOK,GAAGY,GACxBmkC,EAAS7kC,KAAKP,EAAOK,GAAGa,GACxBkkC,EAAS7kC,KAAKP,EAAOK,GAAGqB,GACxB+qC,EAAYlsC,MAAM,GAElB,MAAMqsC,EAAa7zC,KAAK8zC,oBAAoB7sC,EAAQK,GACpDksC,EAAchsC,KAAKqsC,EAAW3rC,GAC9BsrC,EAAchsC,KAAKqsC,EAAW1rC,GAC9BqrC,EAAchsC,KAAKqsC,EAAWlrC,GAE9B6qC,EAAchsC,KAAKqsC,EAAW3rC,GAC9BsrC,EAAchsC,KAAKqsC,EAAW1rC,GAC9BqrC,EAAchsC,KAAKqsC,EAAWlrC,GAE9B,MAAMorC,EAAiB/zC,KAAKg0C,wBAAwB/sC,EAAQK,GAC5DmsC,EAAkBjsC,KAAKusC,EAAe7rC,GACtCurC,EAAkBjsC,KAAKusC,EAAe5rC,GACtCsrC,EAAkBjsC,KAAKusC,EAAeprC,GAEtC8qC,EAAkBjsC,KAAKusC,EAAe7rC,GACtCurC,EAAkBjsC,KAAKusC,EAAe5rC,GACtCsrC,EAAkBjsC,KAAKusC,EAAeprC,GAEtCgrC,EAASnsC,KAAKosC,GACdD,EAASnsC,KAAKosC,GAEVtsC,EAAIL,EAAOnB,OAAS,IAEtB8tC,GAAsB3sC,EAAOK,GAAG+f,WAAWwsB,IAG/C,MAAMI,EAAwB,IAAIhiB,aAAaoa,GACzC6H,EAAwB,IAAIjiB,aAAauhB,GACzCW,EAAwB,IAAIliB,aAAawhB,GACzCW,EAAwB,IAAIniB,aAAayhB,GACzCW,EAAwB,IAAIpiB,aAAa0hB,GAEzCxH,EAAU,GAChB,IAAK,IAAI7kC,EAAI,EAAGA,GAAM2sC,EAAWnuC,OAAS,EAAK,GAAK,EAAGwB,IACvD,CACE,MAAMgwB,EAAa,EAAJhwB,EAAS,EACxB6kC,EAAQ3kC,KAAK8vB,GACb6U,EAAQ3kC,KAAK8vB,EAAQ,GACrB6U,EAAQ3kC,KAAK8vB,EAAQ,GAErB6U,EAAQ3kC,KAAK8vB,GACb6U,EAAQ3kC,KAAK8vB,EAAQ,GACrB6U,EAAQ3kC,KAAK8vB,EAAQ,GAGvBt3B,KAAK4iB,SAAS0xB,SAASnI,GACvBnsC,KAAK4iB,SAAS5U,aAAa,YAAY8X,KAAK,IAAI2S,EAAgBwb,EAAY,IAC5Ej0C,KAAK4iB,SAAS5U,aAAa,iBAAiB8X,KAAK,IAAI2S,EAAgByb,EAAkB,IACvFl0C,KAAK4iB,SAAS5U,aAAa,qBAAqB8X,KAAK,IAAI2S,EAAgB0b,EAAsB,IAC/Fn0C,KAAK4iB,SAAS5U,aAAa,eAAe8X,KAAK,IAAI2S,EAAgB2b,EAAiB,IACpFp0C,KAAK4iB,SAAS5U,aAAa,YAAY8X,KAAK,IAAI2S,EAAgB4b,EAAc,IAE9Er0C,KAAK4iB,SAAS5U,aAAa,YAAYiR,aAAc,EACrDjf,KAAK4iB,SAAS5U,aAAa,iBAAiBiR,aAAc,EAC1Djf,KAAK4iB,SAAS5U,aAAa,qBAAqBiR,aAAc,EAC9Djf,KAAK4iB,SAAS5U,aAAa,eAAeiR,aAAc,EACxDjf,KAAK4iB,SAAS5U,aAAa,YAAYiR,aAAc,EAErDjf,KAAK8iB,SAAS9I,SAASq5B,QAAQztC,MAAQguC,EACvC5zC,KAAKu0C,QAAUX,EAGjBY,cAAc5uC,GAEZ5F,KAAK8iB,SAAS9I,SAASo5B,WAAWxtC,MAAQA,EAG5C4uC,gBAEE,OAAOx0C,KAAK8iB,SAAS9I,SAASo5B,WAAWxtC,MAG3C7F,wBAAwBkH,EAAQK,GAE9B,OAAU,IAANA,EAEKL,EAAO,GAAG9B,QAAQmiB,IAAIrgB,EAAO,IAAI6B,gBAAgB,GAAGD,IAAI5B,EAAO,IAI/DA,EAAOK,EAAI,GAItBvH,oBAAoBkH,EAAQK,GAE1B,OAAIA,IAAML,EAAOnB,OAAS,EAEjBmB,EAAOA,EAAOnB,OAAS,GAAGX,QAAQmiB,IAAIrgB,EAAOA,EAAOnB,OAAS,IAAIgD,gBAAgB,GAAGD,IAAI5B,EAAOA,EAAOnB,OAAS,IAI/GmB,EAAOK,EAAI,GAItBvH,UAIAA,WAEE,OAAOC,KAAK4zC,mBAGd7zC,eAEE,OAAOC,KAAK4zC,mBAGd7zC,UAEEC,KAAK4iB,SAASC,UACd7iB,KAAK8iB,SAASD,UACV7iB,KAAKy0C,QAEPz0C,KAAKy0C,OAAOr7B,OAAOpZ,MAIvBwhB,UAAUxY,GAERhJ,KAAK8iB,SAAS9I,SAASK,OAAOzU,MAAM2W,IAAIvT,GAG1CwY,YAEE,OAAOxhB,KAAK8iB,SAAS9I,SAASK,OAAOzU,MAGvC7F,WAAWiJ,GAEThJ,KAAK8iB,SAAS9I,SAASK,OAAOzU,MAAMkgB,KAAK9c,IC1L7C,MAAM0rC,WAAmBzxB,EAEvBljB,YAAYkrB,EAAS0pB,GAEnBA,EAAQA,GAAS,IAAI5gC,EAAQ,EAAG,GAChC,MAAM+O,EAAW,IAAIjJ,EAAe,CAClCG,SAAU,CACRW,SAAU,CAAE/U,MAAOqlB,GACnB2pB,eAAgB,CAAEhvC,MAAO,GACzBivC,OAAQ,CAAEjvC,MAAO,GACjBkvC,SAAU,CAAElvC,MAAO,IAErBqU,igBACAE,mLACAyN,aAAa,EACb9M,YAAY,EACZ6E,KAAMo1B,IAEFnyB,EAAW,IAAI4E,EAAc,EAAG,EAAG,GACzC5E,EAASgB,WAAW+wB,EAAMzsC,EAAI,GAAIysC,EAAMxsC,EAAI,EAAG,GAC/C,MAAM6sC,EAAgB/pB,EAAQxY,MAAM4L,MAAQ4M,EAAQxY,MAAMyM,OAC1D0D,EAASxB,MAAM4zB,EAAe,EAAG,GACjCjoC,MAAM6V,EAAUE,GAChB9iB,KAAKg1C,cAAgBA,EACrBh1C,KAAK4iB,SAASqyB,qBAEdj1C,KAAKk1C,YAAc,IAAI9tC,EACvBpH,KAAK4iB,SAASuyB,YAAY/pB,QAAQprB,KAAKk1C,aAGzCn1C,iBAEEC,KAAK8iB,SAAS9I,SAASW,SAAS/U,MAAMqZ,aAAc,EACpD,MAAMm2B,EAAMp1C,KAAK8iB,SAAS9I,SAASW,SAAS/U,MAAM6M,MAElDzS,KAAK4iB,SAASxB,MAAM,EAAIphB,KAAKg1C,cAAe,EAAG,GAC/Ch1C,KAAKg1C,cAAgBI,EAAI/2B,MAAQ+2B,EAAIl2B,OACrClf,KAAK4iB,SAASxB,MAAMphB,KAAKg1C,cAAe,EAAG,GAC3Ch1C,KAAK4iB,SAASqyB,qBACdj1C,KAAK4iB,SAASuyB,YAAY/pB,QAAQprB,KAAKk1C,aAGzChyC,WAEE,OAAOlD,KAAKk1C,YAAY/vC,QAAQ2D,eAAe9I,KAAKohB,MAAMlZ,GAG5DhF,SAAS0C,GAEP5F,KAAKohB,MAAM7E,IAAI3W,EAAOA,EAAOA,GAC7B5F,KAAK8iB,SAAS9I,SAAS66B,OAAOjvC,MAAQA,EAGxCyvC,mBAAmBC,GAEjBt1C,KAAK8iB,SAAS9I,SAAS46B,eAAehvC,OAAoB,IAAZ0vC,EAAmB,EAAI,EAGvED,qBAEE,OAAuD,IAAhDr1C,KAAK8iB,SAAS9I,SAAS46B,eAAehvC,MAG/C4T,YAAYA,GAEVxZ,KAAK8iB,SAAS9I,SAAS86B,SAASlvC,MAAQ4T,EAG1CA,cAEE,OAAOxZ,KAAK8iB,SAAS9I,SAAS86B,SAASlvC,MAGzC7F,UAEEC,KAAK4iB,SAASC,UACd7iB,KAAKy0C,OAAOr7B,OAAOpZ,MACnBA,KAAK8iB,SAAS9I,SAASW,SAAS/U,MAAMid,UACtC7iB,KAAK8iB,SAASD,WClFlB,MAAM0yB,WAAeb,GAEnB30C,YAAYke,EAAMC,EAAMsD,EAAOmzB,EAAOa,GAEpC,MAAMC,EAAqB,IAAItL,GAAiBqL,GAE1CE,EAAgB,CACpBx3B,KAAMA,EACNM,WAAYgD,GAAS,WAEjB7C,EAAiB82B,EAAmBE,gBAAgB13B,EAAMy3B,GAEhE/2B,EAAe2S,UAAYskB,EAC3Bj3B,EAAe2S,UAAYkV,EAC3B7nB,EAAeM,aAAc,EAC7BlS,MAAM4R,EAAgBg2B,GAEtB30C,KAAKy1C,mBAAqBA,EAC1Bz1C,KAAK2e,eAAiBA,EACtB3e,KAAK01C,cAAgBA,EAGvBz3B,SAASrY,GAEP5F,KAAKy1C,mBAAmB/2B,YAAY9Y,EAAO5F,KAAK01C,eAChD11C,KAAK61C,iBAGP53B,WAEE,MAAO,mBC1BX,MAAM63B,WAA0Bl8B,GAE9B7Z,YAAYg2C,EAAY,GAEtBhpC,w1BAAkB,CAChB4N,SAAU,CAAE/U,WAAO5B,GACnBohB,YAAa,CAAExf,MAAO,IAAImO,EAAQqS,GAAQ/H,MAAO+H,GAAQlH,SACzDmG,aAAc,CAAEzf,MAAO,IAAImO,GAC3BiiC,aAAc,CAAEpwC,MAAO,IAAImO,EAAQ,EAAG,IACtCkiC,KAAM,CAAErwC,MAAO,IAAIwB,GACnB8uC,YAAa,CAAEtwC,MAAO,IAAImO,GAC1BoiC,aAAc,CAAEvwC,MAAO,KAEzB5F,KAAK4nB,aAAc,EACnB5nB,KAAK8a,YAAa,EAClB9a,KAAKib,WAAY,GCvBrB,MAAMm7B,GAEJr2C,cAEEC,KAAK2+B,QAAU,IAAI5qB,EAGrBhU,YAAYykB,GAEV,OAAOxkB,KAAK2+B,QAAQpiB,IAAIiI,EAAStc,EAAGsc,EAASrc,ICNjD,MAAMkuC,GAEJt2C,cAEEC,KAAKs2C,SAAW,IAAIlvC,EACpBpH,KAAKu2C,SAAW,IAAIxiC,EAGtBhU,YAAYykB,GAKV,OAHAxkB,KAAKs2C,SAASxwB,KAAKtB,GACnBxkB,KAAKs2C,SAAShW,QAAQ/W,GAAc3d,SAE7B5L,KAAKu2C,SAASh6B,IAAIvc,KAAKs2C,SAASpuC,EAAGlI,KAAKs2C,SAASnuC,IClB5D,MAAMquC,GAEJz2C,eAKAA,OAAO02C,EAAYC,IAKnB32C,SAAS02C,IAGT12C,QAAQ02C,KCbV,MAAME,WAAeH,GAEnBz2C,cAEEgN,QAGFhN,OAAO02C,EAAYC,GAEbD,EAAWG,cAAcF,IAE3BD,EAAWz+B,UAAUy+B,EAAWI,kBCXtC,MAAMC,WAAqBN,GAEzBz2C,cAEEgN,QAGFhN,SAAS02C,GAEPA,EAAWM,iBAGbh3C,OAAO02C,EAAYC,GAEbD,EAAWG,cAAcF,GAE3BD,EAAWz+B,UAAUy+B,EAAWO,iBAIhCP,EAAWz+B,UAAUy+B,EAAWQ,iBCpBtC,MAAMC,WAAoBV,GAExBz2C,cAEEgN,QAGFhN,SAAS02C,GAEPA,EAAWU,gBACXV,EAAWz+B,UAAUy+B,EAAWW,iBCVpC,MAAMC,WAAqBb,GAEzBz2C,cAEEgN,QAGFhN,SAAS02C,GAEPz2C,KAAKs3C,mBAAmBb,GAG1B12C,OAAO02C,EAAYC,GAEbD,EAAWG,cAAcF,GAE3B12C,KAAKs3C,mBAAmBb,GAIxBA,EAAWz+B,UAAUy+B,EAAWQ,gBAIpCl3C,mBAAmB02C,GAEjBA,EAAWc,kBCRf,MAAMC,WAAkBv0B,EAEtBljB,YAAY+Z,EAAMC,GAEhBhN,MAAM,IAAIya,EAAc,EAAG,GAAI,IAAIsuB,IAEnC91C,KAAKy3C,cAAe,EAEpBz3C,KAAK03C,kBAAoB,IAAIrB,GAC7Br2C,KAAKoV,cAAgB,IAAIuhC,GAEzB32C,KAAK23C,UAAY,IAAIvwC,EAErBpH,KAAKo3C,eAAiB,IAAIT,GAC1B32C,KAAK62C,gBAAkB,IAAIC,GAC3B92C,KAAKi3C,eAAiB,IAAIC,GAC1Bl3C,KAAKg3C,gBAAkB,IAAIK,GAE3Br3C,KAAKgW,cAAWhS,EAChBhE,KAAKyW,aAAUzS,EACfhE,KAAK43C,cAAW5zC,EAEhBhE,KAAK63C,cAAgB,IAAI9jC,EACzB/T,KAAK83C,oBAAsB,IAAI/jC,EAC/B/T,KAAK+3C,eAAiB,IAAIhkC,EAE1B/T,KAAKg4C,aAAe,IAAIjkC,EAAQ,EAAG,GAEnC/T,KAAKinB,eAAgB,EACrBjnB,KAAKi4C,kBAAmB,EACxBj4C,KAAK8hB,YAAc,EAEnB9hB,KAAKkD,KAAO,EACZlD,KAAKk4C,aAAe,IAAInkC,EAG1BhU,iBAAiB6F,GAEf5F,KAAK8hB,YAAclc,EAGrBuyC,kBAEE,OAAOn4C,KAAK8iB,SAAS9I,SAASk8B,YAAYtwC,MAG5C7F,iBAAiBkpB,GAEfjpB,KAAKk4C,aAAapyB,KAAKmD,GACvBjpB,KAAK8iB,SAAS9I,SAASg8B,aAAapwC,MAAMkgB,KAAKmD,GAGjDlpB,UAAUmuB,GAERluB,KAAKoV,cAAcqB,QAAQzW,MAC3BA,KAAKoV,cAAgB8Y,EACrBluB,KAAKoV,cAAcY,SAAShW,MAG9BwkB,eAEE,OAAOxkB,KAAK23C,UAGdS,cAAc9C,GAEZt1C,KAAK8iB,SAAS7H,UAAYq6B,EAG5B8C,gBAEE,OAAOp4C,KAAK8iB,SAAS7H,UAGvBo9B,iBAAiBzyC,GAEf5F,KAAK8iB,SAAS9I,SAASm8B,aAAavwC,MAAQA,EAG9CyyC,mBAEE,OAAOr4C,KAAK8iB,SAAS9I,SAASm8B,aAAavwC,MAG7C7F,cAEEC,KAAKs4C,SAAU,EAGjBv4C,oCAEEC,KAAK03C,kBAAoB,IAAIrB,GAG/Bt2C,qCAEEC,KAAK03C,kBAAoB,IAAItB,GAG/Br2C,YAAYkrB,GAEVA,EAAQqG,UAAYvS,EACpBkM,EAAQsG,UAAYxS,EACpBkM,EAAQhM,aAAc,EAEtBjf,KAAKg4C,aAAaz7B,IAAI0O,EAAQxY,MAAM4L,MAAO4M,EAAQxY,MAAMyM,QAEzDlf,KAAK8iB,SAAS9I,SAASW,SAAS/U,MAAQqlB,EACxCjrB,KAAKu4C,SAASv4C,KAAK8iB,SAAS9I,SAASqL,aAAazf,OAClD5F,KAAKs4C,SAAU,EAGjBv4C,aAAay4C,GAEXx4C,KAAK8iB,SAAS9I,SAASoL,YAAYxf,MAAM2W,IAAI6J,GAAQ/H,MAAO+H,GAAQlH,QACpElf,KAAKu4C,SAASv4C,KAAK8iB,SAAS9I,SAASqL,aAAazf,OAElD5F,KAAK83C,oBAAoBhyB,KAAK9lB,KAAK03C,kBAAkBe,YAAYz4C,KAAKwkB,WACtExkB,KAAK8iB,SAAS9I,SAASi8B,KAAKrwC,MAAMkgB,KAAK9lB,KAAKwkB,UAC5CxkB,KAAKoV,cAAcS,OAAO7V,KAAMw4C,GAGlCz4C,cAAcy4C,GAEZx4C,KAAK+3C,eAAejyB,KAAK9lB,KAAK83C,qBAC9B93C,KAAK04C,mBAAmB14C,KAAK+3C,gBAC7B/3C,KAAK+3C,eAAe7vC,GAAKlI,KAAKk4C,aAAahwC,EAC3ClI,KAAK+3C,eAAe5vC,GAAKnI,KAAKk4C,aAAa/vC,EAE3C,MAAMwwC,GAAO,IAAIC,GAAO7wB,qBAAqB/nB,KAAK+3C,eAAgB/3C,KAAKu4C,YAKvE,OAHAv4C,KAAK63C,cAAc/xB,KAAK0yB,GACxBx4C,KAAK04C,mBAAmB14C,KAAK63C,eAEtBc,EAAKE,cAAc74C,KAAK63C,eAGjC93C,mBAAmB+4C,GAEjBA,EAAc5wC,GAAuB,GAAlB4wC,EAAc5wC,EAAU,IAAOke,GAAQ/H,MAASre,KAAKk4C,aAAahwC,EACrF4wC,EAAc3wC,GAAuB,GAAlB2wC,EAAc3wC,EAAU,IAAOie,GAAQlH,OAASlf,KAAKk4C,aAAa/vC,EAGvFpI,4BAEE,MAAMmnB,EAAMlnB,KAAK83C,oBAAoB3yC,QAErC,OADAnF,KAAK04C,mBAAmBxxB,GACjBA,EAGTnnB,0BAA0Bg5C,GAExB/4C,KAAKwkB,SAAStc,EAAK6wC,EAAW7wC,EAAIke,GAAQ/H,MAAS,EAAI,EACvDre,KAAKwkB,SAASrc,EAAK4wC,EAAW5wC,EAAIie,GAAQlH,OAAU,EAAI,EAG1Dnf,UAEMC,KAAK8iB,SAAS9I,SAASW,SAAS/U,OAElC5F,KAAK8iB,SAAS9I,SAASW,SAAS/U,MAAMid,UAGxC7iB,KAAK4iB,SAASC,UACd7iB,KAAK8iB,SAASD,UAGhB9iB,SAAS+kB,GAEP,OAAIA,EAEKA,EAAQgB,KAAK9lB,KAAKg4C,cAAclvC,eAAe9I,KAAKkD,KAAOkjB,GAAQjG,MAInE,IAAIpM,GAAU+R,KAAK9lB,KAAKg4C,cAAclvC,eAAe9I,KAAKkD,KAAOkjB,GAAQjG,KAIpFpgB,kBAGAA,iBAGAA,mBC3MF,MAAMi5C,WAA8B/1B,EAElCljB,YAAY6iB,EAAUE,GAEpB/V,MAAM6V,EAAUE,GAEhB,MAAMm2B,EAAOj5C,KAEbA,KAAKk5C,eAAiB,KAEpBD,EAAKn2B,SAASjN,WCVpB,MAAMsjC,GAEJp5C,YAAYkpB,EAAQmwB,EAAcC,GAEhC,MAAMh7B,EAAU+6B,EAAa3Z,MAAQ2Z,EAAa7Y,KAC5CrhB,EAAUk6B,EAAa5Y,IAAQ4Y,EAAa3Y,OAElDzgC,KAAKohB,MAAW,IAAIrN,EAAQsK,EAAOa,GACnClf,KAAKwkB,SAAW,IAAIzQ,EAAQkV,EAASmwB,EAAa7Y,KAAM6Y,EAAa3Y,QAErEzgC,KAAKq5C,aAAe,IAAI5xB,EAAQ4xB,EAAa9Y,KAAM8Y,EAAa5Z,MAAO4Z,EAAa7Y,IAAK6Y,EAAa5Y,SCT1G,MAAM6Y,GAEJv5C,YAAYw5C,EAAct7B,EAAO,IAE/Bje,KAAKu5C,aAAeA,EAEpBv5C,KAAKw5C,OAAS,GAEdx5C,KAAKy5C,gBAAkB,EACvBz5C,KAAK05C,iBAAkB,EACvB15C,KAAK25C,gBAAkB,EAEvB35C,KAAKwkB,SAAW,IAAIpd,EACpBpH,KAAKokB,WAAa,IAAIsZ,EACtB19B,KAAKohB,MAAQ,IAAIha,EAAQ,EAAG,EAAG,GAC/BpH,KAAK45C,OAAS,IAAItb,EAElBt+B,KAAKwhB,MAAQ,IAAIlH,EAAM,WAEvBta,KAAKm4C,YAAc,IAAIpkC,EACvB/T,KAAK65C,UAAY,EAEjB75C,KAAK85C,OAAW77B,EAEhBje,KAAK+5C,kBAAkB97B,GAGzBA,SAASrY,GAEP5F,KAAK85C,OAASl0C,EACd5F,KAAK+5C,kBAAkBn0C,GACvB5F,KAAK05C,iBAAkB,EAGzBz7B,WAEE,OAAOje,KAAK85C,OAGd/5C,gBAEEC,KAAK45C,OAAOI,QAAQh6C,KAAKwkB,SAAUxkB,KAAKokB,WAAYpkB,KAAKohB,OACzDphB,KAAK05C,iBAAkB,EACvB15C,KAAKy5C,gBAAiB,EAGxB15C,oBAEEC,KAAKy5C,gBAAiB,EAGxB15C,oBAEEC,KAAK25C,gBAAiB,EAGxB55C,aAAa2zC,EAAc,EAAGuG,EAAO,GAEnC,MAAMC,GAAkB,IAAIxc,GAAaC,iBAAiB,IAAIv2B,EAAQ,EAAG,EAAG,GAAKssC,EAAc,IAAO9sC,KAAK2B,GAAK,GAC1G4xC,GAAW,IAAIzc,GAAaC,iBAAiB,IAAIv2B,EAAQ,EAAG,EAAG,IAAM6yC,EAAO,IAAOrzC,KAAK2B,GAAK,GAEnGvI,KAAKokB,WAAW0B,KAAKo0B,EAAgBE,SAASD,IAC9Cn6C,KAAK05C,iBAAkB,EAGzB35C,aAAamnB,GAEXlnB,KAAKwkB,SAASsB,KAAKoB,GACnBlnB,KAAK05C,iBAAkB,EAGzB35C,SAASmD,GAEPlD,KAAKohB,MAAM7E,IAAIrZ,EAAMA,EAAMA,GAC3BlD,KAAK05C,iBAAkB,EAGzB35C,UAAUiJ,GAERhJ,KAAKwhB,MAAMjF,IAAIvT,GACfhJ,KAAK25C,gBAAiB,EAGxB55C,UAAU40C,GAER30C,KAAKm4C,YAAYryB,KAAK6uB,GACtB30C,KAAKq6C,gBAGP7gC,YAAY8gC,GAEVt6C,KAAK65C,UAAYS,EACjBt6C,KAAK25C,gBAAiB,EAGxBngC,cAEE,OAAOxZ,KAAK65C,UAGd95C,gBAEEC,KAAK+5C,kBAAkB/5C,KAAKie,MAG9Ble,kBAAkBke,GAEhB,IAAIs8B,EAAS,EAEbv6C,KAAKw5C,OAAO1zC,OAAS,EAErB,IAAK,IAAIwB,EAAI,EAAGA,EAAI2W,EAAKnY,OAAQwB,IACjC,CACE,MAAMkzC,EAAUv8B,EAAKw8B,WAAWnzC,GAC1BozC,EAAQ16C,KAAKu5C,aAAahqC,MAAKC,GAAWA,EAAQgrC,UAAYA,IACpE,GAAIE,EACJ,CACE,GAAIA,EAAMC,YACV,CACE,MAAMC,EAAa,IAAIzB,GAAUoB,EAAQG,EAAMC,YAAaD,EAAMG,aAClE76C,KAAKw5C,OAAOhyC,KAAKozC,GAEnBL,GAAUG,EAAMI,SAIpB,MAAMC,EAAO,IAAInC,EACXoC,EAAch7C,KAAKw5C,OAAO,GAChCuB,EAAKhzB,qBAAqBizB,EAAYx2B,SAASrf,QAAQ0D,IAAI,IAAIkL,EAAQinC,EAAY55B,MAAMlZ,EAAI,EAAG8yC,EAAY55B,MAAMjZ,EAAI,IAAK6yC,EAAY55B,OAEvI,IAAK,IAAI9Z,EAAI,EAAGA,EAAItH,KAAKw5C,OAAO1zC,OAAQwB,IACxC,CACE,MAAMP,EAAI/G,KAAKw5C,OAAOlyC,GAChBugB,GAAM,IAAI+wB,GAAO7wB,qBAAqBhhB,EAAEyd,SAASrf,QAAQ0D,IAAI,IAAIkL,EAAQhN,EAAEqa,MAAMlZ,EAAI,EAAGnB,EAAEqa,MAAMjZ,EAAI,IAAKpB,EAAEqa,OACjH25B,EAAKE,MAAMpzB,GAGb,MAAMqzB,EAAY,IAAInnC,EACtBgnC,EAAK3vB,QAAQ8vB,GACb,IAAK,IAAI5zC,EAAI,EAAGA,EAAItH,KAAKw5C,OAAO1zC,OAAQwB,IAEtCtH,KAAKw5C,OAAOlyC,GAAGkd,SAAStc,GAAKgzC,EAAUhzC,EAAI,EAC3ClI,KAAKw5C,OAAOlyC,GAAGkd,SAASrc,GAAK+yC,EAAU/yC,EAAI,EAE3CnI,KAAKw5C,OAAOlyC,GAAGkd,SAAStc,GAAMgzC,EAAUhzC,EAAI,EAAKlI,KAAKm4C,YAAYjwC,EAClElI,KAAKw5C,OAAOlyC,GAAGkd,SAASrc,GAAM+yC,EAAU/yC,EAAI,EAAKnI,KAAKm4C,YAAYhwC,EAGpEnI,KAAKy5C,gBAAiB,GC/I1B,MAAM0B,WAAwBvhC,GAE5B7Z,YAAYkrB,GAEVle,i6CAAkB,CAChBquC,SAAU,CAAEx1C,MAAOqlB,GACnBowB,UAAW,CAAEz1C,MAAO,IACpB01C,WAAY,CAAE11C,MAAO,IAAImO,EAAQ,EAAG,MAGtC/T,KAAK4nB,aAAc,EACnB5nB,KAAKstB,WAAa,CAChB0lB,aAAa,GAEfhzC,KAAK8a,YAAa,EAClB9a,KAAK2f,KAAOo1B,EACZ9pB,EAAQqG,UAAYkV,EACpBvb,EAAQsG,UAAYiV,EACpBvb,EAAQjM,iBAAkB,EAG5Bjf,eAAemD,GAEblD,KAAKga,SAASshC,WAAW11C,MAAMkgB,KAAK5iB,GAGtCnD,aAAa6F,GAEX5F,KAAKga,SAASqhC,UAAUz1C,MAAQK,GAAM6B,KAAK,GAAK,GAAKlC,ICtBzD,MAAM21C,WAAqBt4B,EAEzBljB,YAAYy7C,EAAaC,GAEvB,MAEMC,EAAqB,IAAIC,EAC/BD,EAAmBE,cAAgB,EAEnC,MAAMh5B,EAAW,IAAI4E,EAAc,EAAG,GACtC5E,EAASgB,UAAU,GAAK,GAAK,GAC7B83B,EAAmB59B,aAAa,WAAa,IAAI+9B,EAAuBj5B,EAAS5U,aAAa,YAAYs9B,MAAO,IACjHoQ,EAAmB59B,aAAa,KAAa,IAAI+9B,EAAuBj5B,EAAS5U,aAAa,MAAMs9B,MAAO,IAC3GoQ,EAAmBpkB,MAAQ1U,EAAS0U,MAEpC,MAAMwkB,EAAiB,IAAIC,EAAyB,IAAI9pB,aAAa+pB,KAAsB,GAAG,GACxFC,EAAiB,IAAIF,EAAyB,IAAI9pB,aAAa+pB,KAAsB,GAAG,GACxFE,EAAiB,IAAIH,EAAyB,IAAI9pB,aAAa+pB,KAAsB,GAAG,GACxFG,EAAiB,IAAIJ,EAAyB,IAAI9pB,aAAa+pB,KAAsB,GAAG,GAExFI,EAAe,IAAIL,EAAyB,IAAI9pB,aAAa+pB,KAAsB,GAAG,GACtF5C,EAAe,IAAI2C,EAAyB,IAAI9pB,aAAa+pB,KAAsB,GAAG,GAEtFx6B,EAAQ,IAAIu6B,EAAyB,IAAI9pB,aAAa+pB,KAAsB,GAAG,GAErFF,EAAeO,MAASC,EACxBL,EAAeI,MAASC,EACxBJ,EAAeG,MAASC,EACxBH,EAAeE,MAASC,EACxBF,EAAaC,MAAWC,EACxBlD,EAAaiD,MAAWC,EACxB96B,EAAM66B,MAAkBC,EAExBZ,EAAmB59B,aAAa,iBAAkBg+B,GAClDJ,EAAmB59B,aAAa,iBAAkBm+B,GAClDP,EAAmB59B,aAAa,iBAAkBo+B,GAClDR,EAAmB59B,aAAa,iBAAkBq+B,GAElDT,EAAmB59B,aAAa,eAAgBs+B,GAChDV,EAAmB59B,aAAa,eAAgBs7B,GAChDsC,EAAmB59B,aAAa,QAAgB0D,GAEhDzU,MAAM2uC,EAAoB,IAAIP,GAAgBM,IAE9Cz7C,KAAKu8C,cAAgB,GACrBv8C,KAAKw7C,YAAcA,EAEnBx7C,KAAK8iB,SAAS05B,eAAe,IAAIzoC,EAAQynC,EAAYiB,MAAMp+B,MAAOm9B,EAAYiB,MAAMv9B,SAEpFlf,KAAKinB,eAAgB,EAGvBlnB,aAAa6F,GAEX5F,KAAK8iB,SAAS45B,aAAa92C,GAG7B7F,SAAS48C,GAEP,MAAMvjB,EAAO,IAAIkgB,GAAQt5C,KAAKw7C,YAAYhC,OAAQmD,GAElD,OADA38C,KAAKu8C,cAAc/0C,KAAK4xB,GACjBA,EAGTr5B,YAAY68C,GAEVzR,GAAe0R,YAAY78C,KAAKu8C,cAAeK,GAC/C58C,KAAK6V,QAAO,GAGd9V,OAAO+8C,GAEL,MAAMC,EAAmB/8C,KAAK4iB,SAAS5U,aAAa,gBAC9CgvC,EAAmBh9C,KAAK4iB,SAAS5U,aAAa,gBAE9C8tC,EAAiB97C,KAAK4iB,SAAS5U,aAAa,kBAC5CiuC,EAAiBj8C,KAAK4iB,SAAS5U,aAAa,kBAC5CkuC,EAAiBl8C,KAAK4iB,SAAS5U,aAAa,kBAC5CmuC,EAAiBn8C,KAAK4iB,SAAS5U,aAAa,kBAE5CivC,EAAYj9C,KAAK4iB,SAAS5U,aAAa,SAE7C,IAAIkvC,GAAuC,IAAjBJ,EACtBK,GAAuC,IAAjBL,EACtBM,GAAuC,IAAjBN,EAEtBO,EAAc,EAClB,IAAK,IAAI/1C,EAAI,EAAGA,EAAItH,KAAKu8C,cAAcz2C,OAAQwB,IAC/C,CACE,MAAM2W,EAAOje,KAAKu8C,cAAcj1C,GAE5B2W,EAAKy7B,kBAEPwD,GAAsB,EACtBj/B,EAAKq/B,iBAGHr/B,EAAKw7B,iBAEP0D,GAAqB,EACrBl/B,EAAKs/B,qBAGHt/B,EAAK07B,iBAEPyD,GAAqB,EACrBn/B,EAAKu/B,qBAGP,MAAM5D,EAAS37B,EAAK27B,OACdp4B,EAAQvD,EAAKuD,MACbhI,EAAUyE,EAAKzE,QAErB,IAAK,IAAIikC,EAAU,EAAGA,EAAUx/B,EAAKu7B,OAAO1zC,OAAQ23C,IACpD,CACE,MAAM/C,EAAQz8B,EAAKu7B,OAAOiE,GAEpBC,EAAWL,EAEjBN,EAAiBY,QAAQD,EAAUhD,EAAMrB,aAAanxC,EAAGwyC,EAAMrB,aAAalxC,EAAGuyC,EAAMrB,aAAa1wC,EAAG+xC,EAAMrB,aAAa3wC,GACxHs0C,EAAiBW,QAAQD,EAAUhD,EAAMl2B,SAAStc,EAAGwyC,EAAMl2B,SAASrc,EAAGuyC,EAAMt5B,MAAMlZ,EAAGwyC,EAAMt5B,MAAMjZ,GAElG2zC,EAAe6B,QAAQD,EAAU9D,EAAO/xC,SAAS,GAC/C+xC,EAAO/xC,SAAS,GAChB+xC,EAAO/xC,SAAS,GAChB+xC,EAAO/xC,SAAS,IAElBo0C,EAAe0B,QAAQD,EAAU9D,EAAO/xC,SAAS,GAC/C+xC,EAAO/xC,SAAS,GAChB+xC,EAAO/xC,SAAS,GAChB+xC,EAAO/xC,SAAS,IAElBq0C,EAAeyB,QAAQD,EAAU9D,EAAO/xC,SAAS,GAC/C+xC,EAAO/xC,SAAS,GAChB+xC,EAAO/xC,SAAS,IAChB+xC,EAAO/xC,SAAS,KAElBs0C,EAAewB,QAAQD,EAAU9D,EAAO/xC,SAAS,IAC/C+xC,EAAO/xC,SAAS,IAChB+xC,EAAO/xC,SAAS,IAChB+xC,EAAO/xC,SAAS,KAElBo1C,EAAUU,QAAQD,EAAUl8B,EAAM7a,EAAG6a,EAAMza,EAAGya,EAAMxa,EAAGwS,GAEvD6jC,KAIJr9C,KAAK4iB,SAASg5B,cAAgByB,EAE1BA,EAAcr9C,KAAKg8C,iBAErBr4C,QAAQG,MAAM,iEAAkE9D,KAAKg8C,gBAAiBqB,EAAar9C,MAGjHk9C,IAEFpB,EAAe78B,aAAc,EAC7Bg9B,EAAeh9B,aAAc,EAC7Bi9B,EAAej9B,aAAc,EAC7Bk9B,EAAel9B,aAAc,GAE3Bk+B,IAEFJ,EAAiB99B,aAAc,EAC/B+9B,EAAiB/9B,aAAc,GAE7Bm+B,IAEFH,EAAUh+B,aAAc,GAI5Blf,UAEEC,KAAK4iB,SAASC,UACd7iB,KAAK8iB,SAASD,WC5LlB,MAAM+6B,WAA2B/wC,GAE/B9M,YAAY8K,EAAgBpD,EAAO,EAAGC,EAAK,EAAGwD,EAAkB,UAE9D6B,MAAM7B,GAENlL,KAAK6K,eAAiBA,EACtB7K,KAAKyH,KAAOA,EACZzH,KAAK0H,GAAKA,EAGZ3H,OAAOsJ,EAASzB,GAEd,MAAMi2C,EAAM79C,KAAKyH,KAAKtC,QACtB04C,EAAI/1C,KAAK9H,KAAK0H,GAAI1H,KAAKkL,gBAAgBtD,IACvCyB,EAAQrJ,KAAK6K,gBAAgBib,KAAK+3B,ICXtC,MAAMC,WAA6BvjC,GAEjCxa,cAEEgN,i1GAAY/I,EAAW,CACrB+5C,WAAW,IAGb/9C,KAAKga,SAASgkC,WAAa,CAAEp4C,WAAO5B,GACpChE,KAAKga,SAASikC,eAAiB,CAAEr4C,MAAO,IAAImO,EAAQ,EAAG,IAGzDhU,YAAYwb,GAEVvb,KAAKga,SAASgkC,WAAWp4C,MAAQ2V,EAEjC,MAAMrY,EAAOlD,KAAKu4C,SAASh9B,GAC3Bvb,KAAKga,SAASikC,eAAer4C,MAAMkgB,KAAK5iB,GAG1CnD,SAASwb,GAEP,OAAIA,EAAI2iC,eAEC,IAAInqC,EAAQnN,KAAKL,IAAI,EAAGgV,EAAI9I,MAAM0rC,YAAav3C,KAAKL,IAAI,EAAGgV,EAAI9I,MAAM2rC,cAE1E7iC,EAAIyP,oBAEC,IAAIjX,EAAQwH,EAAI8C,MAAO9C,EAAI2D,QAEhC3D,EAAI8iC,UAEC,IAAItqC,EAAQwH,EAAI9I,MAAM4L,MAAO9C,EAAI9I,MAAMyM,QAEzC,IAAInL,EAAQ,EAAG,ICnC1B,MAAMuqC,GAEJv+C,YAAY4Z,GAEV3Z,KAAKymB,GAAK,IAAIuD,EAAkB,EAAG,EAAG,CACpC4H,KAAMC,EACNL,OAAQC,EACRH,UAAWvS,EACXwS,UAAWxS,IAEb/e,KAAK6jC,IAAM,IAAI7Z,EAAkB,EAAG,EAAG,CACrC4H,KAAMC,EACNL,OAAQC,EACRH,UAAWvS,EACXwS,UAAWxS,IAGb/e,KAAKu+C,kBAAoB,IAAIT,GAG/B/9C,OAAOkrB,GAEL,MAAMuzB,EAAWx+C,KAAKu4C,SAASttB,GAC3BuzB,EAASt2C,IAAMlI,KAAKymB,GAAGpI,OAASmgC,EAASr2C,IAAMnI,KAAKymB,GAAGvH,SAEzDlf,KAAKymB,GAAG6D,QAAQk0B,EAASt2C,EAAGs2C,EAASr2C,GACrCnI,KAAK6jC,IAAIvZ,QAAQk0B,EAASt2C,EAAGs2C,EAASr2C,IAGxCnI,KAAKu+C,kBAAkBp1B,YAAY8B,GACnCmH,GAAS9C,cAActvB,KAAKu+C,kBAAmBv+C,KAAKymB,IAEpD,IAAK,IAAInf,EAAI,EAAGA,EAAI,EAAGA,IAErBtH,KAAKu+C,kBAAkBp1B,YAAYnpB,KAAKymB,GAAGwE,SAC3CmH,GAAS9C,cAActvB,KAAKu+C,kBAAmBv+C,KAAK6jC,KAEpD7jC,KAAKu+C,kBAAkBp1B,YAAYnpB,KAAK6jC,IAAI5Y,SAC5CmH,GAAS9C,cAActvB,KAAKu+C,kBAAmBv+C,KAAKymB,IAGtD,OAAOzmB,KAAKymB,GAGd1mB,SAASwb,GAEP,OAAIA,EAAI2iC,eAEC,IAAInqC,EAAQnN,KAAKL,IAAI,EAAGgV,EAAI9I,MAAM0rC,YAAav3C,KAAKL,IAAI,EAAGgV,EAAI9I,MAAM2rC,cAE1E7iC,EAAIyP,oBAEC,IAAIjX,EAAQwH,EAAI8C,MAAO9C,EAAI2D,QAEhC3D,EAAI8iC,UAEC,IAAItqC,EAAQwH,EAAI9I,MAAM4L,MAAO9C,EAAI9I,MAAMyM,QAEzC,IAAInL,EAAQ,EAAG,IC1D1B,MAAM0qC,WAAkClkC,GAEtCxa,YAAY2+C,GAEV3xC,MAAM2xC,ytCCLV,MAAMC,WAA4BpkC,GAEhCxa,YAAY6+C,EAAgBF,GAE1B3xC,sLAGFkc,WAAWrjB,GAET5F,KAAKga,SAAS6kC,QAAQj5C,MAAQA,EAGhCqjB,aAEE,OAAOjpB,KAAKga,SAAS6kC,QAAQj5C,OCdjC,MAAMk5C,GAEJ/+C,YAAY6+C,GAEV5+C,KAAKimC,cAAiB,EACtBjmC,KAAKkmC,eAAiB,EACtBlmC,KAAK++C,IAAM,IAAI/0B,EAAkB,EAAG,GACpChqB,KAAK6jC,IAAM,IAAI7Z,EAAkB,EAAG,GACpChqB,KAAK8jC,IAAM,IAAI9Z,EAAkB,EAAG,GACpChqB,KAAKg/C,IAAM,IAAIh1B,EAAkB,EAAG,GACpChqB,KAAKi/C,IAAM,IAAIj1B,EAAkB,EAAG,GAEpChqB,KAAKk/C,iBAAqB,IAAIT,IAA0B,GACxDz+C,KAAKm/C,mBAAqB,IAAIV,IAA0B,GAExDz+C,KAAKo/C,iBAAmB,IAAIT,GAG9B5+C,KAAK0mB,GAEHzmB,KAAKq/C,gBAAgB54B,EAAGpI,MAAOoI,EAAGvH,QAClCkT,GAAS3C,KAAKhJ,EAAUzmB,KAAK6jC,IAAK7jC,KAAKo/C,kBAGvChtB,GAAS3C,KAAKzvB,KAAK6jC,IAAK7jC,KAAK8jC,IAAK9jC,KAAKm/C,oBACvC/sB,GAAS3C,KAAKzvB,KAAK8jC,IAAK9jC,KAAKg/C,IAAKh/C,KAAKm/C,oBACvC/sB,GAAS3C,KAAKzvB,KAAKg/C,IAAKh/C,KAAKi/C,IAAKj/C,KAAKm/C,oBAIvC/sB,GAAS3C,KAAKzvB,KAAKi/C,IAAKj/C,KAAKg/C,IAAKh/C,KAAKk/C,kBACvC9sB,GAAS3C,KAAKzvB,KAAKg/C,IAAKh/C,KAAK8jC,IAAK9jC,KAAKk/C,kBACvC9sB,GAAS3C,KAAKzvB,KAAK8jC,IAAKrd,EAAIzmB,KAAKk/C,kBAMnCn/C,gBAAgBse,EAAOa,GAEjBlf,KAAKimC,gBAAkB5nB,GAASre,KAAKkmC,iBAAmBhnB,IAE1Dlf,KAAKimC,cAAgB5nB,EACrBre,KAAKkmC,eAAiBhnB,EACtBlf,KAAK++C,IAAIz0B,QAAQtqB,KAAKimC,cAAgB,EAAGjmC,KAAKkmC,eAAiB,GAC/DlmC,KAAK6jC,IAAIvZ,QAAQtqB,KAAKimC,cAAgB,EAAGjmC,KAAKkmC,eAAiB,GAC/DlmC,KAAK8jC,IAAIxZ,QAAQtqB,KAAKimC,cAAgB,EAAGjmC,KAAKkmC,eAAiB,GAC/DlmC,KAAKg/C,IAAI10B,QAAQtqB,KAAKimC,cAAgB,EAAGjmC,KAAKkmC,eAAiB,GAC/DlmC,KAAKi/C,IAAI30B,QAAQtqB,KAAKimC,cAAgB,GAAIjmC,KAAKkmC,eAAiB,MC1CtE,MAAMoZ,GAEJv/C,YAAYw/C,EAAWC,GAErBx/C,KAAK6F,UAAO7B,EACZhE,KAAKy/C,WAAQz7C,EAEbhE,KAAKgB,KAAOu+C,EAEZv/C,KAAKw/C,gBAAkBA,EAGzBz/C,mBAAmB6iB,IAKnB7iB,oBAAoB2/C,IAKpB3/C,SAAS4/C,GAEP,MAAMC,EAAaN,GAAkBO,qBAAqBF,GACpD32B,EAAU,CACdsI,UAAWvS,EACXwS,UAAWxS,EACXyS,OAAQC,EACRC,SAAUC,EACVC,KAAMpE,GAAaxQ,sBAAwB6U,EAAYiuB,GACvDhuB,eAAe,EACfC,aAAa,GAGf,OAAO,IAAI/H,EAAkB41B,EAAWvhC,MAAOuhC,EAAW1gC,OAAQ8J,GAGpEjpB,4BAA4B4/C,GAE1B,MAAMthC,EAAQzX,KAAKN,IAAIq5C,EAAgB,KAEvC,MAAO,CAAEthC,MAAAA,EAAOa,OADDtY,KAAKL,IAAI,EAAGK,KAAKuX,KAAKwhC,EAAiBthC,KAIxDte,UAEE,MAAM89C,EAAM79C,KAAK6F,KACjB7F,KAAK6F,KAAO7F,KAAKy/C,MACjBz/C,KAAKy/C,MAAQ5B,EAGf99C,OAAOggD,GAED//C,KAAKw/C,kBAEPx/C,KAAKw/C,gBAAgB3pC,SACrBkqC,EAAwBh9B,SAAS,GAAGD,SAAW9iB,KAAKw/C,gBACpDx/C,KAAKw/C,gBAAgBxlC,SAASW,SAAS/U,MAAQ5F,KAAK6F,KAAKolB,QACzDmH,GAAS9I,OAAOy2B,OAAyB/7C,EAAWhE,KAAKy/C,OACzDM,EAAwBh9B,SAAS,GAAGD,cAAW9e,EAE/ChE,KAAKggD,WAITjgD,+BAA+B8xC,EAAWprB,EAAIw5B,EAAkBF,GAE9DA,EAAwBh9B,SAAS,GAAGH,SAAS9E,aAAa,OAAQ+zB,GAClEkO,EAAwBh9B,SAAS,GAAGD,SAAWm9B,EAE/C7tB,GAAS9I,OAAOy2B,OAAyB/7C,EAAWyiB,GAEpDs5B,EAAwBh9B,SAAS,GAAGH,SAASs9B,gBAAgB,QAC7DH,EAAwBh9B,SAAS,GAAGD,cAAW9e,EAGjDjE,cAEE,OAAOC,KAAK6F,KAAKolB,SC9ErB,MAAMk1B,WAA0Bh/B,EAE9BphB,YAAY4/C,EAAgB78B,GAE1B/V,QACA/M,KAAK4xC,WAAa,GAElB5xC,KAAKkpB,KAAOlpB,KAAKogD,iBAAiBT,EAAgB78B,GAClD9iB,KAAK6I,IAAI7I,KAAKkpB,MAEdlpB,KAAKqgD,uBAAyBrgD,KAAKsgD,6BAA6BX,GAChE3/C,KAAK+/C,wBAA0B,IAAIv9B,EACnCxiB,KAAK+/C,wBAAwBl3C,IAAI7I,KAAKqgD,wBAGxCtgD,sBAAsBy4B,GAEpBx4B,KAAK4xC,WAAWpqC,KAAKgxB,GAGvBz4B,2BAA2BiB,EAAMsqC,EAAOiV,GAEtCvgD,KAAKqgD,uBAAuBz9B,SAAS9E,aAAa9c,EAAM,IAAIy3B,EAAgB6S,EAAOiV,GAAW,IAGhGxgD,oBAAoBiB,EAAMsqC,EAAOiV,GAE/BvgD,KAAKkpB,KAAKtG,SAAS9E,aAAa9c,EAAM,IAAI+6C,EAAyBzQ,EAAOiV,GAAW,IAGvFxgD,SAEEC,KAAKkpB,KAAKpG,SAASjN,SACnB,IAAK,IAAIvO,EAAI,EAAGA,EAAItH,KAAK4xC,WAAW9rC,OAAQwB,IAE1CtH,KAAK4xC,WAAWtqC,GAAGuO,OAAO7V,KAAK+/C,yBAInChgD,UAEEC,KAAKkpB,KAAKtG,SAASC,UACnB7iB,KAAKkpB,KAAKpG,SAASD,UAGrB9iB,iBAAiBygD,EAAiB,EAAG19B,GAEnC,MAAM29B,EAAM,IAAIj5B,EAEVk5B,EAAgB,IAAI/E,EAC1B+E,EAAc5iC,aAAa,WAAY2iC,EAAIzyC,aAAa,aACxD0yC,EAAcppB,MAAQmpB,EAAInpB,MAE1BopB,EAAc5iC,aAAa,aAAc9d,KAAK2gD,2BAA2BH,IACzEE,EAAc9E,cAAgB4E,EAC9B,MAAMt3B,EAAO,IAAIjG,EAAKy9B,EAAe59B,GAErC,OADAoG,EAAKjC,eAAgB,EACdiC,EAGTnpB,6BAA6B4/C,GAE3B,MAAMthC,MAAEA,EAAKa,OAAEA,GAAWogC,GAAkBO,qBAAqBF,GAE3DhnB,EAAM,IAAI1G,aAA8B,EAAjB0tB,GAE7B,IAAK,IAAIr4C,EAAI,EAAGA,EAAIq4C,EAAgBr4C,IACpC,CACE,MAAMY,EAAIZ,EAAI+W,EACRlW,EAAIvB,KAAKqC,MAAM3B,EAAI+W,GACzBsa,EAAQ,EAAJrxB,EAAQ,IAAMY,EAAI,IAAOmW,EAC7Bsa,EAAQ,EAAJrxB,EAAQ,IAAMa,EAAI,IAAO+W,EAC7ByZ,EAAQ,EAAJrxB,EAAQ,GAAKA,EAEnB,MAAMm5C,EAAM,IAAI/+B,EAChB++B,EAAI3iC,aAAa,WAAY,IAAI2a,EAAgBE,EAAK,GAAG,IAEzD,MAAM1xB,EAAS,IAAI25C,GAAOH,GAE1B,OADAx5C,EAAOggB,eAAgB,EAChBhgB,EAGTlH,2BAA2B4/C,GAEzB,MAAMthC,MAAEA,EAAKa,OAAEA,GAAWogC,GAAkBO,qBAAqBF,GAE3DhnB,EAAM,IAAI1G,aAA8B,EAAjB0tB,GAE7B,IAAK,IAAIr4C,EAAI,EAAGA,EAAIq4C,EAAgBr4C,IACpC,CACE,MAAMY,EAAIZ,EAAI+W,EACRlW,EAAIvB,KAAKqC,MAAM3B,EAAI+W,GACzBsa,EAAQ,EAAJrxB,EAAQ,IAAMY,EAAI,IAAOmW,EAC7Bsa,EAAQ,EAAJrxB,EAAQ,IAAMa,EAAI,IAAO+W,EAE/B,OAAO,IAAI68B,EAAyBpjB,EAAK,GAAG,ICpGhD,MAAMkoB,WAAgChnC,EAEpC9Z,cAcEgN,MAAM,CACJiN,SAAU,GAGVC,aAhBW,kOAiBXE,wFACAW,YAAY,EACZC,SAAUC,EACVC,WAAW,EACXC,UAAWC,KC1BjB,MAAM2lC,WAAkCxB,GAEtCv/C,YAAYy/C,GAEVzyC,MAAM,YAAayyC,GAGrBz/C,eAAe6iB,EAAUm9B,GAEvB,MAAMgB,EAAWn+B,EAAS5U,aAAa,YACvChO,KAAK6F,KAAU7F,KAAKghD,SAASD,EAASxoB,OACtCv4B,KAAKy/C,MAAUz/C,KAAKghD,SAASD,EAASxoB,OAEtC,MAAMjN,EAAM,IAAIu1B,GAChB7gD,KAAKihD,+BAA+Br+B,EAAS5U,aAAa,YAAahO,KAAK6F,KAAMylB,EAAKy0B,GAGzFhgD,gBAAgBqsC,EAAW2T,GAEzB//C,KAAK6F,KAAU7F,KAAKghD,SAAS5U,EAAUtmC,QACvC9F,KAAKy/C,MAAUz/C,KAAKghD,SAAS5U,EAAUtmC,QAEvC,MAAMiD,EAAM,IAAIkpB,aAAgC,EAAnBma,EAAUtmC,QAEvC,IAAK,IAAIwB,EAAI,EAAGA,EAAI8kC,EAAUtmC,OAAQwB,IAEpCyB,EAAQ,EAAJzB,EAAQ,GAAK8kC,EAAU9kC,GAAGY,EAC9Ba,EAAQ,EAAJzB,EAAQ,GAAK8kC,EAAU9kC,GAAGa,EAC9BY,EAAQ,EAAJzB,EAAQ,GAAK8kC,EAAU9kC,GAAGqB,EAC9BI,EAAQ,EAAJzB,EAAQ,GAA+B,IAAT,EAAhBV,KAAKsC,SAAe,GAExC,MAAMoiB,EAAM,IAAIu1B,GAChB7gD,KAAKihD,+BAA+B,IAAIxoB,EAAgB1vB,EAAK,GAAI/I,KAAK6F,KAAMylB,EAAKy0B,ICnCrF,MAAMmB,WAA0BxpB,EAE9B33B,YAAYiG,EAAMqY,EAAOa,EAAQsS,EAAQI,GAEvC7kB,MAAM/G,EAAMqY,EAAOa,EAAQsS,EAAQI,GACnC5xB,KAAKmhD,WAAa,EAGpBphD,SAASu3B,EAAO3wB,EAAGI,EAAGC,EAAG6H,GAEvB7O,KAAKgG,KAAa,EAARsxB,EAAY,GAAK3wB,EAAI3G,KAAKmhD,WACpCnhD,KAAKgG,KAAa,EAARsxB,EAAY,GAAKvwB,EAAI/G,KAAKmhD,WACpCnhD,KAAKgG,KAAa,EAARsxB,EAAY,GAAKtwB,EAAIhH,KAAKmhD,WACpCnhD,KAAKgG,KAAa,EAARsxB,EAAY,GAAKzoB,EAAI7O,KAAKmhD,WACpCnhD,KAAKif,aAAc,EAGrBlf,QAAQu3B,EAAO3wB,EAAGI,EAAGC,GAEnBhH,KAAKgG,KAAa,EAARsxB,EAAY,GAAK3wB,EAAI3G,KAAKmhD,WACpCnhD,KAAKgG,KAAa,EAARsxB,EAAY,GAAKvwB,EAAI/G,KAAKmhD,WACpCnhD,KAAKgG,KAAa,EAARsxB,EAAY,GAAKtwB,EAAIhH,KAAKmhD,WACpCnhD,KAAKif,aAAc,EAGrBlf,MAAMu3B,EAAO1xB,GAEX5F,KAAKgG,KAAa,EAARsxB,EAAY,GAAK1xB,EAAQ5F,KAAKmhD,WACxCnhD,KAAKif,aAAc,EAGrBlf,MAAMu3B,EAAO1xB,GAEX5F,KAAKgG,KAAa,EAARsxB,EAAY,GAAK1xB,EAAQ5F,KAAKmhD,WACxCnhD,KAAKif,aAAc,EAGrBlf,MAAMu3B,EAAO1xB,GAEX5F,KAAKgG,KAAa,EAARsxB,EAAY,GAAK1xB,EAAQ5F,KAAKmhD,WACxCnhD,KAAKif,aAAc,EAGrBlf,MAAMu3B,EAAO1xB,GAEX5F,KAAKgG,KAAa,EAARsxB,EAAY,GAAK1xB,EAAQ5F,KAAKmhD,WACxCnhD,KAAKif,aAAc,GC7CvB,MAAMmiC,WAAuBF,GAE3BnhD,YAAYse,EAAOa,GAGjBnS,MADa,IAAI0qB,WAAWpZ,EAAQa,EAAS,GACjCb,EAAOa,EAAQyY,GAC3B33B,KAAKmhD,WAAa,KCNtB,MAAME,WAAwBH,GAE5BnhD,YAAYse,EAAOa,GAGjBnS,MADa,IAAI0qB,WAAWpZ,EAAQa,EAAS,GACjCb,EAAOa,EAAQuS,GAC3BzxB,KAAKmhD,WAAa,KCLtB,MAAMG,WAA4BJ,GAEhCnhD,YAAYse,EAAOa,GAGjBnS,MADa,IAAIklB,aAAa5T,EAAQa,EAAS,GACnCb,EAAOa,EAAQyY,EAAW9F,ICL1C,MAAM0vB,WAA6BL,GAEjCnhD,YAAYse,EAAOa,GAGjBnS,MADa,IAAIklB,aAAa5T,EAAQa,EAAS,GACnCb,EAAOa,EAAQuS,EAAYI,ICH3C,MAAM2vB,WAAoBv+B,EAExBljB,YAAY0hD,EAAU7+B,EAAUE,EAAU4+B,GAExC30C,MAAM6V,EAAUE,GAEhB9iB,KAAKyhD,SAAWA,EAChBzhD,KAAK2hD,cAAgB13C,OAAOC,KAAKu3C,GAAU37C,OAC3C9F,KAAK0hD,kBAAoBA,EACzB1hD,KAAK60B,YAAc70B,KAAK2hD,cAAgBD,EACxC1hD,KAAK4hD,aAAeh7C,KAAKuX,KAAKne,KAAK2hD,cAAgBD,GAGrD3hD,mBAAmBq1B,GAEjBp1B,KAAK8iB,SAAS9I,SAASob,GAAcxvB,MAAQ,IAAIw7C,GAAephD,KAAK60B,YAAa70B,KAAK4hD,cAGzF7hD,oBAAoBq1B,GAElBp1B,KAAK8iB,SAAS9I,SAASob,GAAcxvB,MAAQ,IAAIy7C,GAAgBrhD,KAAK60B,YAAa70B,KAAK4hD,cAG1F7hD,yBAAyBq1B,GAEvBp1B,KAAK8iB,SAAS9I,SAASob,GAAcxvB,MAAQ,IAAI07C,GAAoBthD,KAAK60B,YAAa70B,KAAK4hD,cAG9F7hD,0BAA0Bq1B,GAExBp1B,KAAK8iB,SAAS9I,SAASob,GAAcxvB,MAAQ,IAAI27C,GAAqBvhD,KAAK60B,YAAa70B,KAAK4hD,cAG/F7hD,eAAeiB,GAEb,OAAOhB,KAAKyhD,SAASzgD,GAGvBjB,cAAcq1B,EAAcysB,EAAWl7C,EAAGI,EAAGC,GAE3ChH,KAAK8iB,SAAS9I,SAASob,GAAc0sB,QAAQ9hD,KAAK+hD,eAAeF,GAAYl7C,EAAGI,EAAGC,GAGrFjH,eAAeq1B,EAAcysB,EAAWl7C,EAAGI,EAAGC,EAAG6H,GAE/C7O,KAAK8iB,SAAS9I,SAASob,GAAc4sB,SAAShiD,KAAK+hD,eAAeF,GAAYl7C,EAAGI,EAAGC,EAAG6H,IC7C3F,MAAMozC,GAEJliD,MAAMmiD,EAAQp/B,GAEZ,MAMMgtB,EAAa,GACb2R,EAAW,GAEXU,EAAe,GAErB,IAAK,IAAI76C,EAAI,EAAGA,EAAI46C,EAAOp8C,OAAQwB,IACnC,CACE,MAAM4hB,EAAOg5B,EAAO56C,GACdgxB,EAAepP,EAAKtG,SAAS5U,aAAa,YAAYuqB,MAE5D,IAAK,IAAIA,EAAQ,EAAGA,EAAQD,EAAcC,IAExC4pB,EAAa36C,KAAKF,GAGpBwoC,EAAWtoC,KAAK0hB,EAAKtG,eAEO5e,IAAxBy9C,EAASv4B,EAAKloB,MAEhBygD,EAASv4B,EAAKloB,MAAQsG,EAItB3D,QAAQG,MAAM,4EAA6EolB,EAAKloB,KAAMygD,GAI1G,MAAMz9B,EAAkBC,GAAoBC,sBAAsB4rB,GAE5DtX,EAAmB,IAAIC,EAAgB,IAAIxG,aAAakwB,GAAe,GAG7E,OAFAn+B,EAAgBlG,aAAa,UAAW0a,GAEjCx4B,KAAKoiD,oBAAoBX,EAAUz9B,EAAiBlB,EAtCjC,MAyC5B/iB,oBAAoB0hD,EAAUz9B,EAAiBlB,EAAU4+B,GAEvD,OAAO,IAAIF,GAAYC,EAAUz9B,EAAiBlB,EAAU4+B,IClDhE,MAAMW,GAEJtiD,YAAY6uB,EAAQ0zB,GAAO,EAAMC,EAAS,EAAGC,GAAa,GAExDxiD,KAAK4uB,OAASA,EACd5uB,KAAKsiD,KAAOA,EACZtiD,KAAKuiD,OAASA,EACdviD,KAAKwiD,WAAaA,EAElBxiD,KAAKyiD,WAAQz+C,EAGfjE,KAAK2iD,GAEC1iD,KAAKwiD,WAEPxiD,KAAKyiD,MAAQ,IAAIE,GAAiBD,GAIlC1iD,KAAKyiD,MAAQ,IAAIG,GAAOF,GAG1B1iD,KAAKyiD,MAAMI,UAAU7iD,KAAK4uB,QAC1B5uB,KAAKyiD,MAAMK,QAAQ9iD,KAAKsiD,MAGxBtiD,KAAKyiD,MAAMM,KAAKA,KAAKn9C,MAAQ,EAE7B5F,KAAKyiD,MAAMO,UAAUhjD,KAAKsiD,KAAO,EAAItiD,KAAKuiD,QAG5CxiD,OAEEC,KAAKyiD,MAAM7sC,OAGb7V,QAEEC,KAAKyiD,MAAMQ,QAGbljD,OAEEC,KAAKyiD,MAAM3Y,OAGboZ,iBAEE,OAAOljD,KAAKyiD,MAAMU,WC/CtB,MAAMC,WAAoBrgD,GAExBhD,YAAYiD,EAAaC,EAAKq/C,GAAO,EAAMC,EAAS,EAAGr/C,EAAMs/C,GAAa,GAExEz1C,MAAM/J,EAAaC,EAAKC,GACxBlD,KAAKsiD,KAAOA,EACZtiD,KAAKuiD,OAASA,EACdviD,KAAKwiD,WAAaA,EAGpBziD,sBAAsBgE,QAQkCC,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAE3CjD,KAAKqjD,kBAAkBt/C,IAIvBA,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,mBAKTjF,kBAAkBgE,GAEhB,MAAMsF,EAAUi6C,GAAa/lC,aAEvBqR,EAASvlB,EAAQk6C,aAAa,EAAG,MAAO,OAE9Cn/C,MAAMpE,KAAKiD,KAAKwB,MAAKkC,GAAKA,EAAEgqB,SAAQlsB,MAAMQ,IAEpCA,EAASu+C,YAEXv+C,EAASu+C,cAAc/+C,MAAMg/C,IAE3Bp6C,EAAQq6C,gBAAgBD,GAAeE,IAErC5/C,EAAmBe,aACjB9E,KAAKgD,YACLhD,KAAKiD,IACL,IAAIo/C,GAAUsB,EAAc3jD,KAAKsiD,KAAMtiD,KAAKuiD,OAAQviD,KAAKwiD,aAG3DxiD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,yBAMTjB,EAAmBe,aACjB9E,KAAKgD,YACLhD,KAAKiD,IACL,IAAIo/C,GAAUzzB,EAAQ5uB,KAAKsiD,KAAMtiD,KAAKuiD,OAAQviD,KAAKwiD,aAGrDxiD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,uBCnEb,MAAM4+C,WAAoB7gD,GAExBhD,YAAYiD,EAAaC,EAAK4gD,EAAQ3gD,GAEpC6J,MAAM/J,EAAaC,EAAKC,GAExBlD,KAAK6jD,OAASA,EAGhB9jD,sBAAsBgE,QAEkCC,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAE3CjD,KAAK6jD,OAAOC,KAAK9jD,KAAKiD,KAAM8gD,IAI1BhgD,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAK8gD,GAE5D/jD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,qBAENg/C,QAQAC,IAECjkD,KAAKkkD,YAAYD,EAAM,qLACvBjkD,KAAKgF,sBAKPjB,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,oBCzCX,MAAMm/C,WAAsBphD,GAE1BhD,YAAYiD,EAAaC,EAAKmhD,EAAWlhD,GAEvC6J,MAAM/J,EAAaC,EAAKC,GACxBlD,KAAK6jD,OAAS,IAAIQ,GAClBrkD,KAAK6jD,OAAOS,QAAQrhD,EAAM,KAC1BjD,KAAKukD,KAAO,CACV,MAAMH,IACN,MAAMA,IACN,MAAMA,IACN,MAAMA,IACN,MAAMA,IACN,MAAMA,KAIVrkD,sBAAsBgE,QAEkCC,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAE3CjD,KAAK6jD,OAAOC,KAAK9jD,KAAKukD,MAAO9xC,IAE3B1O,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKwP,GAE5DzS,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,qBAENg/C,QAQAlgD,IAEC9D,KAAKkkD,YAAY,+EAAsFpgD,GACvG9D,KAAKgF,sBAKPjB,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,oBC/CX,MAAMw/C,WAAkBzhD,GAEtBhD,YAAYiD,EAAaC,EAAKC,GAE5B6J,MAAM/J,EAAaC,EAAKC,GACxBlD,KAAK6jD,OAAS,IAAIY,GAGpB1kD,sBAAsBgE,QAEkCC,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAE3CjD,KAAK6jD,OAAOC,KAAK9jD,KAAKiD,KAAM+sC,IAE1BjsC,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAK+sC,GAE5DhwC,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,qBAENg/C,QAQAC,IAECjkD,KAAKkkD,YAAYD,EAAM,qLACvBjkD,KAAKgF,sBAKPjB,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,oBCtCX,MAAM0/C,WAAmB3hD,GAEvBhD,YAAYiD,EAAaC,EAAKC,GAE5B6J,MAAM/J,EAAaC,EAAKC,GACxBlD,KAAK6jD,OAAS,IAAIc,GAGpB5kD,sBAAsBgE,QAEkCC,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAE3CjD,KAAK6jD,OAAOC,KAAK9jD,KAAKiD,KAAM2hD,IAE1B7gD,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAK2hD,GAE5D5kD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,qBAENg/C,QAQAC,IAECjkD,KAAKkkD,YAAYD,GACjBjkD,KAAKgF,sBAKPjB,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,oBCtCX,MAAM6/C,WAAmB9hD,GAEvBhD,YAAYiD,EAAaC,EAAKC,GAE5B6J,MAAM/J,EAAaC,EAAKC,GACxBlD,KAAK6jD,OAAS,IAAIiB,GAGpB/kD,sBAAsBgE,QAEkCC,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAE3CjD,KAAK6jD,OAAOC,KAAK9jD,KAAKiD,KAAMib,IAE1Bna,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKib,GAE5Dle,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,qBAENg/C,QAQAC,IAECjkD,KAAKkkD,YAAYD,EAAM,iLACvBjkD,KAAKgF,sBAKPjB,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,oBCtCX,MAAM+/C,WAAmBhiD,GAEvBhD,YAAYiD,EAAaC,EAAKC,GAE5B6J,MAAM/J,EAAaC,EAAKC,GACxBlD,KAAK6jD,OAAS,IAAImB,GAGpBjlD,sBAAsBgE,QAEkCC,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAE3CjD,KAAK6jD,OAAOC,KAAK9jD,KAAKiD,KAAM+sC,IAE1BjsC,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAK+sC,GAE5DhwC,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,qBAENg/C,QASAC,IAECjkD,KAAKkkD,YAAYD,EAAM,qLACvBjkD,KAAKgF,sBAKPjB,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,oBCvCX,MAAMigD,WAAwBliD,GAE5BhD,YAAYiD,EAAaC,EAAK4gD,EAAQ3gD,GAEpC6J,MAAM/J,EAAaC,EAAKC,GACxBlD,KAAK6jD,OAAS,IAAIkB,GAElB/kD,KAAK6jD,OAAOqB,eAAerB,GAG7B9jD,sBAAsBgE,QAEkCC,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAE3CjD,KAAK6jD,OAAOC,KAAK9jD,KAAKiD,KAAM+sC,IAE1BjsC,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAK+sC,GAE5DhwC,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,qBAENg/C,QAQAC,IAECjkD,KAAKkkD,YAAYD,EAAM,qLACvBjkD,KAAKgF,sBAKPjB,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,oBCvCX,MAAMmgD,WAA6BpiD,GAEjChD,YAAYiD,EAAaC,EAAKC,GAE5B6J,MAAM/J,EAAaC,EAAKC,GACxBlD,KAAK6jD,OAAS,IAAIuB,GAClBplD,KAAKqlD,WAAa,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,WAG5EtlD,sBAAsBgE,QAEkCC,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAE3CjD,KAAK6jD,OAAOS,QAAQtkD,KAAKiD,KACtBqiD,YAAYC,IACZzB,KAAK9jD,KAAKqlD,YAAaG,IAEtBzhD,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKuiD,GAE5DxlD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,qBAENg/C,QAQAC,IAECjkD,KAAKkkD,YAAYD,EAAM,qLACvBjkD,KAAKgF,sBAKTjB,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,oBC5CX,MAAMygD,WAAmB1iD,GAEvBhD,YAAYiD,EAAaC,EAAKC,GAE5B6J,MAAM/J,EAAaC,EAAKC,GAG1BnD,sBAAsBgE,EAAoBkB,QAEcjB,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAE3CgC,EAASmb,OAAO3b,MAAM2b,IAEpBrc,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKmd,GAE5DpgB,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,sBAKPjB,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,oBCtBX,MAAM0gD,WAAkB3iD,GAEtBhD,YAAYiD,EAAaC,EAAKC,GAE5B6J,MAAM/J,EAAaC,EAAKC,GACxBlD,KAAK6jD,OAAS,IAAI8B,GAGpB5lD,sBAAsBgE,QAEkCC,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAE3CjD,KAAK6jD,OAAOC,KAAK9jD,KAAKiD,KAAMwoC,IAE1B1nC,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKwoC,GAE5DzrC,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,qBAENg/C,QAQAC,IAECjkD,KAAKkkD,YAAYD,EAAM,iLACvBjkD,KAAKgF,sBAKPjB,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,oBCrCX,MAAM4gD,WAAyB7iD,GAE7BhD,YAAYiD,EAAaC,EAAKC,GAE5B6J,MAAM/J,EAAaC,EAAKC,GACxBlD,KAAK6jD,OAAS,IAAIa,GAGpB3kD,sBAAsBgE,QAEkCC,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAE3CjD,KAAK6jD,OAAOC,KAAK9jD,KAAKiD,KAAMgb,IAE1Bla,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKjD,KAAK6lD,WAAW5nC,IAE5Eje,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,qBAENg/C,QAQAC,IAECjkD,KAAKkkD,YAAYD,GACjBjkD,KAAKgF,sBAKPjB,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,mBAITjF,WAAW+lD,GAET,MAAMC,EAAeD,EAASxjD,MAAM,MAEU,KAA1CyjD,EAAaA,EAAajgD,OAAS,IAErCigD,EAAaC,MAGf,MAAM5Z,EAAY,GAElB,IAAK,IAAI9kC,EAAI,EAAGA,EAAIy+C,EAAajgD,OAAQwB,GAAK,EAC9C,CACE,MAAMY,EAAIgG,WAAW63C,EAAaz+C,EAAI,IAChCa,EAAI+F,WAAW63C,EAAaz+C,EAAI,IAChCqB,EAAIuF,WAAW63C,EAAaz+C,EAAI,IACtC8kC,EAAU5kC,KAAK,IAAIJ,EAAQc,EAAGC,EAAGQ,IAEnC,OAAOyjC,GC7DX,MAAM6Z,WAA0BljD,GAE9BhD,YAAYiD,EAAaC,EAAKC,GAE5B6J,MAAM/J,EAAaC,EAAKC,GACxBlD,KAAK6jD,OAAS,IAAIqC,GAGpBnmD,sBAAsBgE,QAEkCC,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAE3CjD,KAAK6jD,OAAOC,KAAK9jD,KAAKiD,KAAMuiD,IAE1BzhD,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKuiD,GAE5DxlD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,qBAENg/C,QAQAC,IAECjkD,KAAKkkD,YAAYD,EAAM,qLACvBjkD,KAAKgF,sBAKPjB,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,oBCtCX,MAAMmhD,WAAmBpjD,GAEvBhD,YAAYiD,EAAaC,EAAKC,GAE5B6J,MAAM/J,EAAaC,EAAKC,GACxBlD,KAAK6jD,OAAS,IAAIc,GAGpB5kD,sBAAsBgE,QAEkCC,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAE3CjD,KAAK6jD,OAAOC,KAAK9jD,KAAKiD,KAAM+sC,IAE1BjsC,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAK+sC,GAE5DhwC,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,qBAENg/C,QAQAC,IAECjkD,KAAKkkD,YAAYD,GACjBjkD,KAAKgF,sBAKPjB,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,oBCrCX,MAAMohD,WAA2BrjD,GAE/BhD,YAAYiD,EAAaC,EAAKC,EAAMmjD,GAAQ,EAAMC,GAAmB,EAAOC,GAAuB,GAEjGx5C,MAAM/J,EAAaC,EAAKC,GAExBlD,KAAKumD,qBAAuBA,EAC5BvmD,KAAKsmD,iBAAmBA,EACxBtmD,KAAKqmD,MAAQA,EAGftmD,sBAAsBgE,GAEhBI,GAAQlD,UAEVjB,KAAKwmD,qBAAqBziD,GAI1B/D,KAAKymD,qBAAqB1iD,GAI9BhE,qBAAqBgE,GAEnB,QAAsDC,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAC7C,CACE,MAAMgoB,EAAU,IAAIy7B,GACdj0C,EAAQ,IAAIk0C,MAElBl0C,EAAME,IAAM3S,KAAKiD,IAEjBwP,EAAMm0C,OAAS,KAEb37B,EAAQxY,MAAQA,EAChBwY,EAAQo7B,MAAQrmD,KAAKqmD,MACrBp7B,EAAQq7B,iBAAmBtmD,KAAKsmD,iBAChCr7B,EAAQ47B,WAAa7mD,KAAKumD,qBAAuBO,GAAiBC,GAClE97B,EAAQhM,aAAc,EAEtBlb,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKgoB,GAE5DjrB,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,mBAGPyN,EAAMu0C,QAAU,KAEdrjD,QAAQG,MAAM,6DAA8D9D,KAAKiD,IAAKjD,KAAKinD,oBAK7FljD,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,kBAITjF,qBAAqBgE,GAEnB,QAAsDC,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAC7C,CACE,MAAMikD,EAAe,CACrB3iD,YAA2B,eAG3BH,MAAMpE,KAAKiD,IAAKikD,GAAcziD,MAAM0iD,GAE3BA,EAAIx2B,SACVlsB,MAAMksB,GAEAy2B,kBAAkBz2B,EAAM,CAC7B41B,qBAAsBvmD,KAAKumD,qBAAuB,UAAY,OAC9Dc,iBAAkBrnD,KAAKqmD,MAAQ,QAAU,OACzCC,iBAAkBtmD,KAAKsmD,iBAAmB,cAAgB,WAE3D7hD,MAAM6iD,IAEP,MAAMr8B,EAAU,IAAIy7B,GAAQY,GAC5Br8B,EAAQo7B,MAAQrmD,KAAKqmD,MACrBp7B,EAAQq7B,iBAAmBtmD,KAAKsmD,iBAChCr7B,EAAQ47B,WAAa7mD,KAAKumD,qBAAuBO,GAAiBC,GAClE97B,EAAQhM,aAAc,EAEtBlb,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKgoB,GAE5DjrB,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,qBACJJ,OAAM,SAAS9B,GAEhBa,QAAQG,MAAMhB,WAKhBiB,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,mBCrGX,MAAMuiD,WAAsBxkD,GAE1BhD,YAAYiD,EAAaC,EAAKC,GAE5B6J,MAAM/J,EAAaC,EAAKC,GAG1BnD,sBAAsBgE,EAAoBkB,QAEcjB,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAE3CgC,EAAS0rB,OAAOlsB,MAAMksB,IAEpB,MAAM1F,EAAU,IAAIy7B,GAEdzjD,EAAM8tB,IAAIC,gBAAgBL,GAE1Ble,EAAQ,IAAIk0C,MAClBl0C,EAAME,IAAM1P,EAEZwP,EAAMm0C,OAAS,KAEb37B,EAAQxY,MAAQA,EAChBwY,EAAQhM,aAAc,EAEtBlb,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKgoB,GAE5DjrB,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,mBAGPyN,EAAMu0C,QAAU,KAEdrjD,QAAQG,MAAM,6DAA8D9D,KAAKiD,UAMrFc,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,oBC5CX,MAAMwiD,WAAoBzkD,GAExBhD,YAAYiD,EAAaC,EAAKC,GAE5B6J,MAAM/J,EAAaC,EAAKC,GAG1BnD,sBAAsBgE,EAAoBkB,QAEcjB,IAAlDD,EAAmBE,iBAAiBjE,KAAKiD,KAE3CgC,EAAS0rB,OAAOlsB,MAAMksB,IAEpB5sB,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAK8tB,IAAIC,gBAAgBL,IAEhF3wB,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,sBAKPjB,EAAmBe,aAAa9E,KAAKgD,YAAahD,KAAKiD,IAAKc,EAAmBE,iBAAiBjE,KAAKiD,MAErGjD,KAAK+E,0BAA0B,EAAG,GAClC/E,KAAKgF,oBCxBX,MAAMyiD,GAEJ1nD,YAAY2nD,GAEV1nD,KAAK2nD,iBAAmB,GACxB3nD,KAAK0nD,WAAaA,GAAc,gBAGlC3nD,WAAW8jD,GAET7jD,KAAK2nD,iBAAiBngD,KAAKq8C,GAG7B9jD,KAAKgE,GAEH,IAAK,IAAIuD,EAAI,EAAGA,EAAItH,KAAK2nD,iBAAiB7hD,OAAQwB,IAEhDtH,KAAK2nD,iBAAiBrgD,GAAGw8C,KAAK//C,GAAsBiV,IAIxD4uC,uBAEE,IAAIC,GAAW,EACf,IAAK,IAAIvgD,EAAI,EAAGA,EAAItH,KAAK2nD,iBAAiB7hD,OAAQwB,IAEhDugD,EAAWA,GAAY7nD,KAAK2nD,iBAAiBrgD,GAAGjE,aAElD,OAAOwkD,EAGTC,iBAEE,IAAIxkD,GAAY,EAChB,IAAK,IAAIgE,EAAI,EAAGA,EAAItH,KAAK2nD,iBAAiB7hD,OAAQwB,IAEhDhE,EAAYA,GAAatD,KAAK2nD,iBAAiBrgD,GAAGhE,UAEpD,OAAOA,EAGTvD,eAEE4D,QAAQG,MAAM,UAAY9D,KAAK0nD,WAAa,iCAC5C,IAAK,IAAIpgD,EAAI,EAAGA,EAAItH,KAAK2nD,iBAAiB7hD,OAAQwB,IAE5CtH,KAAK2nD,iBAAiBrgD,GAAGhE,WAE3BtD,KAAK2nD,iBAAiBrgD,GAAGygD,cAK/BhoD,eAEE,OAAOC,KAAKgoD,mBAAqBhoD,KAAKioD,kBAGxCloD,mBAEE,IAAIoD,EAAe,EAEnB,IAAK,IAAImE,EAAI,EAAGA,EAAItH,KAAK2nD,iBAAiB7hD,OAAQwB,IAEhDnE,GAAgBnD,KAAK2nD,iBAAiBrgD,GAAGnE,aAG3C,OAAOA,EAGTpD,kBAEE,IAAIqD,EAAc,EAElB,IAAK,IAAIkE,EAAI,EAAGA,EAAItH,KAAK2nD,iBAAiB7hD,OAAQwB,IAEhDlE,GAAepD,KAAK2nD,iBAAiBrgD,GAAGlE,YAG1C,OAAOA"}
1
+ {"version":3,"file":"index.module.js","sources":["../src/Browser.js","../src/utilities/Validation.js","../src/resource_loader/AbstractLoader.js","../src/utilities/OMath.js","../src/action_sequencer/ActionSequencer.js","../src/utilities/EasingFunctions.js","../src/action_sequencer/ActionInterpolator.js","../src/action_sequencer/NumberInterpolator.js","../src/view_components/ViewContext.js","../src/action_sequencer/ActionEvent.js","../src/view_components/transition/DrawIOAnimationSheet.js","../src/view_components/transition/ActionSequencerBuilder.js","../src/EventManager.js","../src/ResourceContainer.js","../src/utilities/HTMLUtilities.js","../src/view_components/transition/TransitionTable.js","../src/Time.js","../src/view_components/ViewState.js","../src/view_components/transition/ViewStateTransitionHandler.js","../src/view_components/ViewManager.js","../src/view_components/ApplicationView.js","../src/BaseApplication.js","../src/render_mode/BaseRender.js","../src/materials/BaseShaderMaterial.js","../src/materials/BlitMaterial.js","../src/materials/AddMaterial.js","../src/materials/UnrealBloomComposeMaterial.js","../src/CameraManager.js","../src/Capabilities.js","../src/canvas_drawer/CanvasDrawer.js","../src/Configuration.js","../src/html_utilities/css_animator_states/Idle.js","../src/html_utilities/css_animator_states/Animating.js","../src/html_utilities/CSSAnimator.js","../src/components/AxisHelper.js","../src/SceneManager.js","../src/primitives/Cube.js","../src/primitives/Sphere.js","../src/primitives/Arrow.js","../src/OScreen.js","../src/materials/ScreenSpaceTextureMaterial.js","../src/PerspectiveCamera.js","../src/Debug.js","../src/render_utilities/Blitter.js","../src/materials/ClearDepthNormalMaterial.js","../src/materials/DepthNormalMaterial.js","../src/render_utilities/DepthAndNormalsRenderer.js","../src/Graphics.js","../src/materials/NormalMaterial.js","../src/render_mode/DebugNormalsRender.js","../src/KeyboardInput.js","../src/OS.js","../src/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/UI.js","../src/utilities/PerspectiveFrustumPointFitter.js","../src/utilities/OrthographicFrustumPointFitter.js","../src/utilities/CameraUtilities.js","../src/Initializer.js","../src/materials/SSAOMaterial.js","../src/materials/SSAOComposeMaterial.js","../src/materials/DisplayNormalTextureMaterial.js","../src/materials/BoxBlurMaterial.js","../src/render_utilities/Blurrer.js","../src/render_mode/NormalAORender.js","../src/render_mode/NormalRender.js","../src/render_mode/VRRender.js","../src/materials/GaussianBlurMaterial.js","../src/materials/LuminosityHighPassMaterial.js","../src/render_utilities/GaussianBlurrer.js","../src/render_mode/UnrealBloomRender.js","../src/OrthographicCamera.js","../src/view_components/ViewComponentManager.js","../src/RenderLoop.js","../src/Screen.js","../src/canvas_drawer/SimpleTextDrawer.js","../src/view_components/ViewComponent.js","../src/primitives/HorizontalPlane.js","../src/primitives/VerticalPlane.js","../src/utilities/ArrayUtilities.js","../src/utilities/FrustumPointFitter.js","../src/utilities/GeometryUtilities.js","../src/utilities/ImageUtilities.js","../src/utilities/MeshSampler.js","../src/utilities/ModelUtilities.js","../src/utilities/ObjectUtilities.js","../src/utilities/StringUtilities.js","../src/utilities/TimeUtilities.js","../src/components/Grid.js","../src/components/Line.js","../src/components/WorldImage.js","../src/components/Text2D.js","../src/materials/UIElementMaterial.js","../src/ui/ui_element_position/ScreenSpacePosition.js","../src/ui/ui_element_position/WorldSpacePosition.js","../src/ui/ui_element_state/UIElementState.js","../src/ui/ui_element_state/OnIdle.js","../src/ui/ui_element_state/OnMouseEnter.js","../src/ui/ui_element_state/OnMouseExit.js","../src/ui/ui_element_state/OnMouseHover.js","../src/components/UIElement.js","../src/components/UpdatableMaterialMesh.js","../src/components/sdf_text/TextGlyph.js","../src/components/sdf_text/SDFText.js","../src/materials/SDFTextMaterial.js","../src/components/sdf_text/SDFTextBatch.js","../src/action_sequencer/VectorInterpolator.js","../src/materials/MedianFilterMaterial.js","../src/render_utilities/MedianFilter.js","../src/materials/DualFilteringBlurMaterial.js","../src/materials/AlphaFilterMaterial.js","../src/render_utilities/DualFilteringBlurrer.js","../src/gpu_particles/ParticleAttribute.js","../src/gpu_particles/GPUParticleSystem.js","../src/materials/gpu_particles/ParticleStorageMaterial.js","../src/gpu_particles/ParticlePositionAttribute.js","../src/data_textures/CustomDataTexture.js","../src/data_textures/RGBDataTexture.js","../src/data_textures/RGBADataTexture.js","../src/data_textures/RGBFloatDataTexture.js","../src/data_textures/RGBAFloatDataTexture.js","../src/static_batcher/BatchedMesh.js","../src/static_batcher/MeshBatcher.js","../src/components/AudioClip.js","../src/resource_loader/AudioLoader.js","../src/resource_loader/BasisLoader.js","../src/resource_loader/CubemapLoader.js","../src/resource_loader/DAELoader.js","../src/resource_loader/FileLoader.js","../src/resource_loader/FontLoader.js","../src/resource_loader/GLTFLoader.js","../src/resource_loader/GLTFDRACOLoader.js","../src/resource_loader/HDRCubeTextureLoader.js","../src/resource_loader/JSONLoader.js","../src/resource_loader/OBJLoader.js","../src/resource_loader/PointArrayLoader.js","../src/resource_loader/RGBETextureLoader.js","../src/resource_loader/TextLoader.js","../src/resource_loader/AsyncTextureLoader.js","../src/resource_loader/TextureLoader.js","../src/resource_loader/VideoLoader.js","../src/resource_loader/ResourceBatch.js"],"sourcesContent":["\nclass Browser\n{\n async init()\n {\n this.browser_name = '';\n this.agent = window.navigator.userAgent.toLowerCase();\n\n this.has_web_xr_support = 'xr' in navigator;\n this.is_vr = this.has_web_xr_support && await navigator.xr.isSessionSupported('immersive-vr');\n\n switch (true)\n {\n case this.agent.indexOf('edge') > -1:\n this.browser_name = 'edge_ie';\n break;\n case this.agent.indexOf('edg') > -1:\n this.browser_name = 'edge_chromium';\n break;\n case this.agent.indexOf('opr') > -1 && !!window.opr:\n this.browser_name = 'opera';\n break;\n case this.agent.indexOf('chrome') > -1 && !!window.chrome:\n this.browser_name = 'chrome';\n break;\n case this.agent.indexOf('trident') > -1:\n this.browser_name = 'iexplorer';\n break;\n case this.agent.indexOf('firefox') > -1:\n this.browser_name = 'firefox';\n break;\n case this.agent.indexOf('safari') > -1:\n this.browser_name = 'safari';\n break;\n default:\n this.browser_name = 'other';\n break;\n }\n\n this.version = this.get_version();\n }\n\n get name()\n {\n return this.browser_name;\n }\n\n get is_safari()\n {\n return this.browser_name === 'safari';\n }\n\n get is_chrome()\n {\n return this.browser_name === 'chrome';\n }\n\n get is_edge()\n {\n return this.browser_name === 'edge_ie';\n }\n\n get is_edge_chromium()\n {\n return this.browser_name === 'edge_chromium';\n }\n\n get has_webm()\n {\n return !!(this.is_chrome || this.is_firefox || this.is_edge_chromium);\n }\n\n get has_hvec()\n {\n return this.is_safari;\n }\n\n get preferred_video_extension()\n {\n return this.has_webm ? 'webm' : this.has_hvec ? 'hvec.mp4' : 'mp4';\n }\n\n get_version()\n {\n const ua = navigator.userAgent;\n let tem = '';\n let version = 0;\n\n let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n\n if (/trident/i.test(M[1]))\n {\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n version = 'IE ' + (tem[1] || '');\n }\n if (M[1] === 'Chrome')\n {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem != null) version = tem.slice(1).join(' ').replace('OPR', 'Opera');\n }\n\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+(\\.\\d+)?)/i)) != null) M.splice(1, 1, tem[1]);\n\n version = M.join(' ');\n\n return Number(version.split(' ')[1]);\n }\n}\n\nconst browser = new Browser();\nexport { browser as Browser };\n","class Validation\n{\n constructor()\n {}\n\n static is_int(n)\n {\n return Number(n) === n && n % 1 === 0;\n }\n\n static is_float(n)\n {\n return Number(n) === n && n % 1 !== 0;\n }\n\n static is_number(n)\n {\n return this.is_int(n) || this.is_float(n);\n }\n\n static is_json(str)\n {\n try\n {\n JSON.parse(str);\n }\n catch (e)\n {\n return false;\n }\n\n return true;\n }\n}\n\nexport { Validation };\n","import { Browser } from '../Browser';\r\nimport { Validation } from '../utilities/Validation';\r\n\r\nclass AbstractLoader\r\n{\r\n constructor(resource_id, url, size = 1)\r\n {\r\n this.resource_id = resource_id;\r\n this.url = url;\r\n this.loaded_bytes = 0;\r\n this.total_bytes = size;\r\n\r\n this.has_finished = false;\r\n this.has_error = false;\r\n this.error_message = 'none';\r\n }\r\n\r\n __update_downloaded_bytes(loaded, total)\r\n {\r\n loaded = Validation.is_number(loaded) ? loaded : 1;\r\n total = Validation.is_number(total) ? total : 1;\r\n\r\n this.loaded_bytes = loaded;\r\n\r\n if (total > 0)\r\n {\r\n this.total_bytes = total;\r\n }\r\n\r\n if (this.loaded_bytes > this.total_bytes)\r\n {\r\n console.warn('Total bytes is smaller than loaded ones. Please set total bytes by hand to:', this.url);\r\n }\r\n }\r\n\r\n __loading_ended()\r\n {\r\n this.has_finished = true;\r\n }\r\n\r\n __set_error(message)\r\n {\r\n this.has_error = true;\r\n this.error_message = message;\r\n }\r\n\r\n print_error()\r\n {\r\n console.error('Error while loading ' + this.resource_id + '\\n\\t path: ' + this.url + '\\n\\t\\t' + this.error_message);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const cache = Browser.is_safari ? 'no-cache' : 'default';\r\n\r\n fetch(this.url, {\r\n method: 'GET', // *GET, POST, PUT, DELETE, etc.\r\n mode: 'cors', // no-cors, *cors, same-origin\r\n cache: cache, // *default, no-cache, reload, force-cache, only-if-cached\r\n credentials: 'same-origin', // include, *same-origin, omit\r\n redirect: 'follow' // manual, *follow, error\r\n })\r\n .then(this.on_progress.bind(this, resource_container))\r\n .catch(this.__on_error.bind(this));\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n async on_progress(resource_container, response)\r\n {\r\n const response_clone = response.clone();\r\n const reader = response.body.getReader();\r\n\r\n // Step 2: get total length\r\n const contentLength = +response.headers.get('Content-Length');\r\n\r\n // Step 3: read the data\r\n let receivedLength = 0; // received that many bytes at the moment\r\n\r\n while (true)\r\n {\r\n const { done, value } = await reader.read();\r\n\r\n if (done)\r\n {\r\n break;\r\n }\r\n\r\n receivedLength += value.length;\r\n\r\n this.__update_downloaded_bytes(receivedLength, contentLength);\r\n // console.log(`Received ${receivedLength} of ${contentLength}`);\r\n }\r\n\r\n this.on_preloaded_finished(resource_container, response_clone);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n }\r\n\r\n __on_error(data)\r\n {\r\n console.error(data);\r\n }\r\n}\r\n\r\nexport { AbstractLoader };\r\n","import { Vector3 } from 'three';\n\nclass OMath\n{\n constructor()\n {}\n\n static linear_map(value,\n from_range_start_value,\n from_range_end_value,\n to_range_start_value,\n to_range_end_value)\n {\n return ((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (to_range_end_value - to_range_start_value) + to_range_start_value;\n }\n\n static between(value, min, max)\n {\n return (value >= min && value <= max);\n }\n\n static mod(number, divisor)\n {\n return ((number % divisor) + divisor) % divisor;\n }\n\n static rgb_to_hex(rgb)\n {\n rgb.r = Math.round(rgb.r * 255).toString(16);\n rgb.g = Math.round(rgb.g * 255).toString(16);\n rgb.b = Math.round(rgb.b * 255).toString(16);\n\n if (rgb.r.length === 1)\n {\n rgb.r = '0' + rgb.r;\n }\n if (rgb.g.length === 1)\n {\n rgb.g = '0' + rgb.g;\n }\n if (rgb.b.length === 1)\n {\n rgb.b = '0' + rgb.b;\n }\n\n return '#' + rgb.r + rgb.g + rgb.b;\n }\n\n static project_points_on_plane(points, plane)\n {\n const projected_point = new Vector3();\n const points_on_plane = [];\n for (let i = 0; i < points.length; i++)\n {\n plane.projectPoint(points[i], projected_point);\n points_on_plane.push(projected_point.clone());\n }\n\n return points_on_plane;\n }\n\n static matrix4_lerp(from, to, target, t)\n {\n for (let i = 0; i < 16; i++)\n {\n target.elements[i] = this.lerp(from.elements[i], to.elements[i], t);\n }\n }\n\n static equals(x1, x2)\n {\n return Math.abs(x1 - x2) < 0.000001;\n }\n\n static lerp(x, y, t)\n {\n return (1 - t) * x + t * y;\n }\n\n static clamp(value, min, max)\n {\n return Math.max(min, Math.min(max, value));\n }\n\n static euclideanModulo(n, m)\n {\n return ((n % m) + m) % m;\n }\n\n static pingpong(x, length = 1)\n {\n return length - Math.abs(OMath.euclideanModulo(x, length * 2) - length);\n }\n\n static degToRad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static radToDeg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static deg_to_rad(degrees)\n {\n return degrees * (Math.PI / 180);\n }\n\n static rad_to_deg(radians)\n {\n return radians * (180 / Math.PI);\n }\n\n static perspective_divide(v)\n {\n v.x /= v.w;\n v.y /= v.w;\n v.z /= v.w;\n return v;\n }\n\n static points_average(points)\n {\n const center = points[0].clone();\n for (let i = 1; i < points.length; i++)\n {\n center.add(points[i]);\n }\n center.multiplyScalar(1 / points.length);\n return center;\n }\n\n static get_random_color()\n {\n const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];\n\n let col = '#';\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n\n col += arr[Math.floor(Math.random() * 16)];\n col += arr[Math.floor(Math.random() * 16)];\n return col;\n }\n\n static saturate(x)\n {\n return OMath.clamp(x, 0, 1);\n }\n}\n\nexport { OMath };\n","\nimport { OMath } from '../utilities/OMath';\n\nclass ActionSequencer\n{\n constructor(context = {})\n {\n this.previous_elapsed_time = -0.00001;\n this.elapsed_time = -0.00001;\n this.playback_speed = this.__get_playback_speed();\n this.playing = true;\n\n this.action_events = [];\n this.context = context;\n\n this.initial_context = JSON.parse(JSON.stringify(context));\n\n this.tmp_t = 0;\n\n this.channels = {};\n\n const channel_names = Object.keys(context);\n for (let i = 0; i < channel_names.length; i++)\n {\n this.channels[channel_names[i]] = [];\n }\n\n this.duration = 0;\n }\n\n play()\n {\n this.playing = true;\n }\n\n stop()\n {\n this.playing = false;\n }\n\n reset()\n {\n this.elapsed_time = -0.00001;\n }\n\n skip()\n {\n const duration = this.get_duration();\n this.__play_clips(this.elapsed_time, duration + 0.0001);\n this.elapsed_time = duration;\n }\n\n update(delta_time)\n {\n if (this.playing)\n {\n this.previous_elapsed_time = this.elapsed_time;\n this.elapsed_time += delta_time * this.playback_speed;\n this.__play_clips(this.previous_elapsed_time, this.elapsed_time);\n }\n }\n\n set_progress(time)\n {\n this.previous_elapsed_time = this.elapsed_time;\n this.elapsed_time = OMath.clamp(time, 0, this.duration);\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n set_normalized_progress(t)\n {\n this.previous_elapsed_time = this.elapsed_time;\n this.elapsed_time = OMath.clamp(t, 0, 1) * this.duration;\n this.__play_clips(this.elapsed_time, this.elapsed_time);\n }\n\n get_progress()\n {\n return OMath.clamp(this.elapsed_time / this.get_duration(), 0, 1);\n }\n\n is_finished()\n {\n return this.elapsed_time > this.get_duration();\n }\n\n add_action_event(trigger_time, action)\n {\n this.action_events.push({\n trigger_time: trigger_time,\n action: action\n });\n\n this.duration = Math.max(this.duration, trigger_time);\n }\n\n add_action_interpolator(from, to, interpolator, use_dynamic_from_value = false)\n {\n if (use_dynamic_from_value)\n {\n const keyframes = this.channels[interpolator.attribute_name];\n\n if (keyframes === undefined)\n {\n console.error(`${interpolator.attribute_name} missing in initial state data.`);\n }\n\n if (keyframes.length === 0)\n {\n interpolator.from = this.initial_context[interpolator.attribute_name];\n }\n else\n {\n interpolator.from = keyframes[keyframes.length - 1].interpolator.to;\n }\n }\n\n const keyframe = {\n from: from,\n to: to,\n interpolator: interpolator\n };\n\n this.duration = Math.max(this.duration, to);\n this.channels[interpolator.attribute_name].push(keyframe);\n }\n\n get_current_target_value(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n\n if (this.elapsed_time < keyframe.from)\n {\n return keyframe.interpolator.evaluate(0);\n }\n\n return keyframe.interpolator.evaluate(1);\n }\n\n get_current_starting_value(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n\n return keyframe.interpolator.evaluate(0);\n }\n\n get_current_progress(name)\n {\n const keyframe = this.__get_current_keyframe(name, this.elapsed_time);\n const t = this.__linear_map_01(this.elapsed_time, keyframe.from, keyframe.to);\n\n return keyframe.interpolator.easing_function(t);\n }\n\n get_duration()\n {\n return this.duration;\n }\n\n __play_clips(from, to)\n {\n if (this.elapsed_time > this.previous_elapsed_time)\n {\n this.__play_events(this.previous_elapsed_time, this.elapsed_time);\n }\n const channel_names = Object.keys(this.initial_context);\n\n for (let i = 0; i < channel_names.length; i++)\n {\n const name = channel_names[i];\n const keyframe = this.__get_current_keyframe(name, from);\n\n this.context[name] = this.evaluate_keyframe(keyframe, from);\n }\n }\n\n __play_events(from, to)\n {\n for (let i = 0; i < this.action_events.length; i++)\n {\n const trigger_time = this.action_events[i].trigger_time;\n if (OMath.between(trigger_time, from, to))\n {\n console.log('Play event: ' + this.action_events[i].action.constructor.name + ' at ' + this.action_events[i].trigger_time);\n this.action_events[i].action.trigger();\n }\n }\n }\n\n evaluate_keyframe(keyframe, time)\n {\n this.tmp_t = this.__linear_map_01(time, keyframe.from, keyframe.to);\n\n return keyframe.interpolator.evaluate(OMath.clamp(this.tmp_t, 0, 1));\n }\n\n get_keyframes(channel_name)\n {\n return this.channels[channel_name];\n }\n\n is_channel_redefined(channel_name)\n {\n for (let i = 0; i < this.channels[channel_name].length; i++)\n {\n const keyframe = this.channels[channel_name][i];\n\n if (keyframe.interpolator.initial)\n {\n return false;\n }\n }\n\n return true;\n }\n\n __linear_map_01(value,\n from_range_start_value,\n from_range_end_value)\n {\n return OMath.saturate(((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (1 - 0) + 0);\n }\n\n __get_current_keyframe(channel_name, time)\n {\n let current = undefined;\n\n const keyframes = this.channels[channel_name];\n\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n\n if (time >= keyframe.from && time <= keyframe.to)\n {\n current = keyframe;\n return current;\n }\n }\n\n let min = Infinity;\n\n for (let i = 0; i < keyframes.length; i++)\n {\n const keyframe = keyframes[i];\n const distance = Math.abs(keyframe.to - time);\n\n if (distance < min)\n {\n current = keyframe;\n min = distance;\n }\n }\n\n return current;\n }\n\n __get_playback_speed()\n {\n const url_params = new URLSearchParams(window.location.search);\n\n const transitions_velocity = url_params.get('transitions_velocity');\n\n if (transitions_velocity)\n {\n return Number(transitions_velocity);\n }\n else\n {\n return 1;\n }\n }\n}\n\nexport { ActionSequencer };\n","class EasingFunctions\n{\n constructor()\n {}\n\n static linear(x)\n {\n return x;\n }\n\n static triangular(x)\n {\n return 1 - Math.abs((x * 2) % (1 * 2) - 1);\n }\n\n static ease_in_sine(x)\n {\n return 1 - Math.cos(x * 3.1415926 / 2);\n }\n\n static ease_out_sine(x)\n {\n return Math.sin(x * 3.1415926 / 2);\n }\n\n static ease_in_out_sine(x)\n {\n return -(Math.cos(3.1415926 * x) - 1) / 2;\n }\n\n static ease_in_cubic(x)\n {\n return x * x * x;\n }\n\n static ease_out_cubic(x)\n {\n return 1 - Math.pow(1 - x, 3);\n }\n\n static ease_in_out_cubic(x)\n {\n return x < 0.5\n ? 4 * x * x * x\n : 1 - Math.pow(-2 * x + 2, 3) / 2;\n }\n\n static ease_in_quad(x)\n {\n return x * x;\n }\n\n static ease_out_quad(x)\n {\n return 1 - (1 - x) * (1 - x);\n }\n\n static ease_in_out_quad(x)\n {\n return x < 0.5\n ? 2 * x * x\n : 1 - Math.pow(-2 * x + 2, 2) / 2;\n }\n\n static ease_in_quart(x)\n {\n return x * x * x * x;\n }\n\n static ease_out_quart(x)\n {\n return 1 - Math.pow(1 - x, 4);\n }\n\n static ease_in_out_quart(x)\n {\n return x < 0.5\n ? 8 * x * x * x * x\n : 1 - Math.pow(-2 * x + 2, 4) / 2;\n }\n\n static ease_in_quint(x)\n {\n return x * x * x * x * x;\n }\n\n static ease_out_quint(x)\n {\n return 1 - Math.pow(1 - x, 5);\n }\n\n static ease_in_out_quint(x)\n {\n return x < 0.5\n ? 16 * x * x * x * x * x\n : 1 - Math.pow(-2 * x + 2, 5) / 2;\n }\n\n static ease_in_expo(x)\n {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n }\n\n static ease_out_expo(x)\n {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n }\n\n static ease_in_out_expo(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n }\n\n static ease_in_circ(x)\n {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n }\n\n static ease_out_circ(x)\n {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n }\n\n static ease_in_out_circ(x)\n {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n }\n\n static ease_in_back(x)\n {\n return 2.7015 * x * x * x - 1.7015 * x * x;\n }\n\n static ease_out_back(x)\n {\n return 1 + 2.7015 * Math.pow(x - 1, 3) + 1.7015 * Math.pow(x - 1, 2);\n }\n\n static ease_in_out_back(x)\n {\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((2.5949095 + 1) * 2 * x - 2.5949095)) / 2\n : (Math.pow(2 * x - 2, 2) * ((2.5949095 + 1) * (x * 2 - 2) + 2.5949095) + 2) / 2;\n }\n\n static ease_in_elastic(x)\n {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n }\n\n static ease_out_elastic(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * 2.0943950) + 1;\n }\n\n static ease_in_out_elastic(x)\n {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * 1.3962633)) / 2\n : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * 1.3962633) / 2 + 1;\n }\n\n static ease_in_bounce(x)\n {\n return 1 - this.ease_out_bounce(1 - x);\n }\n\n static ease_out_bounce(x)\n {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1)\n {\n return n1 * x * x;\n }\n else if (x < 2 / d1)\n {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n }\n else if (x < 2.5 / d1)\n {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n }\n else\n {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n }\n\n static ease_in_out_bounce(x)\n {\n return x < 0.5\n ? (1 - this.ease_out_bounce(1 - 2 * x)) / 2\n : (1 + this.ease_out_bounce(2 * x - 1)) / 2;\n }\n\n static heartbeat(t)\n {\n return 1.0 - Math.pow(Math.abs(Math.sin(t + 1.0)), 63.0) * Math.sign(Math.sin(t)) * Math.sin(t + 1.5 + 1.0) * 0.8;\n }\n}\n\nexport { EasingFunctions };\n","import { EasingFunctions } from '../utilities/EasingFunctions';\n\nclass ActionInterpolator\n{\n constructor(easing_function = 'linear')\n {\n this.easing_function = undefined;\n\n if (typeof easing_function === 'string')\n {\n this.easing_function = EasingFunctions[easing_function];\n }\n else\n {\n this.easing_function = easing_function;\n }\n }\n\n update(context, t)\n {\n\n }\n}\n\nexport { ActionInterpolator };\n","import { ActionInterpolator } from './ActionInterpolator';\nimport { OMath } from '../utilities/OMath';\n\nclass NumberInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, initial = false, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n this.initial = initial;\n }\n\n update(context, t)\n {\n context[this.attribute_name] = OMath.lerp(this.from, this.to, this.easing_function(t));\n }\n\n evaluate(t)\n {\n return OMath.lerp(this.from, this.to, this.easing_function(t));\n }\n}\n\nexport { NumberInterpolator };\n","class ViewContext\n{\n constructor()\n {\n this.app = undefined;\n }\n\n set_app(app)\n {\n this.app = app;\n }\n}\n\nconst view_context = new ViewContext();\nexport { view_context as ViewContext };\n","import { ViewContext } from '../view_components/ViewContext';\n\nclass ActionEvent\n{\n constructor(name, method, args)\n {\n this.name = name;\n this.method = method;\n this.args = args;\n }\n\n trigger()\n {\n ViewContext.app[this.name][this.method](...this.args.split(','));\n }\n}\n\nexport { ActionEvent };\n","class DrawIOAnimationSheet\n{\n constructor()\n {\n\n }\n\n parse(xml_document)\n {\n const doc = new DOMParser().parseFromString(xml_document, 'text/xml');\n\n const animation_nodes = doc.querySelectorAll('mxGeometry');\n\n const animation_tracks = [];\n const triggers = [];\n\n for (let i = 0; i < animation_nodes.length; i++)\n {\n const node = animation_nodes[i];\n const parent_node = node.parentElement;\n const data = parent_node.getAttribute('value');\n\n const x_pos = this.get_node_x_position(node);\n\n const from = x_pos / 100;\n const duration = parseFloat(node.getAttribute('width')) / 100;\n\n // is trigger\n if (parent_node.getAttribute('style').includes('rhombus;'))\n {\n const split_data = data.split('.');\n const trigger_name = split_data[0];\n const trigger_method = split_data[1];\n\n triggers.push({\n name: trigger_name,\n method: trigger_method,\n at_time: from + duration * 0.5\n });\n }\n\n const valid_element = parent_node.getAttribute('style').includes('rounded=0;') &&\n !parent_node.getAttribute('style').includes('text;');\n\n if (valid_element && data !== '' && !data.includes(' '))\n {\n const split_data = data.split('=');\n\n const attribute_name = split_data[0];\n\n const value_data = split_data[1].split('--');\n const to_value = parseFloat(value_data[0]);\n const easing_function = value_data[1];\n\n if (split_data.length !== 2)\n {\n console.error('DrawIO data is malformed:', data);\n }\n\n if (value_data.length !== 2)\n {\n console.error('DrawIO data is malformed:', data);\n }\n\n animation_tracks.push({\n attribute_name: attribute_name,\n from_time: from,\n to_time: from + duration,\n to_value: to_value,\n easing_function: easing_function\n });\n }\n }\n\n animation_tracks.sort((a, b) =>\n {\n return a.from_time - b.from_time;\n });\n return {\n animation_tracks: animation_tracks,\n triggers: triggers\n };\n }\n\n get_node_x_position(node)\n {\n const x_pos = node.getAttribute('x');\n return x_pos === null ? 0 : parseFloat(x_pos);\n }\n}\n\nexport { DrawIOAnimationSheet };\n","import { ActionSequencer } from '../../action_sequencer/ActionSequencer';\nimport { NumberInterpolator } from '../../action_sequencer/NumberInterpolator';\nimport { ActionEvent } from '../../action_sequencer/ActionEvent';\nimport { DrawIOAnimationSheet } from './DrawIOAnimationSheet';\n\nclass ActionSequencerBuilder\n{\n constructor(default_state_data)\n {\n this.default_state_data = default_state_data;\n }\n\n from_animation_sheet(animation_data, current_context, initial_context)\n {\n initial_context = initial_context || this.default_state_data;\n const tracks = animation_data.animation_tracks;\n const triggers = animation_data.triggers;\n\n const initial_tracks = this.state_to_tracks(this.default_state_data, this.get_longest_time(animation_data.animation_tracks));\n\n for (let i = 0; i < initial_tracks.length; i++)\n {\n if (tracks.find(element => element.attribute_name === initial_tracks[i].attribute_name) === undefined)\n {\n tracks.push(initial_tracks[i]);\n }\n }\n\n const sequencer = new ActionSequencer(current_context);\n\n for (let i = 0; i < tracks.length; i++)\n {\n const t = tracks[i];\n const interpolator = new NumberInterpolator(\n t.attribute_name,\n current_context[t.attribute_name],\n t.to_value,\n t.initial,\n t.easing_function\n );\n\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\n }\n\n for (let i = 0; i < triggers.length; i++)\n {\n const t = triggers[i];\n const action_event = new ActionEvent(t.name, t.method, t.args);\n sequencer.add_action_event(t.at_time, action_event);\n }\n\n return sequencer;\n }\n\n state_to_tracks(state, longest_time)\n {\n const tracks = [];\n\n const keys = Object.keys(state);\n\n for (let i = 0; i < keys.length; i++)\n {\n tracks.push({\n attribute_name: keys[i],\n from_time: 0,\n to_time: longest_time < 1 ? longest_time : 1,\n to_value: state[keys[i]],\n initial: true,\n easing_function: 'ease_in_out_cubic'\n });\n }\n\n return tracks;\n }\n\n from_draw_io(xml, context)\n {\n const transition_data = (new DrawIOAnimationSheet()).parse(xml);\n const tracks = transition_data.animation_tracks;\n const triggers = transition_data.triggers;\n const sequencer = new ActionSequencer(context);\n\n for (let i = 0; i < tracks.length; i++)\n {\n const t = tracks[i];\n const interpolator = new NumberInterpolator(\n t.attribute_name,\n context[t.attribute_name],\n t.to_value,\n t.initial,\n t.easing_function\n );\n\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\n }\n\n for (let i = 0; i < triggers.length; i++)\n {\n const t = triggers[i];\n const action_event = new ActionEvent(t.name, t.method);\n sequencer.add_action_event(t.at_time, action_event);\n }\n\n return sequencer;\n }\n\n get_longest_time(tracks)\n {\n let longest_time = -1;\n\n for (let i = 0; i < tracks.length; i++)\n {\n const track = tracks[i];\n\n const track_time = track.to_time;\n\n longest_time = track_time > longest_time ? track_time : longest_time;\n }\n\n return longest_time;\n }\n}\n\nexport { ActionSequencerBuilder };\n","class EventManager\n{\n init()\n {\n this.queue = {};\n\n this.zoom_changed_evt = 'zoom_changed';\n this.store_clickd_evt = 'store_clicked';\n this.point_selected_evt = 'point_selected';\n this.config_changed = 'config_changed';\n\n this.path_substep_completed = 'path_substep_completed';\n this.path_completed = 'path_completed';\n this.go_to_store_requested_evt = 'go_to_store_requested';\n\n this.resource_loaded_evt = 'resource_loaded';\n this.service_clicked_evt = 'service_clicked';\n this.unit_pos_updated_evt = 'unit_position_updated';\n\n this.floor_changed_evt = 'floor_changed';\n\n this.on_enter_floor_navigation = 'on_enter_floor_navigation';\n this.on_exit_floor_navigation = 'on_exit_floor_navigation';\n\n this.on_enter_floor_selection = 'on_enter_floor_selection';\n this.on_exit_floor_selection = 'on_exit_floor_selection';\n\n this.on_enter_outside_navigation = 'on_enter_outside_navigation';\n this.on_exit_outside_navigation = 'on_exit_outside_navigation';\n\n this.step_selected_evt = 'step_selected';\n }\n\n fire(event, payload)\n {\n const queue = this.queue[event];\n\n if (queue === undefined)\n {\n return;\n }\n let i = queue.length;\n while (i--)\n {\n queue[i](payload);\n }\n }\n\n on(event, callback)\n {\n if (typeof this.queue[event] === 'undefined')\n {\n this.queue[event] = [];\n }\n\n this.queue[event].push(callback);\n }\n\n fire_zoom_changed(zoom)\n {\n this.fire(this.zoom_changed_evt, zoom);\n }\n\n fire_store_selected(store_id)\n {\n this.fire(this.store_clickd_evt, store_id);\n }\n\n fire_point_selected(hit_data)\n {\n this.fire(this.point_selected_evt, hit_data);\n }\n\n fire_config_changed()\n {\n this.fire(this.config_changed);\n }\n\n fire_path_substep_completed(step_number)\n {\n this.fire(this.path_substep_completed, step_number);\n }\n\n fire_path_completed()\n {\n this.fire(this.path_completed);\n }\n\n fire_step_selected(step_index)\n {\n this.fire(this.step_selected_evt, step_index);\n }\n\n fire_go_to_store_requested(store_id)\n {\n this.fire(this.go_to_store_requested_evt, store_id);\n }\n\n fire_resource_loaded(resource)\n {\n this.fire(this.resource_loaded_evt, resource);\n }\n\n fire_service_clicked(service)\n {\n this.fire(this.service_clicked_evt, service);\n }\n\n fire_unit_position_updated(unit_data)\n {\n this.fire(this.unit_pos_updated_evt, unit_data);\n }\n\n fire_floor_switched(floor_id)\n {\n this.fire(this.floor_changed_evt, floor_id);\n }\n\n fire_on_enter_floor_navigation(state)\n {\n this.fire(this.on_enter_floor_navigation, state);\n }\n\n fire_on_exit_floor_navigation(state)\n {\n this.fire(this.on_exit_floor_navigation, state);\n }\n\n fire_on_enter_floor_selection(state)\n {\n this.fire(this.on_enter_floor_selection, state);\n }\n\n fire_on_exit_floor_selection(state)\n {\n this.fire(this.on_exit_floor_selection, state);\n }\n\n fire_on_enter_outside_navigation(state)\n {\n this.fire(this.on_enter_outside_navigation, state);\n }\n\n fire_on_exit_outside_navigation(state)\n {\n this.fire(this.on_exit_outside_navigation, state);\n }\n}\n\nconst event_manager = new EventManager();\nexport { event_manager as EventManager };\n","import { EventManager } from './EventManager';\n\nclass ResourceContainer\n{\n init()\n {\n this.resources = {};\n this.resources_by_url = {};\n }\n\n set_resource(name, url, resource)\n {\n const urls = Object.keys(this.resources_by_url);\n\n if (urls.includes(url))\n {\n this.resources[name] = this.resources_by_url[url];\n }\n else\n {\n this.resources[name] = resource;\n this.resources_by_url[url] = resource;\n }\n\n EventManager.fire_resource_loaded({ name: name, value: resource });\n }\n\n get_resource(name)\n {\n return this.resources[name];\n }\n\n get(name)\n {\n return this.resources[name];\n }\n}\n\nconst resource_container = new ResourceContainer();\nexport { resource_container as ResourceContainer };\n","class HTMLUtilities\n{\n static load_images(container)\n {\n const images = container.querySelectorAll('img');\n\n for (let i = 0; i < images.length; i++)\n {\n const image = images[i];\n\n if (image.dataset.src)\n {\n image.src = image.dataset.src;\n }\n }\n\n const image_objects = container.querySelectorAll('object');\n\n for (let i = 0; i < image_objects.length; i++)\n {\n const image_object = image_objects[i];\n\n if (image_object.dataset.src)\n {\n image_object.data = image_object.dataset.src;\n }\n }\n }\n\n static load_videos(container)\n {\n const videos = container.querySelectorAll('video');\n\n for (let i = 0; i < videos.length; i++)\n {\n const video = videos[i];\n\n if (video.dataset.src)\n {\n video.src = video.dataset.src;\n }\n }\n }\n\n static load_iframes(container)\n {\n const iframes = container.querySelectorAll('iframe');\n\n for (let i = 0; i < iframes.length; i++)\n {\n const iframe = iframes[i];\n\n if (iframe.dataset.src)\n {\n iframe.src = iframe.dataset.src;\n }\n }\n }\n\n static load_elements(container, selector)\n {\n const elements = container.querySelectorAll(selector);\n\n for (let i = 0; i < elements.length; i++)\n {\n const element = elements[i];\n\n if (element.dataset.src)\n {\n element.src = element.dataset.src;\n }\n }\n }\n}\n\nexport { HTMLUtilities };\n","import { ActionSequencerBuilder } from './ActionSequencerBuilder';\n\nclass TransitionTable\n{\n constructor()\n {\n this.transitions = [];\n this.default_state_data = {};\n }\n\n get(from_state_name, to_state_name, current_context)\n {\n for (let i = 0; i < this.transitions.length; i++)\n {\n if (this.transitions[i].from === from_state_name && this.transitions[i].to === to_state_name)\n {\n const action_sequencer = new ActionSequencerBuilder(this.default_state_data).from_animation_sheet(this.transitions[i].data, current_context);\n return action_sequencer;\n }\n }\n\n for (let i = 0; i < this.transitions.length; i++)\n {\n if (this.transitions[i].to === to_state_name && this.transitions[i].from === undefined)\n {\n const action_sequencer = new ActionSequencerBuilder(this.default_state_data).from_animation_sheet(this.transitions[i].data, current_context);\n return action_sequencer;\n }\n }\n\n console.error('TransitionTable.get no data found for: ', from_state_name, to_state_name);\n return undefined;\n }\n\n add_transitions(transitions)\n {\n for (let i = 0; i < transitions.length; i++)\n {\n this.transitions.push(transitions[i]);\n }\n }\n\n set_transitions(transitions)\n {\n this.transitions = transitions;\n }\n\n set_default_state_data(default_state_data)\n {\n this.default_state_data = default_state_data;\n }\n}\n\nexport { TransitionTable };\n","import { Vector2 } from 'three';\nimport { Clock } from 'three';\n\nclass Time\n{\n constructor()\n {\n this.__delta_buffer = [0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016, 0.016];\n }\n\n init()\n {\n this.___time = new Clock();\n this.__delta_time = 0;\n this.__smooth_delta_time = 0;\n this.__elapsed_time = 0;\n this.__allocated_time = new Vector2(0, 0);\n this.__frame_interpolation_t = 0;\n this.fixed_delta_time = 1 / 30;\n }\n\n get elapsed_time()\n {\n return this.__elapsed_time;\n }\n\n get delta_time()\n {\n return this.__delta_time;\n }\n\n get smooth_delta_time()\n {\n return this.__smooth_delta_time;\n }\n\n get shader_time()\n {\n this.__allocated_time.x = this.delta_time;\n this.__allocated_time.y = this.elapsed_time;\n return this.__allocated_time;\n }\n\n get frame_interpolation()\n {\n return this.__frame_interpolation_t;\n }\n\n get fdt()\n {\n return this.fixed_delta_time;\n }\n\n get dt()\n {\n return this.delta_time;\n }\n\n get sdt()\n {\n return this.smooth_delta_time;\n }\n\n __set_frame_interpolation(value)\n {\n this.__frame_interpolation_t = value;\n }\n\n __update()\n {\n this.__delta_time = this.___time.getDelta();\n this.__elapsed_time = this.___time.getElapsedTime();\n\n this.__delta_buffer.shift();\n this.__delta_buffer.push(this.delta_time < 0.32 ? this.delta_time : 0.032);\n\n this.__calculate_smooth_delta_time();\n }\n\n __calculate_smooth_delta_time()\n {\n this.__smooth_delta_time = 0;\n\n for (let i = 0; i < this.__delta_buffer.length; i++)\n {\n this.__smooth_delta_time += this.__delta_buffer[i];\n }\n\n this.__smooth_delta_time = this.__smooth_delta_time / this.__delta_buffer.length;\n }\n}\n\nconst time = new Time();\nexport { time as Time };\n","class ViewState\n{\n constructor(name)\n {\n this.name = name;\n }\n\n start()\n {\n }\n\n show()\n {\n }\n\n hide()\n {\n }\n\n before_enter()\n {\n }\n\n on_enter()\n {\n }\n\n before_update()\n {\n }\n\n update()\n {\n }\n\n fixed_update()\n {\n }\n\n update_enter_transition(global_view_data, transition_progress, action_sequencer)\n {\n // Backward compatibility. It will be removed in future releases.\n this.update_transition(global_view_data, transition_progress, action_sequencer);\n }\n\n update_exit_transition(global_view_data, transition_progress, action_sequencer)\n {\n }\n\n // Deprecated\n update_transition(global_view_data, transition_progress, action_sequencer)\n {\n }\n\n before_exit()\n {\n }\n\n on_exit()\n {\n }\n}\n\nexport { ViewState };\n","import { Time } from '../../Time';\nimport { ViewState } from '../ViewState';\n\nclass ViewStateTransitionHandler\n{\n constructor(transition_table)\n {\n this.last_state = new ViewState();\n this.current_state = new ViewState();\n\n this.default_state_data = {};\n this.current_state_data = {};\n\n this.transition_table = transition_table;\n\n this.transitioning = false;\n }\n\n go_to_state(state, skip = false)\n {\n if (this.transitioning)\n {\n this.__exit_last_state();\n }\n\n this.last_state = this.current_state;\n this.current_state = state;\n\n this.last_state.before_exit();\n this.current_state.show();\n\n this.action_sequencer = this.transition_table.get(this.last_state.name, this.current_state.name, this.current_state_data);\n this.current_state.before_enter();\n\n this.action_sequencer.play();\n\n this.transitioning = true;\n\n if (skip)\n {\n this.action_sequencer.skip();\n this.update();\n }\n }\n\n update()\n {\n if (this.transitioning)\n {\n this.__update_transitions();\n\n if (this.action_sequencer.is_finished())\n {\n this.transitioning = false;\n\n this.__update_transitions();\n\n this.__exit_last_state();\n\n this.current_state.on_enter();\n }\n }\n else\n {\n this.current_state.update();\n }\n }\n\n before_update()\n {\n this.current_state.before_update();\n }\n\n fixed_update()\n {\n this.current_state.fixed_update();\n }\n\n set_state(state)\n {\n this.current_state = state;\n }\n\n set_default_state_data(default_state_data)\n {\n Object.assign(this.default_state_data, default_state_data);\n Object.assign(this.current_state_data, default_state_data);\n }\n\n __update_transitions()\n {\n this.action_sequencer.update(Time.delta_time);\n this.last_state.update_exit_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\n this.current_state.update_enter_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\n }\n\n __exit_last_state()\n {\n if (this.last_state.name !== this.current_state.name)\n {\n this.last_state.hide();\n }\n\n this.last_state.on_exit();\n }\n}\n\nexport { ViewStateTransitionHandler };\n","import { TransitionTable } from './transition/TransitionTable';\nimport { ViewStateTransitionHandler } from './transition/ViewStateTransitionHandler';\n\nclass ViewManager\n{\n constructor()\n {\n this.views = [];\n\n this.transition_table = new TransitionTable();\n this.transition_handler = new ViewStateTransitionHandler(this.transition_table);\n\n this.view_change_subscribers = [];\n\n this.browser_title_suffix = '';\n }\n\n before_update()\n {\n this.transition_handler.before_update();\n }\n\n update()\n {\n this.transition_handler.update();\n\n this.__set_views_opacities();\n }\n\n fixed_update()\n {\n this.transition_handler.fixed_update();\n }\n\n go_to_view(view_name, change_url = true, skip = false)\n {\n const v = this.get(view_name);\n this.transition_handler.go_to_state(v, skip);\n\n if (change_url)\n {\n this.__change_browser_url(v.url);\n this.__change_browser_title(v.url);\n }\n\n this.notify_view_change(view_name);\n }\n\n go_to_scene(scene_name, change_url = false, skip = false)\n {\n const next_view = this.get(scene_name);\n const transition_view = this.get('transition');\n\n transition_view.set_next_view(next_view);\n this.go_to_view(transition_view.name, change_url, skip);\n }\n\n subscribe_to_view_change(subscriber)\n {\n this.view_change_subscribers.push(subscriber);\n }\n\n notify_view_change(view_name)\n {\n for (let i = 0; i < this.view_change_subscribers.length; i++)\n {\n const subscriber = this.view_change_subscribers[i];\n subscriber.on_view_change(view_name);\n }\n }\n\n register_view(view)\n {\n this.views.push(view);\n }\n\n has_view(view_name)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].name === view_name)\n {\n return true;\n }\n }\n return false;\n }\n\n add_transitions(transitions)\n {\n this.transition_table.add_transitions(transitions);\n }\n\n set_transitions(transitions)\n {\n this.transition_table.set_transitions(transitions);\n }\n\n set_view(view_name)\n {\n const view = this.get(view_name);\n\n this.transition_handler.set_state(view);\n }\n\n set_browser_title_suffix(title_suffix)\n {\n this.browser_title_suffix = title_suffix;\n }\n\n get_current_view()\n {\n return this.transition_handler.current_state;\n }\n\n get_view_by_name(view_name)\n {\n console.warn('DEPRECATED. Use ViewManager.get instead');\n this.get(view_name);\n }\n\n get(view_name)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].name === view_name)\n {\n return this.views[i];\n }\n }\n console.error('[ViewManager.get] no view found for: ', view_name);\n return undefined;\n }\n\n get_view_by_url(url)\n {\n console.warn('DEPRECATED. Use ViewManager.get_by_url instead');\n this.get_by_url(url);\n }\n\n get_by_url(url)\n {\n for (let i = 0; i < this.views.length; i++)\n {\n if (this.views[i].url === url)\n {\n return this.views[i];\n }\n }\n console.error('[ViewManager.get_by_url] no view found for: ', url);\n return undefined;\n }\n\n set_default_state_data(default_state_data)\n {\n this.transition_table.set_default_state_data(default_state_data);\n this.transition_handler.set_default_state_data(default_state_data);\n }\n\n __change_browser_url(url)\n {\n window.history.pushState('', '', url);\n }\n\n __change_browser_title(name)\n {\n const title = this.__capitalize(name);\n\n document.title = title ? `${title} | ${this.browser_title_suffix}` : this.browser_title_suffix;\n }\n\n __set_views_opacities()\n {\n for (let i = 0; i < this.views.length; i++)\n {\n this.views[i].set_opacity(this.transition_handler.current_state_data);\n }\n }\n\n __capitalize(string)\n {\n let aux_string = string.toUpperCase().replace('/', '');\n aux_string = this.__snake_to_whitespace(aux_string);\n\n return aux_string;\n }\n\n __snake_to_whitespace(string)\n {\n return string.replace(\n /([-_][A-Z])/g,\n (group) => group\n .replace('-', ' ')\n .replace('_', ' ')\n );\n }\n}\n\nconst view_manager = new ViewManager();\nexport { view_manager as ViewManager };\n","import { ResourceContainer } from '../ResourceContainer';\nimport { HTMLUtilities } from '../utilities/HTMLUtilities';\nimport { ViewManager } from './ViewManager';\nimport { ViewState } from './ViewState';\n\nclass ApplicationView extends ViewState\n{\n constructor({ name, url, container })\n {\n super(name);\n\n this.container = container;\n this.url = url;\n\n let transition_data = ResourceContainer.get(`${name}_data`);\n\n transition_data = transition_data || {\n animation_tracks: [],\n triggers: []\n };\n\n const transitions = [\n {\n to: name,\n data: transition_data\n }\n ];\n\n ViewManager.register_view(this);\n ViewManager.add_transitions(transitions);\n }\n\n show()\n {\n this.container.classList.add('before_enter');\n this.container.classList.remove('before_exit');\n this.container.classList.remove('hidden');\n }\n\n on_enter()\n {\n this.container.classList.remove('before_enter');\n this.container.classList.remove('before_exit');\n this.container.classList.remove('hidden');\n }\n\n before_exit()\n {\n this.container.classList.add('before_exit');\n this.container.classList.remove('before_enter');\n this.container.classList.remove('hidden');\n }\n\n hide()\n {\n this.container.classList.add('hidden');\n this.container.classList.remove('before_enter');\n this.container.classList.remove('before_exit');\n }\n\n load_html_images()\n {\n HTMLUtilities.load_images(this.container);\n }\n\n load_html_videos()\n {\n HTMLUtilities.load_videos(this.container);\n }\n\n set_opacity(current_state_data)\n {\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\n }\n}\n\nexport { ApplicationView };\n","class BaseApplication\n{\n on_post_start()\n {}\n\n on_enter()\n {}\n\n on_exit()\n {}\n\n before_update()\n {}\n\n update()\n {}\n\n fixed_update()\n {}\n\n on_post_render()\n {}\n\n on_pre_render()\n {}\n\n on_frame_end()\n {}\n}\n\nexport { BaseApplication };\n","class BaseRender\n{\n constructor()\n {\n\n }\n\n render()\n {\n\n }\n\n on_enter(context, renderer)\n {\n\n }\n\n on_exit(context, renderer)\n {\n\n }\n\n resize()\n {\n\n }\n\n dispose()\n {\n\n }\n}\n\nexport { BaseRender };\n","import basic_vert from '../shaders/basic_color/basic_color.vert';\nimport basic_frag from '../shaders/basic_color/basic_color.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\n\nclass BaseShaderMaterial extends ShaderMaterial\n{\n constructor(vert, frag, uniforms)\n {\n super({\n vertexShader: vert || basic_vert,\n fragmentShader: frag || basic_frag,\n uniforms: uniforms || {\n _Color: { value: new Color('#FF0000') }\n }\n });\n }\n}\n\nexport { BaseShaderMaterial };\n","import vert from '../shaders/copy/copy.vert';\nimport frag from '../shaders/copy/copy.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { Vector2 } from 'three';\nimport { NoBlending } from 'three';\nimport { AlwaysDepth } from 'three';\n\nclass BlitMaterial extends ShaderMaterial\n{\n constructor(frag_shader, vert_shader, defines)\n {\n super({\n uniforms: {\n _MainTex: { value: null },\n _Resolution: { value: new Vector2(0, 0) },\n _TargetResolution: { value: new Vector2(0, 0) }\n },\n defines: defines || {},\n vertexShader: vert_shader || vert,\n fragmentShader: frag_shader || frag,\n depthWrite: false,\n blending: NoBlending,\n depthTest: false,\n depthFunc: AlwaysDepth\n });\n }\n}\n\nexport { BlitMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/add/add.frag';\n\nclass AddMaterial extends BlitMaterial\n{\n constructor(nMips)\n {\n super(frag);\n\n this.uniforms._SecondTex = { value: undefined };\n }\n\n set_add_texture(tex)\n {\n this.uniforms._SecondTex.value = tex;\n }\n}\n\nexport { AddMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/gaussian_blur/unreal_bloom_compose.frag';\n\nimport { Color } from 'three';\nclass UnrealBloomComposeMaterial extends BlitMaterial\n{\n constructor(nMips)\n {\n super(frag, undefined, {\n NUM_MIPS: nMips\n });\n this.uniforms._MainTex = { value: undefined };\n this.uniforms._BlurredTex = { value: undefined };\n this.uniforms._BloomStrength = { value: 1 };\n\n this.uniforms.blurTexture1 = { value: null };\n this.uniforms.blurTexture2 = { value: null };\n this.uniforms.blurTexture3 = { value: null };\n this.uniforms.blurTexture4 = { value: null };\n this.uniforms.blurTexture5 = { value: null };\n\n this.uniforms.bloomStrength = { value: 1.0 };\n this.uniforms.bloomFactors = { value: [1.0, 0.8, 0.6, 0.4, 0.2] };\n this.uniforms.bloomRadius = { value: 0.0 };\n\n const bloomTintColors = [\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF'),\n new Color('#FFFFFF')\n ];\n\n this.uniforms.bloomTintColors = { value: bloomTintColors };\n }\n\n set_RT_0(rt)\n {\n this.uniforms.blurTexture1.value = rt;\n }\n\n set_RT_1(rt)\n {\n this.uniforms.blurTexture2.value = rt;\n }\n\n set_RT_2(rt)\n {\n this.uniforms.blurTexture3.value = rt;\n }\n\n set_RT_3(rt)\n {\n this.uniforms.blurTexture4.value = rt;\n }\n\n set_RT_4(rt)\n {\n this.uniforms.blurTexture5.value = rt;\n }\n\n set_bloom_strength(value)\n {\n this.uniforms.bloomStrength.value = value;\n }\n\n set_bloom_radius(value)\n {\n this.uniforms.bloomRadius.value = value;\n }\n\n set_tint_color_0(col_string)\n {\n this.uniforms.bloomTintColors.value[0].set(col_string);\n }\n\n set_tint_color_1(col_string)\n {\n this.uniforms.bloomTintColors.value[1].set(col_string);\n }\n\n set_tint_color_2(col_string)\n {\n this.uniforms.bloomTintColors.value[2].set(col_string);\n }\n\n set_tint_color_3(col_string)\n {\n this.uniforms.bloomTintColors.value[3].set(col_string);\n }\n\n set_tint_color_4(col_string)\n {\n this.uniforms.bloomTintColors.value[4].set(col_string);\n }\n}\n\nexport { UnrealBloomComposeMaterial };\n","class CameraManager\n{\n init()\n {\n this._current = undefined;\n // VR Spectator\n this._spectator = undefined;\n }\n\n set current(camera)\n {\n this._current = camera;\n }\n\n get current()\n {\n return this._current;\n }\n\n set spectator(camera)\n {\n this._spectator = camera;\n }\n\n get spectator()\n {\n return this._spectator;\n }\n}\n\nconst camera_manager = new CameraManager();\nexport { camera_manager as CameraManager };\n","class Capabilities\n{\n init()\n {\n this.max_anisotropy = 0;\n this.vertex_texture_sampler_available = false;\n this.fp_textures_available = false;\n }\n}\n\nconst capabilities = new Capabilities();\nexport { capabilities as Capabilities };\n","import { CanvasTexture } from 'three';\nimport { Vector2 } from 'three';\nimport { UVMapping } from 'three';\nimport { ClampToEdgeWrapping } from 'three';\nimport { NearestFilter } from 'three';\n\nclass CanvasDrawer\n{\n constructor(uses_dynamic_font)\n {\n this.uses_dynamic_font = uses_dynamic_font;\n this.__textHeight = null;\n\n this.canvas = document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n }\n\n getFontHeight(fontStyle = 'Arial')\n {\n if (this.__textHeight == null || this.uses_dynamic_font)\n {\n const body = document.getElementsByTagName('body')[0];\n const dummy = document.createElement('div');\n const dummyText = document.createTextNode('MÉqgOLAKTAL');\n dummy.appendChild(dummyText);\n dummy.setAttribute('style', `font:${fontStyle};position:absolute;top:0;left:0`);\n body.appendChild(dummy);\n this.__textHeight = dummy.offsetHeight;\n body.removeChild(dummy);\n }\n return this.__textHeight;\n }\n\n get_text_size(text, font = '24px Arial')\n {\n const size = new Vector2();\n this.ctx.font = font;\n size.x = Math.ceil(this.ctx.measureText(text).width);\n size.y = Math.ceil(this.getFontHeight(font));\n return size;\n }\n\n draw_canvas(text, ctxOptions = {})\n {\n ctxOptions.font = ctxOptions.font || '24px Arial';\n ctxOptions.font_color = ctxOptions.font_color || '#000000';\n\n this.__draw(text, ctxOptions, this.canvas, this.ctx);\n return this.canvas;\n }\n\n draw_on_texture(text, ctxOptions)\n {\n const canvas = this.draw_canvas(text, ctxOptions);\n const canvas_texture = new CanvasTexture(canvas, UVMapping,\n ClampToEdgeWrapping,\n ClampToEdgeWrapping,\n NearestFilter,\n NearestFilter);\n canvas_texture.generateMipMaps = false;\n canvas_texture.needsUpdate = true;\n\n return canvas_texture;\n }\n\n __draw(text, ctxOptions)\n {}\n\n roundRect(ctx, x, y, width, height, radius, fill, stroke)\n {\n if (typeof stroke === 'undefined')\n {\n stroke = true;\n }\n if (typeof radius === 'undefined')\n {\n radius = 5;\n }\n if (typeof radius === 'number')\n {\n radius = { tl: radius, tr: radius, br: radius, bl: radius };\n }\n else\n {\n const defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\n for (const side in defaultRadius)\n {\n radius[side] = radius[side] || defaultRadius[side];\n }\n }\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n if (fill)\n {\n ctx.fill();\n }\n if (stroke)\n {\n ctx.stroke();\n }\n }\n}\n\nexport { CanvasDrawer };\n","/*\n\n A configuration class used as a singleton\n\n*/\n\nclass Configuration\n{\n init(parameters = {})\n {\n this.dpr = 1;\n\n this.app = {}; // for arbitrary use in end application\n }\n\n from_json(json)\n {\n\n }\n}\n\nconst configuration = new Configuration();\nexport { configuration as Configuration };\n","class Idle\n{\n constructor()\n {\n }\n\n get is_animating()\n {\n return false;\n }\n\n on_enter(view)\n {\n\n }\n\n update(view)\n {\n }\n\n on_exit(view)\n {\n\n }\n}\n\nexport { Idle };\n","import { Time } from '../../Time';\nimport { Idle } from './Idle';\n\nimport { OMath } from '../../utilities/OMath';\nclass Animating\n{\n constructor()\n {\n this.t = 0;\n this.easing_function_t = 0;\n }\n\n get is_animating()\n {\n return true;\n }\n\n on_enter(animator)\n {\n }\n\n update(animator)\n {\n this.t += Time.delta_time / animator.duration;\n\n this.easing_function_t = animator.easing_function(this.t);\n this.easing_function_t = OMath.clamp(this.easing_function_t, 0, 1);\n\n animator.set_property_value(OMath.lerp(animator.from, animator.to, this.easing_function_t));\n\n if (this.easing_function_t >= 0.9999)\n {\n animator.set_property_value(animator.to);\n\n animator.set_current_state(new Idle());\n animator.finished_callback(animator);\n }\n }\n\n on_exit(view)\n {\n\n }\n}\n\nexport { Animating };\n","import { Animating } from './css_animator_states/Animating';\nimport { Idle } from './css_animator_states/Idle';\nimport { EasingFunctions } from '../utilities/EasingFunctions';\n\nclass CSSAnimator\n{\n constructor({\n element,\n css_property,\n from = 0,\n to = 1,\n duration = 1,\n value_prefix = '',\n value_suffix = '',\n easing_function = EasingFunctions.ease_in_out_cubic,\n finished_callback = () =>\n {}\n })\n {\n this.element = element;\n this.css_property = css_property;\n this.from = from;\n this.to = to;\n this.value_prefix = value_prefix;\n this.value_suffix = value_suffix;\n this.duration = duration;\n this.easing_function = easing_function;\n this.finished_callback = finished_callback;\n\n this.current_state = new Idle();\n }\n\n animate()\n {\n this.set_current_state(new Animating());\n }\n\n stop()\n {\n this.set_current_state(new Idle());\n }\n\n set_property_value(value)\n {\n this.element.style[this.css_property] = `${this.value_prefix}${value}${this.value_suffix}`;\n }\n\n update()\n {\n this.current_state.update(this);\n }\n\n get is_animating()\n {\n return this.current_state.is_animating;\n }\n\n set_current_state(state)\n {\n this.current_state.on_exit(this);\n this.current_state = state;\n this.current_state.on_enter(this);\n }\n}\n\nexport { CSSAnimator };\n","\nimport { Object3D } from 'three';\nimport { LineBasicMaterial } from 'three';\nimport { AlwaysDepth } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Vector3 } from 'three';\nimport { Line } from 'three';\n\nclass AxisHelper extends Object3D\n{\n constructor(scale = 1.0)\n {\n super();\n\n const blue_points = [];\n blue_points.push(new Vector3(0, 0, 0));\n blue_points.push(new Vector3(0, 0, 1000));\n\n const blue_axis_mat = new LineBasicMaterial({ color: 0x4444ff, depthFunc: AlwaysDepth });\n const blue_axis_geo = new BufferGeometry().setFromPoints(blue_points);\n const blue_axis_line = new Line(blue_axis_geo, blue_axis_mat);\n blue_axis_line.renderOrder = 50000;\n\n const green_points = [];\n green_points.push(new Vector3(0, 0, 0));\n green_points.push(new Vector3(0, 1000, 0));\n\n const green_axis_mat = new LineBasicMaterial({ color: 0x44ff44, depthFunc: AlwaysDepth });\n const green_axis_geo = new BufferGeometry().setFromPoints(green_points);\n const green_axis_line = new Line(green_axis_geo, green_axis_mat);\n green_axis_line.renderOrder = 50000;\n\n const red_points = [];\n red_points.push(new Vector3(0, 0, 0));\n red_points.push(new Vector3(1000, 0, 0));\n\n const red_axis_mat = new LineBasicMaterial({ color: 0xff4444, depthFunc: AlwaysDepth });\n const red_axis_geo = new BufferGeometry().setFromPoints(red_points);\n const red_axis_line = new Line(red_axis_geo, red_axis_mat);\n red_axis_line.renderOrder = 50000;\n\n this.renderOrder = 100000;\n\n this.add(blue_axis_line);\n this.add(green_axis_line);\n this.add(red_axis_line);\n\n this.scale.set(scale, scale, scale);\n }\n\n update()\n {\n }\n\n dispose()\n {\n }\n}\n\nexport { AxisHelper };\n","import { Scene } from 'three';\n\nclass SceneManager\n{\n init()\n {\n this._current = new Scene();\n this._current.name = 'default_scene';\n }\n\n add_scene(name)\n {\n\n }\n\n get current()\n {\n return this._current;\n }\n\n set current(scene)\n {\n this._current = scene;\n }\n\n dispose()\n {\n this.current.traverse(child =>\n {\n if (child.geometry)\n {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n\n while (this.current.children.length > 0)\n {\n this.current.remove(this.current.children[0]);\n }\n }\n}\n\nconst scene_manager = new SceneManager();\nexport { scene_manager as SceneManager };\n","\nimport { Vector3, Mesh } from 'three';\nimport { BoxGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nclass Cube extends Mesh\n{\n constructor(size, segments, color)\n {\n size = size || new Vector3(1, 1, 1);\n segments = segments || new Vector3(1, 1, 1);\n color = color || 0xff0000;\n const geometry = new BoxGeometry(size.x, size.y, size.z, segments.x, segments.y, segments.z);\n const material = new MeshBasicMaterial({ color: color });\n super(geometry, material);\n }\n}\n\nexport { Cube };\n","import { Mesh } from 'three';\nimport { SphereBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nclass Sphere extends Mesh\n{\n constructor(radius, color)\n {\n color = color || '#FF0000';\n radius = radius || 1;\n const geometry = new SphereBufferGeometry(radius, 64, 64);\n const material = new MeshBasicMaterial({ color: color });\n super(geometry, material);\n }\n}\n\nexport { Sphere };\n","import { CylinderBufferGeometry } from 'three';\nimport { ConeBufferGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { Vector3, Mesh } from 'three';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nclass Arrow extends Mesh\n{\n constructor(color, length, dir)\n {\n color = color || '#FF0000';\n length = length || 1;\n\n const cone_height = 0.4;\n const cylinder_height = length - cone_height;\n const cylinder_geo = new CylinderBufferGeometry(0.01, 0.01, cylinder_height, 32);\n cylinder_geo.translate(0, cylinder_height / 2, 0);\n\n const cone_geometry = new ConeBufferGeometry(0.1, cone_height, 32);\n cone_geometry.translate(0, cylinder_height + cone_height / 2, 0);\n\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries([cylinder_geo, cone_geometry]);\n buffer_geometry.rotateX(3.14 / 2);\n\n const material = new MeshBasicMaterial({ color: color });\n super(buffer_geometry, material);\n\n if (dir)\n {\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\n }\n\n this._dir = dir;\n }\n\n set dir(dir)\n {\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\n this._dir = dir;\n }\n\n get dir()\n {\n return this._dir;\n }\n\n set length(value)\n {\n this.scale.z = value;\n }\n\n get length()\n {\n return this.scale.z;\n }\n}\n\nexport { Arrow };\n","import { Vector2 } from 'three';\n\nclass OScreen\n{\n init()\n {\n this.width = 1;\n this.height = 1;\n\n this.position = new Vector2();\n\n this.render_width = 1;\n this.render_height = 1;\n this.width_height = new Vector2(this.width, this.height);\n\n this.dpr = 1;\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\n }\n\n update_position(x, y)\n {\n this.position.set(x, y);\n }\n\n update()\n {\n this.size_changed = false;\n }\n\n update_size(width, height)\n {\n this.width = width;\n this.height = height;\n\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\n\n this.width_height.x = width;\n this.width_height.y = height;\n\n this.render_width = width * this.dpr;\n this.render_height = height * this.dpr;\n\n this.size_changed = true;\n }\n\n apply_pixel_density_v2(vector2)\n {\n vector2.multiplyScalar(1 / this.dpr);\n\n return vector2;\n }\n\n apply_pixel_density(value)\n {\n return value * (1 / this.dpr);\n }\n\n get_pixel_size()\n {\n return this.pixel_size;\n }\n\n get aspect_ratio()\n {\n return this.width / this.height;\n }\n\n get portrait()\n {\n return this.width < this.height;\n }\n}\n\nconst oscreen = new OScreen();\nexport { oscreen as OScreen };\n","import { BaseShaderMaterial } from './BaseShaderMaterial';\nimport { Vector2 } from 'three';\nclass ScreenSpaceTextureMaterial extends BaseShaderMaterial\n{\n constructor(x, y, w, h)\n {\n const vert = `\n uniform vec2 _ScreenSpacePosition;\n uniform vec2 _ScreenSize;\n uniform vec2 _TextureSize;\n varying vec2 vUv;\n void main()\n {\n vec2 pos = uv * vec2(_TextureSize.x / _ScreenSize.x, _TextureSize.y / _ScreenSize.y);\n pos += vec2(_ScreenSpacePosition.x / _ScreenSize.x, _ScreenSpacePosition.y / _ScreenSize.y);\n\n pos.x = pos.x * 2.0 - 1.0;\n pos.y = pos.y * 2.0 - 1.0;\n\n gl_Position = vec4(pos, 0.0, 1.0);\n vUv = uv;\n }\n `;\n const frag = `\n uniform sampler2D _MainTex;\n varying vec2 vUv;\n\n void main()\n {\n gl_FragColor = texture2D(_MainTex, vUv);\n }\n `;\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSpacePosition: { value: new Vector2() },\n _ScreenSize: { value: new Vector2() },\n _TextureSize: { value: new Vector2() }\n });\n }\n\n set_position(x, y)\n {\n this.uniforms._ScreenSpacePosition.value.set(x, y);\n }\n\n set_texture(tex, w, h)\n {\n this.uniforms._MainTex.value = tex;\n this.uniforms._TextureSize.value.set(tex.image.width, tex.image.height);\n\n if (w !== undefined)\n {\n this.uniforms._TextureSize.value.x = w;\n }\n if (h !== undefined)\n {\n this.uniforms._TextureSize.value.y = h;\n }\n }\n\n set_screen_size(w, h)\n {\n this.uniforms._ScreenSize.value.set(w, h);\n }\n}\n\nexport { ScreenSpaceTextureMaterial };\n","import { Color } from 'three';\nimport { PerspectiveCamera as TPerspectiveCamera } from 'three';\n\nclass PerspectiveCamera extends TPerspectiveCamera\n{\n constructor(fov, aspect, near, far)\n {\n super(fov, aspect, near, far);\n\n this.clear_color = new Color('#000000');\n this.clear_alpha = 1;\n }\n\n copy(camera)\n {\n super.copy(camera);\n this.clear_color.copy(camera.clear_color);\n this.clear_alpha = camera.clear_alpha;\n return this;\n }\n}\n\nexport { PerspectiveCamera };\n","import { AxisHelper } from './components/AxisHelper';\n\nimport { SceneManager } from './SceneManager';\nimport { Cube } from './primitives/Cube';\nimport { Sphere } from './primitives/Sphere';\nimport { Arrow } from './primitives/Arrow';\nimport { OScreen } from './OScreen';\nimport { ScreenSpaceTextureMaterial } from './materials/ScreenSpaceTextureMaterial';\nimport { PerspectiveCamera } from './PerspectiveCamera';\n\nimport { Vector3 } from 'three';\nimport { LineBasicMaterial } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Line } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Vector4 } from 'three';\nimport { Mesh } from 'three';\nimport { Box3 } from 'three';\nimport { Box3Helper } from 'three';\nimport { Scene } from 'three';\nimport { CatmullRomCurve3 } from 'three';\nimport { SphereGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nimport basic_color_vert from './shaders/basic_color/basic_color.vert';\nimport basic_color_frag from './shaders/basic_color/basic_color.frag';\nimport { CameraManager } from './CameraManager';\n\nclass Debug\n{\n init()\n {\n this.Vector3_one = new Vector3(1, 1, 1);\n this.Vector3_zero = new Vector3(0, 0, 0);\n this.canvas_renderer = undefined;\n\n this.display_texture_meshes = [];\n\n this.ctx = undefined;\n this.scene = new Scene();\n this.camera = new PerspectiveCamera(60, OScreen.aspect_ratio, 0.1, 1000);\n this.camera.clear_alpha = 0;\n }\n\n draw_arrow(origin, dir, color = 0xff0000)\n {\n const arrow = new Arrow(color, dir.length(), dir.clone().normalize());\n arrow.position.copy(origin);\n this.scene.add(arrow);\n return arrow;\n }\n\n draw_axis()\n {\n const axis = new AxisHelper();\n this.scene.add(axis);\n return axis;\n }\n\n set_debug_RT(RT)\n {\n this.rt_debug = RT;\n }\n\n draw_rectangle(position_2d, width, height, color)\n {\n width = width || 100;\n height = height || 100;\n this.ctx.fillStyle = color || 'rgba(255, 0, 0, 1)';\n this.ctx.fillRect(position_2d.x - width / 2,\n (this.ctx.canvas.height - position_2d.y) - height / 2, width, height);\n }\n\n clear()\n {\n if (this.ctx)\n {\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n }\n }\n\n draw_line_2D(from, to, color)\n {\n this.ctx.strokeStyle = color || 'rgba(255, 0, 0, 1)';\n this.ctx.beginPath();\n this.ctx.moveTo(from.x, from.y);\n this.ctx.lineTo(to.x, to.y);\n this.ctx.closePath();\n this.ctx.stroke();\n }\n\n draw_line(points, color = 0xff0000)\n {\n const material = new LineBasicMaterial({\n color: color\n });\n\n const geometry = new BufferGeometry().setFromPoints(points);\n\n const line = new Line(geometry, material);\n line.frustumCulled = false;\n this.scene.add(line);\n return line;\n }\n\n draw_cube(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n pos = pos || new Vector3();\n\n const cube = new Cube(new Vector3(size, size, size), undefined, color);\n cube.position.copy(pos);\n this.scene.add(cube);\n return cube;\n }\n\n draw_oriented_cube(from, to, height = 1, color = '#FF0000', depth = 0.1)\n {\n const size = from.distanceTo(to);\n const cube = new Cube(new Vector3(depth, height, size), undefined, color);\n\n const center = to.clone().sub(from).multiplyScalar(0.5);\n const forward_dir = center.clone().normalize();\n center.add(from);\n\n cube.position.copy(center);\n\n // let up = new Vector3(0, 1, 0);\n // let forward = forward_dir.clone();\n // let right = forward.clone().cross(up);\n\n // cube.quaternion.setFromRotationMatrix(new Matrix4().makeBasis(right,up,forward));\n cube.quaternion.setFromUnitVectors(new Vector3(0, 0, -1), forward_dir);\n\n this.scene.add(cube);\n return cube;\n }\n\n draw_plane(width, height, color)\n {\n const geometry = new PlaneGeometry(width, height);\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Vector4(0, 1, 0, 0.2) }\n },\n vertexShader: basic_color_vert,\n fragmentShader: basic_color_frag,\n transparent: true,\n depthWrite: false\n });\n\n const plane = new Mesh(geometry, material);\n plane.renderOrder = -10000;\n this.scene.add(plane);\n return plane;\n }\n\n draw_empty_cube(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n\n const box = new Box3().setFromCenterAndSize(new Vector3(), new Vector3(size, size, size));\n const helper = new Box3Helper(box, color);\n helper.position.copy(pos || new Vector3());\n return helper;\n }\n\n draw_sphere(pos, size, color)\n {\n size = size || 1;\n color = color || 0xff0000;\n pos = pos || new Vector3();\n\n const sphere = new Sphere(size, color);\n sphere.position.copy(pos);\n this.scene.add(sphere);\n return sphere;\n }\n\n draw_point_array(input_points, open = false, color = 0xff0000)\n {\n const catmull = new CatmullRomCurve3(input_points, open);\n catmull.updateArcLengths();\n const points = catmull.getSpacedPoints(200);\n const line_helper = this.draw_line(points, 0x00ff00);\n // line_helper.position.y = 1.5;\n return line_helper;\n }\n\n draw_sphere_helper(sphere, color)\n {\n color = color || 0xff0000;\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\n const material = new MeshBasicMaterial({ color: color });\n const sphere_mesh = new Mesh(geometry, material);\n sphere_mesh.position.copy(sphere.center);\n SceneManager.current.add(sphere_mesh);\n return sphere_mesh;\n }\n\n draw_math_sphere(sphere)\n {\n const geometry = new SphereGeometry(sphere.radius, 32, 32);\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Vector4(1, 0, 0, 0.2) }\n },\n vertexShader: basic_color_vert,\n fragmentShader: basic_color_frag,\n transparent: true\n });\n // var material = new MeshBasicMaterial( {color: 0xff0000, transparent = true} );\n const sphere1 = new Mesh(geometry, material);\n sphere1.position.copy(sphere.center);\n SceneManager.current.add(sphere1);\n }\n\n draw_bounding_box(bb)\n {\n const helper = new Box3Helper(bb, 0xffff00);\n SceneManager.current.add(helper);\n }\n\n draw_curve(curve, options)\n {\n const offset = new Vector3(0, 0, 0);\n if (options)\n {\n offset.y = options.offset || 0;\n }\n\n for (let i = 0; i < curve.length - 1; i++)\n {\n this.draw_line(curve[i].clone().add(offset), curve[i + 1].clone().add(offset));\n }\n }\n\n draw_texture(tex, w, h)\n {\n const mesh = new Mesh(new PlaneGeometry(1, 1), new ScreenSpaceTextureMaterial());\n this.display_texture_meshes.push(mesh);\n this.scene.add(mesh);\n\n mesh.material.set_texture(tex, w, h);\n return mesh;\n }\n\n render(graphics)\n {\n for (let i = 0; i < this.display_texture_meshes.length; i++)\n {\n this.display_texture_meshes[i].material.set_screen_size(OScreen.width, OScreen.height);\n }\n if (this.scene.children.length > 0)\n {\n graphics.render(this.scene, CameraManager.current);\n }\n }\n}\n\nconst debug = new Debug();\nexport { debug as Debug };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport { Scene } from 'three';\nimport { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { OrthographicCamera } from 'three';\n\nclass Blitter\n{\n constructor(renderer)\n {\n this.renderer = renderer;\n this._blit_scene = new Scene();\n this._blit_material = new BlitMaterial();\n this._blit_quad = new Mesh(\n new PlaneGeometry(1, 1), this._blit_material);\n this._blit_scene.add(this._blit_quad);\n this._blit_camera = new OrthographicCamera(-1, 1, 1, -1, -10000, 10000);\n }\n\n blit(src, dst)\n {\n this._blit_quad.material = this._blit_material;\n\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\n\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\n\n if (dst)\n {\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\n }\n else\n {\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\n }\n\n this.__render(dst);\n }\n\n material_pass(mat, dst)\n {\n this._blit_quad.material = mat;\n // this._blit_quad.material.uniforms._MainTex.value = undefined;\n // this._blit_quad.material.uniforms._Resolution.value.set(1, 1);\n\n this.__render(dst);\n }\n\n blit_with_material(src, dst, mat)\n {\n const src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\n const src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\n const src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\n\n this._blit_quad.material = mat;\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\n\n if (dst)\n {\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\n }\n else\n {\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\n }\n\n this.__render(dst);\n }\n\n blit_clear_with_material(dst_RT, mat)\n {\n this._blit_quad.material = mat;\n\n this.__render(dst_RT);\n }\n\n dispose()\n {\n this._blit_quad.geometry.dispose();\n this._blit_quad.material.dispose();\n }\n\n __render(RT)\n {\n RT = RT === undefined ? null : RT;\n\n const current_rt = this.renderer.getRenderTarget();\n\n this.renderer.setRenderTarget(RT === undefined ? null : RT);\n this.renderer.render(this._blit_scene, this._blit_camera);\n\n this.renderer.setRenderTarget(current_rt);\n }\n}\n\nexport { Blitter };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/clear/clear_depth_normal.frag';\n\nimport { Vector4 } from 'three';\n\nclass ClearDepthNormalMaterial extends BlitMaterial\n{\n constructor(clear_depth, clear_normal)\n {\n super(frag);\n this.uniforms._DepthNormal = { value: new Vector4(clear_depth, clear_normal.x, clear_normal.y, clear_normal.z) };\n }\n}\n\nexport { ClearDepthNormalMaterial };\n","import vert from '../shaders/depth_normals/depth_normals.vert';\nimport frag from '../shaders/depth_normals/depth_normals.frag';\n\nimport { ShaderMaterial } from 'three';\n\nclass DepthNormalMaterial extends ShaderMaterial\n{\n constructor()\n {\n super({\n uniforms: {\n _FarPlane: { value: 1 }\n },\n vertexShader: vert,\n fragmentShader: frag\n });\n }\n\n set far_plane(value)\n {\n this.uniforms._FarPlane.value = value;\n }\n\n get far_plane()\n {\n return this.uniforms._FarPlane.value;\n }\n}\n\nexport { DepthNormalMaterial };\n","import { CameraManager } from '../CameraManager';\nimport { OScreen } from '../OScreen';\n\nimport { ClearDepthNormalMaterial } from '../materials/ClearDepthNormalMaterial';\nimport { DepthNormalMaterial } from '../materials/DepthNormalMaterial';\n\nimport { WebGLRenderTarget } from 'three';\nimport { Vector3 } from 'three';\n\nclass DepthAndNormalsRenderer\n{\n constructor()\n {\n this.RT = new WebGLRenderTarget(OScreen.width, OScreen.height);\n\n this.clear_depth_normal_mat = new ClearDepthNormalMaterial(1, new Vector3(0, 0, 1));\n this.depth_normal_material = new DepthNormalMaterial();\n }\n\n render(graphics)\n {\n this.__resize_RT_if_necessary();\n\n graphics.clear(this.RT, undefined, true, true);\n\n graphics.blit_clear_with_material(this.RT, this.clear_depth_normal_mat);\n\n this.depth_normal_material.far_plane = CameraManager.current.far;\n\n graphics.render(undefined, undefined, this.RT, this.depth_normal_material);\n }\n\n __resize_RT_if_necessary()\n {\n if (this.RT.width !== OScreen.width || this.RT.height !== OScreen.height)\n {\n this.RT.setSize(OScreen.width, OScreen.height);\n }\n }\n\n get render_target()\n {\n return this.RT;\n }\n}\n\nexport { DepthAndNormalsRenderer };\n","import { CameraManager } from './CameraManager';\nimport { Capabilities } from './Capabilities';\nimport { Configuration } from './Configuration';\nimport { OScreen } from './OScreen';\nimport { SceneManager } from './SceneManager';\nimport { BaseRender } from './render_mode/BaseRender';\nimport { Blitter } from './render_utilities/Blitter';\nimport { DepthAndNormalsRenderer } from './render_utilities/DepthAndNormalsRenderer';\n\nimport {\n AlwaysDepth,\n FloatType,\n NearestFilter,\n NoBlending,\n NoColorSpace,\n RGBAFormat,\n ShaderMaterial,\n WebGLRenderTarget\n} from 'three';\n\nimport { WebGLRenderer } from 'three';\n\nclass Graphics\n{\n init(canvas, core_attributes, context_attributes, threejs_attributes)\n {\n this._renderer = undefined;\n this.blitter = undefined;\n this.canvas = undefined;\n this.no_render = undefined;\n this.current_render_mode = undefined;\n this.generateDepthNormalTexture = false;\n this.depth_and_normals_renderer = undefined;\n\n this.is_webgl2 = false;\n this.canvas_context = undefined;\n this.context_attributes = undefined;\n\n this.core_attributes = {\n force_webgl2: true,\n xr_enabled: false\n };\n\n this.context_attributes = {\n alpha: true,\n antialias: false,\n depth: true,\n desynchronized: false,\n failIfMajorPerformanceCaveat: false,\n powerPreference: 'high-performance',\n premultipliedAlpha: true,\n preserveDrawingBuffer: true,\n stencil: false\n };\n\n this.threejs_attributes = {\n logarithmicDepthBuffer: false\n };\n\n Object.assign(this.core_attributes, core_attributes);\n Object.assign(this.context_attributes, context_attributes);\n\n Object.assign(this.threejs_attributes, this.context_attributes);\n Object.assign(this.threejs_attributes, threejs_attributes);\n\n if (this.core_attributes.force_webgl2)\n {\n this.canvas_context = canvas.getContext('webgl2', this.context_attributes) ||\n canvas.getContext('webgl', this.context_attributes) ||\n canvas.getContext('experimental-webgl', this.context_attributes);\n }\n else\n {\n this.canvas_context = canvas.getContext('webgl', this.context_attributes) ||\n canvas.getContext('experimental-webgl', this.context_attributes);\n }\n\n this.is_webgl2 = this.canvas_context.constructor.name === 'WebGL2RenderingContext';\n\n // console.log(`Using WebGL ${this.is_webgl2 ? 2 : 1}`);\n\n this.threejs_attributes.canvas = canvas;\n this.threejs_attributes.context = this.canvas_context;\n\n this._renderer = new WebGLRenderer(this.threejs_attributes);\n\n if (this.core_attributes.xr_enabled)\n {\n this._renderer.xr.enabled = true;\n }\n else\n {\n this._renderer.autoClear = false;\n }\n\n this._renderer.setPixelRatio(1);\n\n OScreen.dpr = Configuration.dpr;\n\n if (!this.is_webgl2)\n {\n this._renderer.extensions.get('ANGLE_instanced_arrays');\n }\n\n this.blitter = new Blitter(this._renderer);\n\n this.canvas = this._renderer.domElement;\n\n this.no_render = new BaseRender();\n\n this.current_render_mode = this.no_render;\n Capabilities.max_anisotropy = this._renderer.capabilities.getMaxAnisotropy();\n Capabilities.vertex_texture_sampler_available = this._renderer.capabilities.maxVertexTextures > 0;\n Capabilities.fp_textures_available = this.is_floating_point_texture_available();\n\n this.generateDepthNormalTexture = false;\n\n this.depth_and_normals_renderer = new DepthAndNormalsRenderer();\n\n this.resize_observer = new ResizeObserver(this.on_resize.bind(this));\n this.resize_observer.observe(this.canvas);\n }\n\n get dom_element()\n {\n return this._renderer.domElement;\n }\n\n get depth_normals_RT()\n {\n return this.depth_and_normals_renderer.render_target;\n }\n\n set_state(new_state)\n {\n // console.log('VIEWAPI - map render mode switch to: ' + new_state.constructor.name);\n\n this.current_render_mode.on_exit(this, this._renderer);\n this.current_render_mode = new_state;\n this.current_render_mode.on_enter(this, this._renderer);\n }\n\n update()\n {\n if (this.generateDepthNormalTexture)\n {\n this.depth_and_normals_renderer.render(this);\n }\n\n this.__update_current_camera();\n\n if (CameraManager.current)\n {\n this.current_render_mode.render();\n }\n\n OScreen.update();\n }\n\n __update_current_camera()\n {\n if (CameraManager.current)\n {\n CameraManager.current.aspect = OScreen.aspect_ratio;\n CameraManager.current.updateProjectionMatrix();\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n }\n }\n\n render(scene, camera, RT, override_mat)\n {\n this.__apply_override_material(scene, override_mat);\n\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\n this._renderer.render(scene || SceneManager.current,\n camera || CameraManager.current);\n\n this.__apply_override_material(scene, undefined);\n }\n\n render_scene(scene)\n {\n if (scene.on_pre_render)\n {\n scene.on_pre_render();\n }\n\n if (scene.render)\n {\n scene.render();\n }\n else\n {\n this.render(scene, undefined);\n }\n\n if (scene.on_post_render)\n {\n scene.on_post_render();\n }\n }\n\n __apply_override_material(scene, mat)\n {\n mat = mat === undefined ? null : mat;\n if (scene)\n {\n scene.overrideMaterial = mat;\n }\n else\n {\n SceneManager.current.overrideMaterial = mat;\n }\n }\n\n readback_RT(RT, buffer)\n {\n this._renderer.readRenderTargetPixels(RT, 0, 0, RT.width, RT.height, buffer);\n }\n\n clear(RT, camera, clear_depth, clear_stencil)\n {\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\n\n if (camera)\n {\n this._renderer.setClearColor(camera.clear_color, camera.clear_alpha);\n }\n\n this._renderer.clear(!!camera, // clear color\n !!clear_depth,\n !!clear_stencil);\n }\n\n on_resize(entries)\n {\n for (const entry of entries)\n {\n OScreen.dpr = Configuration.dpr;\n OScreen.update_position(entry.contentRect.x, entry.contentRect.y);\n OScreen.update_size(entry.contentRect.width, entry.contentRect.height);\n\n this.canvas.width = OScreen.render_width;\n this.canvas.height = OScreen.render_height;\n\n this._renderer.setViewport(0, 0, OScreen.render_width, OScreen.render_height);\n\n this.__update_current_camera();\n }\n }\n\n material_pass(mat, dst)\n {\n this.blitter.material_pass(mat, dst);\n }\n\n blit(src_RT, dst_RT, mat)\n {\n if (mat)\n {\n this.blitter.blit_with_material(src_RT, dst_RT, mat);\n }\n else\n {\n this.blitter.blit(src_RT, dst_RT);\n }\n }\n\n blit_clear_with_material(dst_RT, mat)\n {\n this.blitter.blit_clear_with_material(dst_RT, mat);\n }\n\n take_screenshot(blob_callback, width = OScreen.width, height = OScreen.height)\n {\n // const ctx = this;\n\n const old_width = OScreen.width;\n const old_height = OScreen.height;\n\n const new_width = width;\n const new_height = height;\n\n const tile_width = 1024;\n const tile_height = 1024;\n\n const divisions_x = parseInt(Math.ceil(new_width / tile_width));\n const divisions_y = parseInt(Math.ceil(new_height / tile_height));\n\n OScreen.update_size(tile_width, tile_height);\n const old_dpr = this._renderer.getPixelRatio();\n this._renderer.setPixelRatio(1);\n\n this._renderer.setSize(tile_width, tile_height, false);\n\n const canvas_2d = document.createElement('canvas');\n const ctx_2D = canvas_2d.getContext('2d');\n\n ctx_2D.canvas.width = new_width;\n ctx_2D.canvas.height = new_height;\n\n CameraManager.current.aspect = OScreen.aspect_ratio;\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n\n for (let x = 0; x < divisions_x; x++)\n {\n for (let y = 0; y < divisions_y; y++)\n {\n CameraManager.current.setViewOffset(new_width, new_height,\n OScreen.width * x, OScreen.height * y,\n OScreen.width, OScreen.height);\n this.current_render_mode.render();\n\n ctx_2D.drawImage(this._renderer.domElement, OScreen.width * x, OScreen.height * y);\n }\n }\n\n // transform the result canvas into a blob\n // } from them the callback turns into a ULR and download it\n ctx_2D.canvas.toBlob(blob_callback, 'image/png;base64;');\n\n CameraManager.current.clearViewOffset();\n\n OScreen.update_size(old_width, old_height);\n this._renderer.setPixelRatio(old_dpr);\n this._renderer.setSize(old_width, old_height, false);\n\n CameraManager.current.aspect = OScreen.aspect_ratio;\n CameraManager.current.updateMatrix();\n CameraManager.current.updateMatrixWorld(true);\n }\n\n download_screenshot(blob)\n {\n const link = document.createElement('a');\n link.download = 'Snapshot.png';\n\n link.href = URL.createObjectURL(blob);\n link.click();\n\n link.onclick = function()\n {\n requestAnimationFrame(function()\n {\n URL.revokeObjectURL(link.href);\n });\n link.removeAttribute('href');\n };\n }\n\n dispose()\n {\n this._renderer.dispose();\n this.current_render_mode.dispose();\n this.blitter.dispose();\n }\n\n is_floating_point_texture_available()\n {\n const RT = new WebGLRenderTarget(1, 1, {\n minFilter: NearestFilter,\n magFilter: NearestFilter,\n format: RGBAFormat,\n colorSpace: NoColorSpace,\n type: FloatType,\n stencilBuffer: false,\n depthBuffer: false\n });\n\n const vert = `\n void main()\n {\n gl_Position = vec4(uv * 2.0 - 1.0, 1.0, 1.0);\n }\n `;\n const frag = `\n void main()\n {\n gl_FragColor = vec4(0.0, 4865.35, 0.0, 1.0);\n }\n `;\n\n const mat = new ShaderMaterial({\n vertexShader: vert,\n fragmentShader: frag,\n depthWrite: false,\n blending: NoBlending,\n depthTest: false,\n depthFunc: AlwaysDepth\n });\n\n this.material_pass(mat, RT);\n\n const output = new Float32Array(4);\n this._renderer.readRenderTargetPixels(RT, 0, 0, 1, 1, output);\n\n return Math.abs(output[1] - 4865.35) < 0.001;\n }\n}\n\nconst graphics = new Graphics();\nexport { graphics as Graphics };\n","import frag from '../shaders/normal/normal.frag';\nimport vert from '../shaders/normal/normal.vert';\n\nimport { ShaderMaterial } from 'three';\n\nclass NormalMaterial extends ShaderMaterial\n{\n constructor()\n {\n super({\n uniforms: {\n },\n vertexShader: vert,\n fragmentShader: frag\n });\n }\n}\n\nexport { NormalMaterial };\n","import { CameraManager } from '../CameraManager';\nimport { SceneManager } from '../SceneManager';\nimport { BaseRender } from '../render_mode/BaseRender';\nimport { Graphics } from '../Graphics';\nimport { NormalMaterial } from '../materials/NormalMaterial';\n\nclass DebugNormalsRender extends BaseRender\n{\n constructor()\n {\n super();\n }\n\n render()\n {\n Graphics.clear(undefined, CameraManager.current, true, true);\n\n Graphics.render(SceneManager.current, CameraManager.current, undefined, new NormalMaterial());\n }\n}\n\nexport { DebugNormalsRender };\n","class KeyboardInput\n{\n init(container)\n {\n this.ctrlz_pressed = false;\n this.ctrlz_fired = false;\n\n this.keys = {};\n this.keys_keys = [];\n this.container = container;\n\n this.container.addEventListener('keydown', this.on_key_down.bind(this), false);\n this.container.addEventListener('keyup', this.on_key_up.bind(this), false);\n }\n\n on_key_down(e)\n {\n if (e.keyCode === 90 && e.ctrlKey && !this.ctrlz_fired)\n {\n this.ctrlz_pressed = true;\n this.ctrlz_fired = true;\n }\n\n if (e.code)\n {\n this.press_key(e.code);\n }\n }\n\n on_key_up(e)\n {\n this.release_key(e.code);\n }\n\n clear()\n {\n this.ctrlz_pressed = false;\n\n for (let i = 0; i < this.keys_keys.length; i++)\n {\n this.keys[this.keys_keys[i]].pressed = false;\n this.keys[this.keys_keys[i]].released = false;\n }\n }\n\n release_key(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n key.fired = false;\n key.down = false;\n key.released = true;\n }\n }\n\n release_keys()\n {\n this.ctrlz_fired = false;\n\n for (let i = 0; i < this.keys_keys.length; i++)\n {\n this.keys[this.keys_keys[i]].fired = false;\n this.keys[this.keys_keys[i]].down = false;\n }\n }\n\n press_key(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n if (key.down === false)\n {\n key.pressed = true;\n }\n key.down = true;\n key.fired = true;\n }\n }\n\n is_key_pressed(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.pressed;\n }\n return false;\n }\n\n is_key_down(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.down;\n }\n return false;\n }\n\n is_key_released(key_name)\n {\n const key = this.keys[key_name];\n if (key)\n {\n return key.released;\n }\n\n return false;\n }\n\n register_key(key)\n {\n this.keys[key] =\n {\n key_name: key,\n pressed: false,\n down: false,\n fired: false\n };\n\n this.keys_keys = Object.keys(this.keys);\n }\n\n unregister_key(key_name)\n {\n delete this.keys[key_name];\n }\n\n dispose()\n {\n this.container.removeEventListener('keydown', this.on_key_down.bind(this), false);\n this.container.removeEventListener('keyup', this.on_key_up.bind(this), false);\n }\n}\n\nexport { KeyboardInput };\n","\nclass OS\n{\n init()\n {\n this.operating_systems = {\n ANDROID: 'android',\n IOS: 'ios',\n LINUX: 'linux',\n MAC: 'mac',\n WINDOWS: 'windows'\n };\n\n this.is_mobile = !!(navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/));\n this.is_ipad = !!(navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2);\n this.is_ios = !!navigator.userAgent.match(/(iPhone|iPod|iPad)/) || this.is_ipad;\n\n this.is_android = this.get_os() === this.operating_systems.ANDROID;\n this.is_linux = this.get_os() === this.operating_systems.LINUX;\n this.is_mac = this.get_os() === this.operating_systems.MAC;\n this.is_windows = this.get_os() === this.operating_systems.WINDOWS;\n }\n\n get_os()\n {\n const userAgent = window.navigator.userAgent;\n const platform = window.navigator.platform;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os = null;\n\n if (macosPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.MAC;\n }\n else if (iosPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.IOS;\n }\n else if (windowsPlatforms.indexOf(platform) !== -1)\n {\n os = this.operating_systems.WINDOWS;\n }\n else if (/Android/.test(userAgent))\n {\n os = this.operating_systems.ANDROID;\n }\n else if (!os && /Linux/.test(platform))\n {\n os = this.operating_systems.LINUX;\n }\n\n return os;\n }\n}\n\nconst os = new OS();\nexport { os as OS };\n","import { Vector3 } from 'three';\n\nclass ReflectionPlaneContext\n{\n init()\n {\n this.target_geometry = undefined;\n this.target_position = new Vector3();\n }\n\n set_target_geometry(geometry)\n {\n this.target_geometry = geometry;\n }\n}\n\nconst reflection_plane_context = new ReflectionPlaneContext();\nexport { reflection_plane_context as ReflectionPlaneContext };\n","import { Vector2 } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Mesh } from 'three';\nimport { DataTexture } from 'three';\nimport { RGBAFormat } from 'three';\nimport { RGBFormat } from 'three';\nimport { FloatType } from 'three';\n\nclass GeometryBatch\n{\n constructor(geometry, batch_width)\n {\n this.geometry = geometry;\n\n this.material = undefined;\n this.uniforms = {};\n this.batch_width = batch_width;\n\n this.data_textures = [];\n\n this.object_names = undefined;\n\n this.zero_offset = new Vector2();\n this.write_offset = new Vector2();\n\n this.uniform_dirty_count = 0;\n\n this.tmp_uploaded_data_count = 0;\n }\n\n init(object_names, vert_shader, frag_shader)\n {\n this.material = new ShaderMaterial({\n uniforms: this.uniforms,\n vertexShader: vert_shader,\n fragmentShader: frag_shader\n });\n this.object_names = object_names;\n }\n\n add_global_uniform(name, data)\n {\n this.uniforms[name] = { value: data };\n this.material.needsUpdate = true;\n }\n\n set_global_uniform(name, data)\n {\n this.uniforms[name].value = data;\n }\n\n add_object_uniform_v3(uniform_name, default_value_v3)\n {\n const src_tex = this.__create_rgb_texture(this.batch_width);\n const dst_tex = this.__create_rgb_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgb_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v3)\n {\n this.__flood_data_texture_rgb(new_data_tex, default_value_v3);\n }\n }\n\n add_object_uniform_v4(uniform_name, default_value_v4)\n {\n const src_tex = this.__create_rgba_texture(this.batch_width);\n const dst_tex = this.__create_rgba_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgba_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v4)\n {\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\n }\n }\n\n add_object_uniform_v4_float(uniform_name, default_value_v4)\n {\n const src_tex = this.__create_rgba_float_texture(this.batch_width);\n const dst_tex = this.__create_rgba_float_texture(this.batch_width);\n const one_pixel_tex = this.__create_rgba_float_texture(1);\n\n const new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\n\n if (default_value_v4)\n {\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\n }\n }\n\n set_object_uniform_v3(object_name, uniform_name, vector3, use_r, use_g, use_b)\n {\n const obj_index = this.__get_object_index(object_name);\n const data_texture = this.__get_data_texture(uniform_name);\n\n this.__set_pixel_rgb(data_texture.src, obj_index, vector3, use_r, use_g, use_b);\n this.__set_pixel_rgb(data_texture.one_pixel, 0, vector3, use_r, use_g, use_b);\n\n data_texture.last_accessed_index = obj_index;\n\n data_texture.dirty_count++;\n }\n\n set_object_uniform_v4(object_name, uniform_name, vector4, use_r, use_g, use_b, use_a)\n {\n const obj_index = this.__get_object_index(object_name);\n const data_texture = this.__get_data_texture(uniform_name);\n\n this.__set_pixel_rgba(data_texture.src, obj_index, vector4, use_r, use_g, use_b, use_a);\n this.__set_pixel_rgba(data_texture.one_pixel, 0, vector4, use_r, use_g, use_b, use_a);\n data_texture.last_accessed_index = obj_index;\n\n data_texture.dirty_count++;\n }\n\n upload_texture_data(renderer, upload_budget)\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (upload_budget > 0 && this.data_textures[i].dirty_count > 0)\n {\n if (this.data_textures[i].dirty_count === 1)\n {\n this.__partial_texture_data_upload(renderer, this.data_textures[i]);\n }\n if (this.data_textures[i].dirty_count > 1)\n {\n this.__full_texture_data_upload(renderer, this.data_textures[i]);\n }\n\n this.data_textures[i].dirty_count = 0;\n\n upload_budget--;\n }\n }\n }\n\n get_uniform_dirty_count()\n {\n this.uniform_dirty_count = 0;\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (this.data_textures[i].dirty_count > 0)\n {\n this.uniform_dirty_count++;\n }\n }\n return this.uniform_dirty_count;\n }\n\n __full_texture_data_upload(renderer, texture_data)\n {\n // console.log(\"full texture update of\"+ texture_data.name);\n texture_data.dst.needsUpdate = true;\n renderer.copyTextureToTexture(\n this.zero_offset,\n texture_data.src,\n texture_data.dst\n );\n }\n\n __partial_texture_data_upload(renderer, texture_data)\n {\n // console.log(\"partial texture update\"+ texture_data.name);\n const index = texture_data.last_accessed_index;\n if (index === -1)\n {\n return;\n }\n\n this.write_offset.y = Math.floor(index / this.batch_width);\n this.write_offset.x = index - this.batch_width * this.write_offset.y;\n renderer.copyTextureToTexture(\n this.write_offset,\n texture_data.one_pixel,\n texture_data.dst\n );\n }\n\n get_mesh()\n {\n return new Mesh(this.geometry, this.material);\n }\n\n __set_pixel_rgb(data_texture, index, vector3, use_r, use_g, use_b)\n {\n if (use_r)\n {\n data_texture.image.data[index * 3 + 0] = vector3.x;\n }\n if (use_g)\n {\n data_texture.image.data[index * 3 + 1] = vector3.y;\n }\n if (use_b)\n {\n data_texture.image.data[index * 3 + 2] = vector3.z;\n }\n }\n\n __set_pixel_rgba(data_texture, index, vector4, use_r, use_g, use_b, use_a)\n {\n if (use_r)\n {\n data_texture.image.data[index * 4 + 0] = vector4.x;\n }\n if (use_g)\n {\n data_texture.image.data[index * 4 + 1] = vector4.y;\n }\n if (use_b)\n {\n data_texture.image.data[index * 4 + 2] = vector4.z;\n }\n if (use_a)\n {\n data_texture.image.data[index * 4 + 3] = vector4.w;\n }\n }\n\n __flood_data_texture_rgb(data_texture, v3)\n {\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\n {\n this.__set_pixel_rgb(data_texture.src, i, v3, true, true, true);\n data_texture.dirty_count++;\n }\n }\n\n __flood_data_texture_rgba(data_texture, v4)\n {\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\n {\n this.__set_pixel_rgba(data_texture.src, i, v4, true, true, true, true);\n data_texture.dirty_count++;\n }\n }\n\n __create_rgb_texture(width)\n {\n const data = new Uint8Array(3 * width * width);\n return new DataTexture(data, width, width, RGBFormat);\n }\n\n __create_rgba_texture(width)\n {\n const data = new Uint8Array(4 * width * width);\n return new DataTexture(data, width, width, RGBAFormat);\n }\n\n __create_rgba_float_texture(width)\n {\n const data = new Float32Array(4 * width * width);\n return new DataTexture(data, width, width, RGBAFormat, FloatType);\n }\n\n __get_data_texture(uniform_name)\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n if (this.data_textures[i].name === uniform_name)\n {\n return this.data_textures[i];\n }\n }\n console.error('Data texture ' + uniform_name + ' does not exist');\n return undefined;\n }\n\n __get_object_index(name)\n {\n for (let i = 0; i < this.object_names.length; i++)\n {\n if (this.object_names[i] === name)\n {\n return i;\n }\n }\n console.error('the name ' + name + ' is not contained in this batch');\n return undefined;\n }\n\n __add_data_texture(uniform_name, src_texture, dst_texture, one_pixel_text)\n {\n dst_texture.needsUpdate = true;\n\n this.data_textures.push({\n name: uniform_name,\n src: src_texture,\n dst: dst_texture,\n one_pixel: one_pixel_text,\n last_accessed_index: -1,\n dirty_count: 0\n });\n\n this.uniforms[uniform_name] = { value: dst_texture };\n return this.data_textures[this.data_textures.length - 1];\n }\n\n dispose()\n {\n for (let i = 0; i < this.data_textures.length; i++)\n {\n this.data_textures[i].src.dispose();\n this.data_textures[i].dst.dispose();\n this.data_textures[i].one_pixel.dispose();\n }\n }\n}\n\nexport { GeometryBatch };\n","import { GeometryBatch } from './GeometryBatch';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { BufferAttribute } from 'three';\nimport { OMath } from '../utilities/OMath';\n\nclass GeometryBatcher\n{\n init()\n {\n this.batches = [];\n }\n\n batch(buffer_geometries)\n {\n const attr_accessor_uvs = [];\n const texture_width = OMath.ceilPowerOfTwo(Math.sqrt(buffer_geometries.length));\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\n\n this.__init_uv_array(attr_accessor_uvs, texture_width);\n\n let uv_index = 0;\n\n for (let i = 0; i < buffer_geometries.length; i++)\n {\n const vertex_count = buffer_geometries[i].getAttribute('position').count;\n const y = Math.floor(i / texture_width);\n const x = i - texture_width * y;\n for (let count = 0; count < vertex_count; count++)\n {\n attr_accessor_uvs[uv_index] = (x / texture_width) + 0.5 / texture_width;\n attr_accessor_uvs[uv_index + 1] = (y / texture_width) + 0.5 / texture_width;\n uv_index += 2;\n }\n }\n\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_accessor_uvs), 2);\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(buffer_geometries);\n buffer_geometry.setAttribute('attr_accessor_uv', buffer_attribute);\n\n this.batches.push(new GeometryBatch(buffer_geometry, texture_width));\n return this.batches[this.batches.length - 1];\n }\n\n upload_texture_data(renderer)\n {\n for (let i = 0; i < this.batches.length; i++)\n {\n this.batches[i].upload_texture_data(renderer, 1);\n }\n }\n\n __init_uv_array(uvs, texture_width)\n {\n for (let i = 0; i < texture_width * texture_width * 2; i++)\n {\n uvs.push(0);\n }\n }\n}\n\nconst geometry_batcher = new GeometryBatcher();\nexport { geometry_batcher as GeometryBatcher };\n","import { CameraManager } from './CameraManager';\nimport { Graphics } from './Graphics';\n\nimport { Vector2 } from 'three';\nimport { Scene } from 'three';\nimport { OrthographicCamera } from 'three';\n\nclass UI\n{\n init(input)\n {\n this.input = input;\n this.ui_elements = [];\n this._tmp_normalized_pos = new Vector2();\n this.ss_scene = new Scene();\n this.ss_scene.matrixWorldAutoUpdate = false;\n this.ss_scene.frustumCulled = false;\n\n this.ws_scene = new Scene();\n this.ws_scene.matrixWorldAutoUpdate = false;\n this.ws_scene.frustumCulled = false;\n\n this.ss_camera = new OrthographicCamera(-1, 1, 1, -1, -100, 100);\n }\n\n delete_element(elem)\n {\n const index = this.ui_elements.indexOf(elem);\n if (index > -1)\n {\n this.ui_elements.splice(index, 1);\n }\n\n this.ss_scene.remove(elem);\n this.ws_scene.remove(elem);\n\n elem.dispose();\n }\n\n add_screen_space_element(elem)\n {\n this.ui_elements.push(elem);\n this.ss_scene.add(elem);\n\n elem.set_screen_space_coordinate_system();\n }\n\n add_world_space_element(elem)\n {\n this.ui_elements.push(elem);\n this.ws_scene.add(elem);\n\n elem.set_world_space_coordinate_system();\n }\n\n update()\n {\n // this.ss_camera.left = -OScreen.width / 2;\n // this.ss_camera.right = OScreen.width / 2;\n // this.ss_camera.top = OScreen.top / 2;\n // this.ss_camera.right = -OScreen.bottom / 2;\n this.ss_camera.updateProjectionMatrix();\n\n this._tmp_normalized_pos.copy(this.input.NDC);\n for (let i = 0; i < this.ui_elements.length; i++)\n {\n this.ui_elements[i].update_state(this._tmp_normalized_pos);\n }\n }\n\n render(renderer)\n {\n // renderer.render_ui(this.scene);\n if (this.ss_scene.children.length > 0)\n {\n Graphics.render(this.ss_scene, this.ss_camera);\n }\n if (this.ws_scene.children.length > 0)\n {\n Graphics.render(this.ws_scene, CameraManager.current);\n }\n }\n\n clear()\n {\n this.current_clicked_element = undefined;\n }\n}\n\nconst ui = new UI();\nexport { ui as UI };\n","import { Vector3, Plane, Quaternion, Sphere, Line3 } from 'three';\nimport { OMath } from './OMath';\n\nclass PerspectiveFrustumPointFitter\n{\n constructor()\n {\n this.sphere = new Sphere();\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n this.sphere.setFromPoints(points);\n\n const v_fov = OMath.degToRad(vertical_fov / 2);\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\n\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\n\n const sphere_center = this.sphere.center.clone();\n\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\n\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\n\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n let closest_distance = Infinity;\n\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\n for (let i = 0; i < points.length; i++)\n {\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\n\n const up_line_intersection = new Vector3();\n const down_line_intersection = new Vector3();\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n up_plane.intersectLine(line, up_line_intersection);\n down_plane.intersectLine(line, down_line_intersection);\n\n left_plane.intersectLine(line, left_line_intersection);\n right_plane.intersectLine(line, right_line_intersection);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('down intersection not found', i);\n }\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\n\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\n\n const vertical_min = Math.min(new_up_distance, new_down_distance);\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\n\n const min = Math.min(vertical_min, horizontal_min);\n\n if (min < closest_distance)\n {\n closest_distance = min;\n }\n }\n\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\n const closest_position = far_pos.clone().add(forward_correction);\n\n return closest_position;\n }\n\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\n {\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\n const horizontal_offset = this.get_horizontal_correction(points, left_plane, right_plane, camera_quaternion);\n\n target_pos.add(vertical_offset);\n target_pos.add(horizontal_offset);\n }\n\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\n {\n let closest_distance_to_up_plane = Infinity;\n let closest_distance_to_down_plane = Infinity;\n // let closest_up_point = undefined;\n // let closest_down_point = undefined;\n\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\n for (let i = 0; i < points.length; i++)\n {\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\n\n const down_line_intersection = new Vector3();\n const up_line_intersection = new Vector3();\n\n down_plane.intersectLine(down_line, down_line_intersection);\n up_plane.intersectLine(up_line, up_line_intersection);\n\n const down_dist = down_line_intersection.distanceTo(points[i]);\n const up_dist = up_line_intersection.distanceTo(points[i]);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('vertical up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('vertical down intersection not found', i);\n }\n\n if (down_dist < closest_distance_to_down_plane)\n {\n closest_distance_to_down_plane = down_dist;\n // closest_down_point = points[i];\n }\n if (up_dist < closest_distance_to_up_plane)\n {\n closest_distance_to_up_plane = up_dist;\n // closest_up_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\n\n // console.log(\"vertical_correction\", correction)\n return up_dir.clone().multiplyScalar(-correction);\n }\n\n get_horizontal_correction(points, left_plane, right_plane, camera_quaternion)\n {\n let closest_distance_to_right_plane = Infinity;\n let closest_distance_to_left_plane = Infinity;\n // let closest_right_point = undefined;\n // let closest_left_point = undefined;\n\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\n\n for (let i = 0; i < points.length; i++)\n {\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n left_plane.intersectLine(left_line, left_line_intersection);\n right_plane.intersectLine(right_line, right_line_intersection);\n\n const left_dist = left_line_intersection.distanceTo(points[i]);\n const right_dist = right_line_intersection.distanceTo(points[i]);\n\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n if (left_dist < closest_distance_to_left_plane)\n {\n closest_distance_to_left_plane = left_dist;\n // closest_left_point = points[i];\n }\n if (right_dist < closest_distance_to_right_plane)\n {\n closest_distance_to_right_plane = right_dist;\n // closest_right_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\n // console.log(\"horizontal_correction\", correction)\n\n return right_dir.clone().multiplyScalar(-correction);\n }\n\n get_up_plane_normal(camera_quaternion, v_fov)\n {\n const up_plane_normal = new Vector3(0, -1, 0);\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\n up_plane_normal.applyQuaternion(camera_quaternion);\n return up_plane_normal;\n }\n\n get_down_plane_normal(camera_quaternion, v_fov)\n {\n const down_plane_normal = new Vector3(0, 1, 0);\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\n down_plane_normal.applyQuaternion(camera_quaternion);\n return down_plane_normal;\n }\n\n get_left_plane_normal(camera_quaternion, h_fov)\n {\n const left_plane_normal = new Vector3(1, 0, 0);\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\n left_plane_normal.applyQuaternion(camera_quaternion);\n return left_plane_normal;\n }\n\n get_right_plane_normal(camera_quaternion, h_fov)\n {\n const right_plane_normal = new Vector3(-1, 0, 0);\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\n right_plane_normal.applyQuaternion(camera_quaternion);\n return right_plane_normal;\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n\nexport { PerspectiveFrustumPointFitter };\n","import { Vector3, Box3 } from 'three';\n\nclass OrthographicFrustumPointFitter\n{\n constructor()\n {\n\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n const inverse_camera_quat = camera_quaternion.clone().inverse();\n\n const inverted_points = [];\n\n for (let i = 0; i < points.length; i++)\n {\n inverted_points.push(points[i].clone().applyQuaternion(inverse_camera_quat));\n }\n\n const box = new Box3().setFromPoints(inverted_points);\n const size = new Vector3();\n box.getSize(size);\n\n const distance = this.get_distance_to_fit_rect(size.x / 2, size.y / 2, vertical_fov, aspect);\n\n const center = new Vector3();\n box.getCenter(center);\n\n center.applyQuaternion(camera_quaternion);\n\n return {\n center: center,\n distance_to_center: distance\n };\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n\nexport { OrthographicFrustumPointFitter };\n","import { CameraManager } from '../CameraManager';\nimport { OMath } from '../utilities/OMath';\nimport { OScreen } from '../OScreen';\n\nimport { Vector3 } from 'three';\nimport { Matrix4 } from 'three';\nimport { Plane } from 'three';\nimport { Ray } from 'three';\nimport { Sphere } from 'three';\nimport { Box3 } from 'three';\nimport { PerspectiveFrustumPointFitter } from './PerspectiveFrustumPointFitter';\nimport { OrthographicFrustumPointFitter } from './OrthographicFrustumPointFitter';\n\nclass CameraUtilities\n{\n init(input)\n {\n this.tmp_mat = new Matrix4();\n this.plane = new Plane();\n this.ray = new Ray();\n\n this.tmp_size = new Vector3();\n this.tmp_unproj = new Vector3();\n\n this.input = input;\n }\n\n get_up_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(0, 1, 0);\n tmp_vec.applyQuaternion(camera.quaternion);\n\n return tmp_vec;\n }\n\n get_forward_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(0, 0, -1);\n tmp_vec.applyQuaternion(camera.quaternion);\n\n return tmp_vec;\n }\n\n get_right_dir(camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.set(1, 0, 0);\n tmp_vec.applyQuaternion(camera.quaternion);\n return tmp_vec;\n }\n\n unproject_mouse_position(NDC, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n const v_fov = (camera.fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * camera.aspect)) / 2;\n\n const distV = Math.tan(v_fov) * camera.far;\n const distH = Math.tan(h_fov) * camera.far;\n\n tmp_vec.set(distH * NDC.x, distV * NDC.y, -camera.far).normalize();\n\n return tmp_vec.applyQuaternion(camera.quaternion);\n }\n\n get_plane_intersection(plane_position, plane_normal, NDC, camera)\n {\n camera = camera || CameraManager.current;\n NDC = NDC || this.input.NDC;\n\n const tmp_vec = new Vector3();\n\n this.plane.setFromNormalAndCoplanarPoint(plane_normal || this.get_forward_dir(camera), plane_position);\n if (camera.isPerspectiveCamera)\n {\n this.ray.set(camera.position, this.unproject_mouse_position(NDC, camera));\n }\n else\n {\n this.tmp_unproj.set(NDC.x, NDC.y, 1).unproject(camera);\n this.ray.set(camera.position, this.tmp_unproj);\n }\n\n this.ray.intersectPlane(this.plane, tmp_vec);\n return tmp_vec;\n }\n\n fit_points_on_camera(points, zoom_scale = 1)\n {\n const points_sphere = new Sphere().setFromPoints(points);\n const world_space_center = points_sphere.center;\n const camera_forward = this.get_forward_dir(CameraManager.current).clone();\n\n const plane = new Plane().setFromNormalAndCoplanarPoint(camera_forward, world_space_center);\n\n const points_on_plane = OMath.project_points_on_plane(points, plane);\n\n const projected_points_center = new Vector3();\n let box = new Box3().setFromPoints(points_on_plane);\n box.getCenter(projected_points_center);\n\n const up = new Vector3(0, 1, 0).applyQuaternion(CameraManager.current.quaternion);\n const right = up.clone().cross(camera_forward).normalize();\n const mat = new Matrix4().set(right.x, up.x, camera_forward.x, world_space_center.x,\n right.y, up.y, camera_forward.y, world_space_center.y,\n right.z, up.z, camera_forward.z, world_space_center.z,\n 0, 0, 0, 1);\n\n const inverse_mat = new Matrix4().getInverse(mat);\n for (let i = 0; i < points_on_plane.length; i++)\n {\n points_on_plane[i].applyMatrix4(inverse_mat);\n }\n\n const size = new Vector3();\n box = new Box3().setFromPoints(points_on_plane);\n box.getSize(size);\n size.multiplyScalar(zoom_scale);\n const projected_center = new Vector3();\n box.getCenter(projected_center);\n\n return {\n position: projected_points_center,\n zoom: this.get_zoom_to_fit_rect(size.x / 2, size.y / 2)\n };\n }\n\n get_zoom_to_fit_rect(width, height)\n {\n const v_fov = (CameraManager.current.fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * CameraManager.current.aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n\n get_zoom_to_fit_box(bb, camera)\n {\n if (camera.isOrthographicCamera)\n {\n bb.getSize(this.tmp_size);\n\n const obj_x = this.tmp_size.x;\n const obj_y = this.tmp_size.y;\n const object_aspect = obj_x / obj_y;\n if (OScreen.aspect_ratio / object_aspect > 1)\n {\n return OScreen.height / obj_y;\n }\n else\n {\n return OScreen.width / obj_x;\n }\n }\n else\n {\n // return this.fit_points_on_camera([bb.min, bb.max], 1).zoom;\n const size = new Vector3();\n bb.getSize(size);\n return this.get_zoom_to_fit_rect(size.x, size.y);\n }\n }\n\n get_html_screen_pos(object, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n object.getWorldPosition(tmp_vec);\n tmp_vec.project(camera);\n\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\n return tmp_vec;\n }\n\n world_pos_to_screen(pos, camera)\n {\n camera = camera || CameraManager.current;\n const tmp_vec = new Vector3();\n\n tmp_vec.copy(pos);\n tmp_vec.project(camera);\n\n tmp_vec.x = (tmp_vec.x * 0.5 + 0.5) * (OScreen.width);\n tmp_vec.y = (1 - (tmp_vec.y * 0.5 + 0.5)) * OScreen.height;\n return tmp_vec;\n }\n\n update_projection(camera)\n {\n camera.left = -OScreen.width / 2;\n camera.right = OScreen.width / 2;\n camera.top = OScreen.height / 2;\n camera.bottom = -OScreen.height / 2;\n camera.aspect = OScreen.aspect_ratio;\n camera.updateProjectionMatrix(true);\n }\n\n fit_bounding_box_points(camera, bb, scale = 1)\n {\n const dir = new Vector3();\n dir.copy(bb.max).sub(bb.min);\n\n const p1 = bb.min.clone();\n\n const p2 = p1.clone().add(new Vector3(dir.x, 0, 0));\n const p3 = p1.clone().add(new Vector3(0, dir.y, 0));\n const p4 = p1.clone().add(new Vector3(0, 0, dir.z));\n\n const p5 = p1.clone().add(new Vector3(dir.x, 0, dir.z));\n const p6 = p1.clone().add(new Vector3(0, dir.y, dir.z));\n const p7 = bb.max.clone();\n const p8 = p1.clone().add(new Vector3(dir.x, dir.y, 0));\n return this.fit_points(camera, [p1, p2, p3, p4, p5, p6, p7, p8], scale);\n }\n\n fit_points(camera, points, zoom_scale = 1)\n {\n if (camera.isPerspectiveCamera)\n {\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera.quaternion);\n const camera_backward_dir = camera_forward_dir.clone().multiplyScalar(-1);\n\n const fitter = new PerspectiveFrustumPointFitter();\n\n const aspect_ratio = OScreen.aspect_ratio;\n\n const camera_pos = fitter.fit_points(points, camera.quaternion, camera.fov * zoom_scale, aspect_ratio);\n const box = new Box3().setFromPoints(points);\n const center = new Vector3();\n box.getCenter(center);\n\n const reference_position_plane = new Plane().setFromNormalAndCoplanarPoint(camera_backward_dir, center);\n\n const camera_ray = new Ray(camera_pos, camera_forward_dir);\n\n const reference_position = new Vector3();\n camera_ray.intersectPlane(reference_position_plane, reference_position);\n\n const zoom = camera_pos.distanceTo(reference_position);\n\n return {\n zoom: zoom,\n reference_position: reference_position,\n camera_position: camera_pos\n };\n }\n else\n {\n const fitter = new OrthographicFrustumPointFitter();\n const result = fitter.fit_points(points, this.reference_rotation, camera.fov * zoom_scale, OScreen.aspect_ratio);\n\n this.reference_position.copy(result.center);\n this.reference_zoom = result.distance_to_center;\n\n const forward = new Vector3(0, 0, 1).applyQuaternion(camera.quaternion);\n return {\n zoom: result.distance_to_center,\n reference_position: result.center,\n camera_position: forward.multiplyScalar(result.distance_to_center)\n };\n }\n }\n}\n\nconst camera_utilities = new CameraUtilities();\nexport { camera_utilities as CameraUtilities };\n","import { Browser } from './Browser';\nimport { CameraManager } from './CameraManager';\nimport { Capabilities } from './Capabilities';\nimport { Configuration } from './Configuration';\nimport { Debug } from './Debug';\nimport { EventManager } from './EventManager';\nimport { Graphics } from './Graphics';\nimport { OS } from './OS';\nimport { OScreen } from './OScreen';\nimport { ReflectionPlaneContext } from './ReflectionPlaneContext';\nimport { ResourceContainer } from './ResourceContainer';\nimport { SceneManager } from './SceneManager';\nimport { GeometryBatcher } from './static_batcher/GeometryBatcher';\nimport { Time } from './Time';\nimport { UI } from './UI';\nimport { CameraUtilities } from './utilities/CameraUtilities';\n\nclass Initializer\n{\n constructor()\n {\n }\n\n init(input)\n {\n CameraManager.init();\n CameraUtilities.init(input);\n Capabilities.init();\n Configuration.init();\n EventManager.init();\n GeometryBatcher.init();\n\n OS.init();\n Browser.init();\n ReflectionPlaneContext.init();\n ResourceContainer.init();\n SceneManager.init();\n OScreen.init();\n Time.init();\n UI.init(input);\n\n Debug.init();\n }\n\n dispose(render_loop)\n {\n Graphics.dispose();\n SceneManager.dispose();\n\n render_loop.dispose();\n }\n}\n\nconst initializer = new Initializer();\nexport { initializer as Initializer };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/ssao/ssao.frag';\nimport vert from '../shaders/ssao/ssao.vert';\n\nimport { Matrix4 } from 'three';\nimport { Vector3 } from 'three';\nimport { DataTexture } from 'three';\nimport { RGBFormat } from 'three';\nimport { RepeatWrapping } from 'three';\n\nimport { OMath } from '../utilities/OMath';\nclass SSAOMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, vert);\n\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\n this.uniforms._ProjectionMatrix = { value: new Matrix4() };\n\n this.uniforms._Bias = { value: 0.0125 };\n this.uniforms._Radius = { value: 0.3 };\n this.uniforms._FarPlane = { value: 100 };\n\n this.uniforms._SampleKernel = { value: this.__get_sample_kernel() };\n this.uniforms._RandomRotation = { value: this.__get_rotation_kernel() };\n }\n\n __get_sample_kernel()\n {\n const sample_kernel = [];\n const kernel_size = 64;\n\n for (let i = 0; i < kernel_size; i++)\n {\n const dir = new Vector3(Math.random() * 2 - 1,\n Math.random() * 2 - 1,\n Math.random());\n dir.normalize();\n let scale = i / kernel_size;\n scale = OMath.lerp(0.1, 1.0, scale * scale);\n dir.multiplyScalar(scale);\n\n sample_kernel.push(dir);\n }\n return sample_kernel;\n }\n\n __get_rotation_kernel()\n {\n const rotation_kernel = new Uint8Array(3 * 16);\n for (let i = 0; i < 16; i++)\n {\n rotation_kernel[i * 3 + 1] = Math.floor(Math.random() * 255);\n rotation_kernel[i * 3 + 2] = Math.floor(Math.random() * 255);\n rotation_kernel[i * 3 + 3] = 0;\n }\n\n const rotation_texture = new DataTexture(rotation_kernel, 4, 4, RGBFormat);\n rotation_texture.wrapS = RepeatWrapping;\n rotation_texture.wrapT = RepeatWrapping;\n\n rotation_texture.needsUpdate = true;\n return rotation_texture;\n }\n}\n\nexport { SSAOMaterial };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/ssao/ssao_compose.frag';\n\nclass SSAOComposeMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag);\n this.uniforms._AO = { value: undefined };\n }\n}\n\nexport { SSAOComposeMaterial };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/depth_normals/debug_normals.frag';\nimport depth_normals_vert from '../shaders/ssao/ssao.vert';\n\nimport { Matrix4 } from 'three';\n\nclass DisplayNormalTextureMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, depth_normals_vert);\n this.uniforms._FarPlane = { value: 1 };\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\n }\n}\n\nexport { DisplayNormalTextureMaterial };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/box_blur/box_blur.frag';\n\nimport { Vector2 } from 'three';\n\nclass BoxBlurMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag);\n this.uniforms._SampleDir = { value: new Vector2() };\n }\n}\n\nexport { BoxBlurMaterial };\n","import { BoxBlurMaterial } from '../materials/BoxBlurMaterial';\nimport { Graphics } from '../Graphics';\n\nimport { WebGLRenderTarget } from 'three';\n\nclass Blurrer\n{\n constructor(renderer)\n {\n this.RT1 = new WebGLRenderTarget(1, 1);\n this.RT2 = new WebGLRenderTarget(1, 1);\n this.box_blur_mat = new BoxBlurMaterial();\n }\n\n blur(RT)\n {\n if (RT.width !== this.RT1.width || RT.height !== this.RT1.height)\n {\n this.RT1.setSize(RT.width, RT.height);\n this.RT2.setSize(RT.width, RT.height);\n }\n\n this.box_blur_mat.uniforms._SampleDir.value.set(1, 0);\n Graphics.blit(RT, this.RT1, this.box_blur_mat);\n this.box_blur_mat.uniforms._SampleDir.value.set(0, 1);\n Graphics.blit(this.RT1, RT, this.box_blur_mat);\n // return this.RT2;\n }\n}\n\nexport { Blurrer };\n","import { CameraManager } from '../CameraManager';\nimport { SceneManager } from '../SceneManager';\nimport { OScreen } from '../OScreen';\nimport { BaseRender } from '../render_mode/BaseRender';\nimport { Configuration } from '../Configuration';\nimport { SSAOMaterial } from '../materials/SSAOMaterial';\nimport { SSAOComposeMaterial } from '../materials/SSAOComposeMaterial';\nimport { DisplayNormalTextureMaterial } from '../materials/DisplayNormalTextureMaterial';\nimport { Blurrer } from '../render_utilities/Blurrer';\nimport { Graphics } from '../Graphics';\n\nimport { WebGLRenderTarget } from 'three';\n\nclass NormalAORender extends BaseRender\n{\n constructor()\n {\n super();\n\n this.ssao_mat = new SSAOMaterial();\n this.ssao_compose_mat = new SSAOComposeMaterial();\n this.debug_normals = new DisplayNormalTextureMaterial();\n\n this.ssaa = Configuration.use_ssaa ? 2 : 1;\n\n this.main_RT = new WebGLRenderTarget(OScreen.width * this.ssaa, OScreen.height * this.ssaa);\n\n this.SSAO_RT = new WebGLRenderTarget(OScreen.width, OScreen.height);\n\n this.blurrer = new Blurrer();\n Graphics.generateDepthNormalTexture = true;\n }\n\n render()\n {\n this.__check_RT_size();\n\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\n\n this.__update_uniforms();\n\n Graphics.blit(Graphics.depth_normals_RT, this.SSAO_RT, this.ssao_mat);\n\n // // BLUR\n this.blurrer.blur(this.SSAO_RT);\n Graphics.blit(this.SSAO_RT, undefined);\n\n // // COMPOSE\n this.ssao_compose_mat.uniforms._AO.value = this.SSAO_RT.texture;\n Graphics.blit(this.main_RT, undefined, this.ssao_compose_mat);\n\n // Graphics.blit(this.SSAO_RT, undefined);\n }\n\n __update_uniforms()\n {\n this.ssao_mat.uniforms._InverseProjMatrix.value.getInverse(CameraManager.current.projectionMatrix);\n this.ssao_mat.uniforms._ProjectionMatrix.value.copy(CameraManager.current.projectionMatrix);\n this.ssao_mat.uniforms._FarPlane.value = CameraManager.current.far;\n }\n\n __check_RT_size()\n {\n if (this.main_RT.width !== OScreen.width * this.ssaa || this.main_RT.height !== OScreen.height * this.ssaa)\n {\n this.main_RT.setSize(OScreen.width * this.ssaa, OScreen.height * this.ssaa);\n this.SSAO_RT.setSize(OScreen.width, OScreen.height);\n }\n }\n}\n\nexport { NormalAORender };\n","import { CameraManager } from '../CameraManager';\nimport { SceneManager } from '../SceneManager';\nimport { BaseRender } from '../render_mode/BaseRender';\nimport { Graphics } from '../Graphics';\n\nclass NormalRender extends BaseRender\n{\n constructor()\n {\n super();\n }\n\n render()\n {\n Graphics.clear(undefined, CameraManager.current, true, true);\n\n if (SceneManager.current.on_pre_render)\n {\n SceneManager.current.on_pre_render();\n }\n\n if (SceneManager.current.render)\n {\n SceneManager.current.render();\n }\n else\n {\n Graphics.render(SceneManager.current, CameraManager.current);\n }\n\n if (SceneManager.current.on_post_render)\n {\n SceneManager.current.on_post_render();\n }\n }\n}\n\nexport { NormalRender };\n","import { CameraManager } from '../CameraManager';\nimport { SceneManager } from '../SceneManager';\nimport { BaseRender } from '../render_mode/BaseRender';\nimport { Graphics } from '../Graphics';\n\nclass VRRender extends BaseRender\n{\n constructor()\n {\n super();\n }\n\n render()\n {\n // Graphics.clear(undefined, CameraManager.current, true, true);\n\n if (SceneManager.current.on_pre_render)\n {\n SceneManager.current.on_pre_render();\n }\n\n if (SceneManager.current.render)\n {\n SceneManager.current.render();\n }\n else\n {\n Graphics.render(SceneManager.current, CameraManager.current, Graphics._renderer.getRenderTarget());\n }\n\n this.render_spectator_camera();\n\n if (SceneManager.current.on_post_render)\n {\n SceneManager.current.on_post_render();\n }\n }\n\n render_spectator_camera()\n {\n const spectator_camera = CameraManager.spectator;\n\n if (spectator_camera && Graphics._renderer.xr.isPresenting)\n {\n // Copy the XR Camera's position and rotation, but use your\n // main camera's projection matrix\n const xrCam = Graphics._renderer.xr.getCamera(CameraManager.current);\n\n spectator_camera.projectionMatrix.copy(CameraManager.current.projectionMatrix);\n\n spectator_camera.position.copy(xrCam.position);\n spectator_camera.quaternion.copy(xrCam.quaternion);\n\n // we'll restore this later\n const currentRenderTarget = Graphics._renderer.getRenderTarget();\n\n // turn off the WebXR rendering\n Graphics._renderer.xr.isPresenting = false;\n\n // render to the canvas on our main display\n Graphics._renderer.setRenderTarget(null);\n Graphics._renderer.render(SceneManager.current, spectator_camera);\n\n // reset back to enable WebXR\n Graphics._renderer.setRenderTarget(currentRenderTarget);\n Graphics._renderer.xr.isPresenting = true;\n }\n }\n}\n\nexport { VRRender };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/gaussian_blur/gaussian_blur.frag';\n\nimport { Vector2 } from 'three';\n\nclass GaussianBlurMaterial extends BlitMaterial\n{\n constructor(kernel_radius)\n {\n super(frag, undefined, {\n KERNEL_RADIUS: kernel_radius,\n SIGMA: kernel_radius\n });\n\n this.uniforms.texSize = { value: new Vector2(0.5, 0.5) };\n this.uniforms.direction = { value: new Vector2(0.5, 0.5) };\n }\n\n set_size(w, h)\n {\n this.uniforms.texSize.value.x = w;\n this.uniforms.texSize.value.y = h;\n }\n\n set_direction(x, y)\n {\n this.uniforms.direction.value.set(x, y);\n }\n}\n\nexport { GaussianBlurMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/luminosity_high_pass/luminosity_high_pass.frag';\n\nimport { Color } from 'three';\nclass LuminosityHighPassMaterial extends BlitMaterial\n{\n constructor(kernel_radius)\n {\n super(frag);\n\n this.uniforms.luminosityThreshold = { value: 0.23 };\n this.uniforms.smoothWidth = { value: 0.01 };\n this.uniforms.defaultColor = { value: new Color('#000000') };\n this.uniforms.defaultOpacity = { value: 0.0 };\n }\n}\n\nexport { LuminosityHighPassMaterial };\n","import { GaussianBlurMaterial } from '../materials/GaussianBlurMaterial';\nimport { LuminosityHighPassMaterial } from '../materials/LuminosityHighPassMaterial';\nimport { Graphics } from '../Graphics';\n\nimport { WebGLRenderTarget, LinearFilter, RGBAFormat } from 'three';\n\nclass GaussianBlurrer\n{\n constructor(nMips = 5)\n {\n this.current_width = 1;\n this.current_height = 1;\n\n this.separableBlurMaterials = [];\n this.renderTargetsHorizontal = [];\n this.renderTargetsVertical = [];\n\n this.nMips = nMips;\n this.kernelSizeArray = [3, 5, 7, 9, 11];\n this.rt_pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat };\n\n this.renderTargetBright = new WebGLRenderTarget(1, 1, this.rt_pars);\n this.renderTargetBright.texture.generateMipmaps = false;\n\n this.init_materials();\n this.init_RT();\n\n this.luminosity_high_pass_mat = new LuminosityHighPassMaterial();\n }\n\n blur(RT, use_luminosity_high_pass)\n {\n this.resize_RT(RT.width, RT.height);\n\n if (use_luminosity_high_pass)\n {\n Graphics.blit(RT, this.renderTargetBright, this.luminosity_high_pass_mat);\n }\n else\n {\n Graphics.blit(RT, this.renderTargetBright);\n }\n\n let inputRenderTarget = this.renderTargetBright;\n\n for (let i = 0; i < this.nMips; i++)\n {\n const mat = this.separableBlurMaterials[i];\n\n mat.set_direction(1, 0);\n Graphics.blit(inputRenderTarget, this.renderTargetsHorizontal[i], mat);\n\n mat.set_direction(0, 1);\n Graphics.blit(this.renderTargetsHorizontal[i], this.renderTargetsVertical[i], mat);\n\n inputRenderTarget = this.renderTargetsVertical[i];\n }\n }\n\n get_blurred_texture()\n {\n return this.renderTargetsHorizontal[0].texture;\n }\n\n get_blurred_RT()\n {\n return this.renderTargetsHorizontal[0];\n }\n\n init_RT()\n {\n this.dispose_RT();\n\n this.renderTargetBright.setSize(1, 1);\n\n for (let i = 0; i < this.nMips; i++)\n {\n const hor = new WebGLRenderTarget(1, 1, this.rt_pars);\n const ver = new WebGLRenderTarget(1, 1, this.rt_pars);\n\n hor.texture.generateMipmaps = false;\n ver.texture.generateMipmaps = false;\n\n this.renderTargetsHorizontal.push(hor);\n this.renderTargetsVertical.push(ver);\n }\n }\n\n resize_RT(texture_width, texture_height)\n {\n if (this.current_width === texture_width && this.current_height === texture_height)\n {\n return;\n }\n\n this.current_width = texture_width;\n this.current_height = texture_height;\n\n let width = Math.round(texture_width / 2);\n let height = Math.round(texture_height / 2);\n\n this.renderTargetBright.setSize(width, height);\n\n for (let i = 0; i < this.nMips; i++)\n {\n this.renderTargetsVertical[i].setSize(width, height);\n this.renderTargetsHorizontal[i].setSize(width, height);\n this.separableBlurMaterials[i].set_size(width, height);\n\n width = Math.round(width / 2);\n height = Math.round(height / 2);\n }\n }\n\n init_materials(texture_width, texture_height)\n {\n this.dispose_materials();\n\n for (let i = 0; i < this.nMips; i++)\n {\n this.separableBlurMaterials.push(new GaussianBlurMaterial(this.kernelSizeArray[i]));\n }\n }\n\n dispose_materials()\n {\n for (let i = 0; i < this.separableBlurMaterials.length; i++)\n {\n this.separableBlurMaterials[i].dispose();\n }\n this.separableBlurMaterials.length = 0;\n }\n\n dispose_RT()\n {\n for (let i = 0; i < this.renderTargetsVertical.length; i++)\n {\n this.renderTargetsHorizontal[i].dispose();\n this.renderTargetsVertical[i].dispose();\n }\n this.renderTargetBright.dispose();\n\n this.renderTargetsHorizontal.length = 0;\n this.renderTargetsVertical.length = 0;\n }\n}\n\nexport { GaussianBlurrer };\n","import { OScreen } from '../OScreen';\nimport { BaseRender } from '../render_mode/BaseRender';\nimport { UnrealBloomComposeMaterial } from '../materials/UnrealBloomComposeMaterial';\nimport { AddMaterial } from '../materials/AddMaterial';\n\nimport { WebGLRenderTarget } from 'three';\n\nimport { GaussianBlurrer } from '../render_utilities/GaussianBlurrer';\nimport { Graphics } from '../Graphics';\nimport { CameraManager } from '../CameraManager';\nimport { SceneManager } from '../SceneManager';\n\nclass UnrealBloomRender extends BaseRender\n{\n constructor()\n {\n super();\n\n this.bloom_compose_mat = undefined;\n\n this.main_RT = undefined;\n this.blur_RT = undefined;\n this.blurrer = undefined;\n\n this.add_mat = new AddMaterial();\n }\n\n on_enter()\n {\n this.blurrer = new GaussianBlurrer();\n this.main_RT = new WebGLRenderTarget(OScreen.width, OScreen.height);\n this.blur_RT = new WebGLRenderTarget(OScreen.width, OScreen.height);\n\n this.bloom_compose_mat = new UnrealBloomComposeMaterial(5);\n this.blurrer = new GaussianBlurrer(5);\n\n this.bloom_compose_mat.set_RT_0(this.blurrer.renderTargetsVertical[0].texture);\n this.bloom_compose_mat.set_RT_1(this.blurrer.renderTargetsVertical[1].texture);\n this.bloom_compose_mat.set_RT_2(this.blurrer.renderTargetsVertical[2].texture);\n this.bloom_compose_mat.set_RT_3(this.blurrer.renderTargetsVertical[3].texture);\n this.bloom_compose_mat.set_RT_4(this.blurrer.renderTargetsVertical[4].texture);\n\n this.bloom_compose_mat.set_bloom_strength(1);\n this.bloom_compose_mat.set_bloom_radius(1);\n\n this.add_mat.set_add_texture(this.blurrer.renderTargetsHorizontal[0].texture);\n }\n\n set_bloom_strength(val)\n {\n this.bloom_compose_mat.set_bloom_strength(val);\n }\n\n set_bloom_radius(val)\n {\n this.bloom_compose_mat.set_bloom_radius(val);\n }\n\n set_tint_color_0(col_string)\n {\n this.bloom_compose_mat.set_tint_color_0(col_string);\n }\n\n set_tint_color_1(col_string)\n {\n this.bloom_compose_mat.set_tint_color_1(col_string);\n }\n\n set_tint_color_2(col_string)\n {\n this.bloom_compose_mat.set_tint_color_2(col_string);\n }\n\n set_tint_color_3(col_string)\n {\n this.bloom_compose_mat.set_tint_color_3(col_string);\n }\n\n set_tint_color_4(col_string)\n {\n this.bloom_compose_mat.set_tint_color_4(col_string);\n }\n\n render()\n {\n this.__check_RT_size();\n\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\n\n // // BLUR\n this.blurrer.blur(this.main_RT, true);\n\n // Blur compose\n Graphics.material_pass(this.bloom_compose_mat, this.blurrer.renderTargetsHorizontal[0]);\n\n // Additive blend\n Graphics.blit(this.main_RT, undefined, this.add_mat);\n }\n\n __check_RT_size()\n {\n if (this.main_RT.width !== OScreen.width || this.main_RT.height !== OScreen.height)\n {\n this.main_RT.setSize(OScreen.width, OScreen.height);\n this.blur_RT.setSize(OScreen.width, OScreen.height);\n }\n }\n}\n\nexport { UnrealBloomRender };\n","import { Color } from 'three';\nimport { OrthographicCamera as TOrthographicCamera } from 'three';\n\nclass OrthographicCamera extends TOrthographicCamera\n{\n constructor(left, right, top, bottom, near, far)\n {\n super(left, right, top, bottom, near, far);\n\n this.clear_color = new Color('#000000');\n this.clear_alpha = 1;\n }\n\n copy(camera)\n {\n super.copy(camera);\n this.clear_color.copy(camera.clear_color);\n this.clear_alpha = camera.clear_alpha;\n return this;\n }\n}\n\nexport { OrthographicCamera };\n","import { ViewManager } from './ViewManager';\n\nclass ViewComponentManager\n{\n constructor()\n {\n this.components = [];\n this.enabled_components = new Set();\n }\n\n update()\n {\n this.__set_components_opacities();\n\n for (const component of this.enabled_components)\n {\n component.update(ViewManager.transition_handler.current_state_data);\n }\n }\n\n register_component(component)\n {\n this.components.push(component);\n }\n\n enable_component(component)\n {\n // const component_to_enable = this.get_component_by_name(component_name);\n\n this.enabled_components.add(component);\n }\n\n disable_component(component)\n {\n // const component_to_disable = this.get_component_by_name(component_name);\n\n this.enabled_components.delete(component);\n }\n\n get_component_by_name(component_name)\n {\n console.warn('DEPRECATED. Use ViewComponentManager.get instead');\n this.get(component_name);\n }\n\n get(component_name)\n {\n for (let i = 0; i < this.components.length; i++)\n {\n if (this.components[i].name === component_name)\n {\n return this.components[i];\n }\n }\n console.error('[ViewComponentManager.get] no component found for: ', component_name);\n return undefined;\n }\n\n __set_components_opacities()\n {\n for (let i = 0; i < this.components.length; i++)\n {\n this.components[i].set_opacity(ViewManager.transition_handler.current_state_data);\n }\n }\n}\n\nconst view_component_manager = new ViewComponentManager();\nexport { view_component_manager as ViewComponentManager };\n","import { Time } from './Time';\nimport { UI } from './UI';\nimport { Debug } from './Debug';\nimport { BaseApplication } from './BaseApplication';\nimport { ViewManager } from './view_components/ViewManager';\nimport { ViewComponentManager } from './view_components/ViewComponentManager';\n\nclass RenderLoop\n{\n constructor(target_application, graphics, input)\n {\n target_application = target_application || new BaseApplication();\n\n this.target_application = target_application;\n this.graphics = graphics;\n this.input = input;\n\n this.is_running = false;\n this.frames_passed = 0;\n\n this.time_accumulator = 0;\n }\n\n update()\n {\n if (!this.is_running)\n {\n return;\n }\n Time.__update();\n\n // ###### START CYCLE ######\n if (this.frames_passed === 1)\n {\n this.target_application.on_post_start();\n }\n\n this.input.update();\n\n this.time_accumulator += Time.delta_time;\n\n this.target_application.before_update();\n ViewManager.before_update();\n\n while (this.time_accumulator > Time.fixed_delta_time)\n {\n this.target_application.fixed_update();\n ViewManager.fixed_update();\n this.time_accumulator -= Time.fixed_delta_time;\n }\n Time.__set_frame_interpolation(this.time_accumulator / Time.fixed_delta_time);\n\n this.target_application.update();\n\n ViewManager.update();\n ViewComponentManager.update();\n\n this.target_application.on_pre_render();\n\n this.graphics.update(); // render scene\n UI.update(); // update after new camera matrix has been calculated\n UI.render(this.graphics); // render ui layer on top\n this.target_application.on_post_render();\n\n Debug.render(this.graphics); // render debug layer\n\n // ###### END CYCLE #######\n\n this.target_application.on_frame_end();\n this.frames_passed++;\n\n this.input.clear();\n UI.clear();\n Debug.clear();\n }\n\n start()\n {\n if (this.is_running) return; // sanity check\n\n if (this.frames_passed === 0)\n {\n this.target_application.on_enter();\n }\n\n this.is_running = true;\n\n this.graphics._renderer.setAnimationLoop(this.update.bind(this));\n }\n\n stop()\n {\n if (this.is_running === false) return; // sanity check\n\n this.is_running = false;\n this.target_application.on_exit();\n\n this.graphics._renderer.setAnimationLoop(null);\n }\n\n set_state(new_state)\n {\n this.target_application.on_exit(this);\n this.target_application = new_state;\n this.target_application.on_enter(this);\n }\n\n dispose()\n {\n this.stop();\n this.frames_passed = 0;\n }\n}\n\nexport { RenderLoop };\n","import { OScreen } from './OScreen';\n\nclass Screen\n{\n init()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.init();\n }\n\n update_position(x, y)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.update_position(x, y);\n }\n\n update()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.update();\n }\n\n update_size(width, height)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n OScreen.update_size(width, height);\n }\n\n apply_pixel_density_v2(vector2)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.apply_pixel_density_v2(vector2);\n }\n\n apply_pixel_density(value)\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.apply_pixel_density(value);\n }\n\n get_pixel_size()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.get_pixel_size();\n }\n\n get aspect_ratio()\n {\n console.warn('Screen Singleton is deprecated. Please use OScreen.');\n return OScreen.aspect_ratio;\n }\n}\n\nconst screen = new Screen();\nexport { screen as Screen };\n","\nimport { CanvasDrawer } from './CanvasDrawer';\n\nimport { Vector2 } from 'three';\n\nclass SimpleTextDrawer extends CanvasDrawer\n{\n constructor()\n {\n super();\n this.text_margin = new Vector2(2, 0);\n }\n\n __draw(text, ctxOptions, canvas, ctx)\n {\n ctx.font = ctxOptions.font;\n\n const text_size = this.get_text_size(text, ctxOptions.font);\n // canvas.width = Math.ceilPowerOfTwo(text_size.x+this.text_margin.x*2);\n // canvas.height = Math.ceilPowerOfTwo(text_size.y+ this.text_margin.y*2);\n canvas.width = Math.ceil(text_size.x + this.text_margin.x * 2);\n canvas.height = Math.ceil(text_size.y + this.text_margin.y * 2);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // turn this on for debugging\n ctx.globalAlpha = 0.0;\n ctx.fillStyle = ctxOptions.font_color || '#000000';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.globalAlpha = 1;\n\n ctx.globalAlpha = 1;\n\n ctx.font = ctxOptions.font;\n ctx.fillStyle = ctxOptions.font_color || '#000000';\n ctx.textBaseline = 'middle';\n\n ctx.textAlign = ctxOptions.textAlign || 'center';\n if (ctx.textAlign === 'center')\n {\n ctx.fillText(text, canvas.width / 2, canvas.height / 2);\n }\n else\n {\n ctx.fillText(text, 0, canvas.height / 2);\n }\n }\n}\n\nexport { SimpleTextDrawer };\n","import { HTMLUtilities } from '../utilities/HTMLUtilities';\nimport { ViewComponentManager } from './ViewComponentManager';\n\nclass ViewComponent\n{\n constructor({ name, container })\n {\n this.name = name;\n this.container = container;\n this.hidden = true;\n\n ViewComponentManager.register_component(this);\n }\n\n start()\n {\n }\n\n on_enter()\n {\n this.container.classList.remove('hidden');\n ViewComponentManager.enable_component(this);\n\n this.hidden = false;\n }\n\n update()\n {\n }\n\n on_exit()\n {\n this.container.classList.add('hidden');\n ViewComponentManager.disable_component(this);\n\n this.hidden = true;\n }\n\n set_opacity(current_state_data)\n {\n this.container.style.opacity = current_state_data[`${this.name}_opacity`];\n this.toggle_hidden();\n }\n\n toggle_hidden()\n {\n if (this.container.style.opacity > 0.001)\n {\n if (this.hidden)\n {\n this.on_enter();\n }\n }\n else\n {\n if (!this.hidden)\n {\n this.on_exit();\n }\n }\n }\n\n load_html_images()\n {\n HTMLUtilities.load_images(this.container);\n }\n\n load_html_videos()\n {\n HTMLUtilities.load_videos(this.container);\n }\n}\n\nexport { ViewComponent };\n","import { Mesh } from 'three';\nimport { MeshBasicMaterial } from 'three';\nimport { PlaneGeometry } from 'three';\n\nclass HorizontalPlane extends Mesh\n{\n constructor(width, height, color, material)\n {\n width = width || 1;\n height = height || 1;\n color = color || '#FF0000';\n material = material || new MeshBasicMaterial({ color: color });\n\n const geometry = new PlaneGeometry(width, height);\n geometry.rotateX(-3.14 / 2);\n super(geometry, material);\n }\n}\n\nexport { HorizontalPlane };\n","import { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { MeshBasicMaterial } from 'three';\n\nclass VerticalPlane extends Mesh\n{\n constructor(width, height, color, material)\n {\n width = width || 1;\n height = height || 1;\n color = color || '#FF0000';\n material = material || new MeshBasicMaterial({ color: color });\n\n const geometry = new PlaneGeometry(width, height);\n super(geometry, material);\n }\n}\n\nexport { VerticalPlane };\n","class ArrayUtilities\n{\n constructor()\n {}\n\n static merge_from_to(source, target)\n {\n target.push.apply(target, source);\n }\n\n static expand_vec3_array(array, size)\n {\n const items_left_count = size - array.length;\n\n for (let i = 0; i < items_left_count; i++)\n {\n array.push(array[i].clone());\n }\n }\n\n static remove_elem(array, elem)\n {\n const index = array.indexOf(elem);\n if (index > -1)\n {\n array.splice(index, 1);\n }\n }\n\n static get_closest_point(points, target)\n {\n let closest_point = points[0];\n let closest_distance = closest_point.distanceTo(target);\n for (let i = 1; i < points.length; i++)\n {\n if (points[i].distanceTo(target) < closest_distance)\n {\n closest_point = points[i];\n closest_distance = points[i].distanceTo(target);\n }\n }\n return closest_point;\n }\n\n static object_values_to_array(obj)\n {\n const ids = Object.keys(obj);\n const arr = [];\n for (let i = 0; i < ids.length; i++)\n {\n arr.push(obj[ids[i]]);\n }\n return arr;\n }\n}\n\nexport { ArrayUtilities };\n","import { Line3, Plane, Quaternion, Sphere, Vector3 } from 'three';\n\nclass FrustumPointFitter\n{\n constructor()\n {\n this.sphere = new Sphere();\n }\n\n fit_points(points, camera_quaternion, vertical_fov, aspect)\n {\n this.sphere.setFromPoints(points);\n\n const v_fov = Math.degToRad(vertical_fov / 2);\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\n const down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\n const left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\n const right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\n\n const camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\n\n const sphere_center = this.sphere.center.clone();\n\n const pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\n const far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\n\n const up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n const down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n const left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n const right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\n\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\n\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\n\n let closest_distance = Infinity;\n\n const inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\n for (let i = 0; i < points.length; i++)\n {\n const line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\n\n const up_line_intersection = new Vector3();\n const down_line_intersection = new Vector3();\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n up_plane.intersectLine(line, up_line_intersection);\n down_plane.intersectLine(line, down_line_intersection);\n\n left_plane.intersectLine(line, left_line_intersection);\n right_plane.intersectLine(line, right_line_intersection);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('down intersection not found', i);\n }\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n const new_up_distance = points[i].clone().sub(up_line_intersection).length();\n const new_down_distance = points[i].clone().sub(down_line_intersection).length();\n\n const new_left_distance = points[i].clone().sub(left_line_intersection).length();\n const new_right_distance = points[i].clone().sub(right_line_intersection).length();\n\n const vertical_min = Math.min(new_up_distance, new_down_distance);\n const horizontal_min = Math.min(new_left_distance, new_right_distance);\n\n const min = Math.min(vertical_min, horizontal_min);\n\n if (min < closest_distance)\n {\n closest_distance = min;\n }\n }\n\n const forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\n const closest_position = far_pos.clone().add(forward_correction);\n\n return closest_position;\n }\n\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\n {\n const vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\n const horizontal_offset = this.get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion);\n\n target_pos.add(vertical_offset);\n target_pos.add(horizontal_offset);\n }\n\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\n {\n let closest_distance_to_up_plane = Infinity;\n let closest_distance_to_down_plane = Infinity;\n let closest_up_point = undefined;\n let closest_down_point = undefined;\n\n const up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\n for (let i = 0; i < points.length; i++)\n {\n const down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\n const up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\n\n const down_line_intersection = new Vector3();\n const up_line_intersection = new Vector3();\n\n down_plane.intersectLine(down_line, down_line_intersection);\n up_plane.intersectLine(up_line, up_line_intersection);\n\n const down_dist = down_line_intersection.distanceTo(points[i]);\n const up_dist = up_line_intersection.distanceTo(points[i]);\n\n if (up_line_intersection.length() < 0.0001)\n {\n console.log('vertical up intersection not found', i);\n }\n if (down_line_intersection.length() < 0.0001)\n {\n console.log('vertical down intersection not found', i);\n }\n\n if (down_dist < closest_distance_to_down_plane)\n {\n closest_distance_to_down_plane = down_dist;\n closest_down_point = points[i];\n }\n if (up_dist < closest_distance_to_up_plane)\n {\n closest_distance_to_up_plane = up_dist;\n closest_up_point = points[i];\n }\n }\n\n console.log(closest_up_point, closest_down_point);\n\n const correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\n\n // console.log(\"vertical_correction\", correction)\n return up_dir.clone().multiplyScalar(-correction);\n }\n\n get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion)\n {\n let closest_distance_to_right_plane = Infinity;\n let closest_distance_to_left_plane = Infinity;\n let closest_right_point = undefined;\n let closest_left_point = undefined;\n\n const right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\n\n for (let i = 0; i < points.length; i++)\n {\n const left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\n const right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\n\n const left_line_intersection = new Vector3();\n const right_line_intersection = new Vector3();\n\n left_plane.intersectLine(left_line, left_line_intersection);\n right_plane.intersectLine(right_line, right_line_intersection);\n\n const left_dist = left_line_intersection.distanceTo(points[i]);\n const right_dist = right_line_intersection.distanceTo(points[i]);\n\n if (left_line_intersection.length() < 0.0001)\n {\n console.log('left intersection not found', i);\n }\n if (right_line_intersection.length() < 0.0001)\n {\n console.log('right intersection not found', i);\n }\n\n if (left_dist < closest_distance_to_left_plane)\n {\n closest_distance_to_left_plane = left_dist;\n closest_left_point = points[i];\n }\n if (right_dist < closest_distance_to_right_plane)\n {\n closest_distance_to_right_plane = right_dist;\n closest_right_point = points[i];\n }\n }\n\n const correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\n // console.log(\"horizontal_correction\", correction)\n\n console.log(closest_right_point, closest_left_point);\n\n return right_dir.clone().multiplyScalar(-correction);\n }\n\n get_up_plane_normal(camera_quaternion, v_fov)\n {\n const up_plane_normal = new Vector3(0, -1, 0);\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\n up_plane_normal.applyQuaternion(camera_quaternion);\n return up_plane_normal;\n }\n\n get_down_plane_normal(camera_quaternion, v_fov)\n {\n const down_plane_normal = new Vector3(0, 1, 0);\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\n down_plane_normal.applyQuaternion(camera_quaternion);\n return down_plane_normal;\n }\n\n get_left_plane_normal(camera_quaternion, h_fov)\n {\n const left_plane_normal = new Vector3(1, 0, 0);\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\n left_plane_normal.applyQuaternion(camera_quaternion);\n return left_plane_normal;\n }\n\n get_right_plane_normal(camera_quaternion, h_fov)\n {\n const right_plane_normal = new Vector3(-1, 0, 0);\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\n right_plane_normal.applyQuaternion(camera_quaternion);\n return right_plane_normal;\n }\n\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\n {\n const v_fov = (vertical_fov / 2) * Math.PI / 180;\n const h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\n\n const distV = height / Math.tan(v_fov);\n const distH = width / Math.tan(h_fov);\n return Math.max(Math.abs(distH), Math.abs(distV));\n }\n}\n\nexport { FrustumPointFitter };\n","import { BufferAttribute } from 'three';\nimport { BufferGeometry } from 'three';\n\nclass GeometryUtilities\n{\n static convert_to_non_indexed_geometry(geometry_buffer)\n {\n const indices = geometry_buffer.index;\n const positions = geometry_buffer.getAttribute('position');\n\n const bar_coordinates = [];\n const vertices = [];\n\n for (let i = 0; i < indices.count; i += 3)\n {\n // VERTEX 1\n vertices.push(positions.getX(indices.array[i + 0]));\n vertices.push(positions.getY(indices.array[i + 0]));\n vertices.push(positions.getZ(indices.array[i + 0]));\n\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n\n // VERTEX 2\n\n vertices.push(positions.getX(indices.array[i + 1]));\n vertices.push(positions.getY(indices.array[i + 1]));\n vertices.push(positions.getZ(indices.array[i + 1]));\n\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n\n // VERTEX 3\n\n vertices.push(positions.getX(indices.array[i + 2]));\n vertices.push(positions.getY(indices.array[i + 2]));\n vertices.push(positions.getZ(indices.array[i + 2]));\n\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n }\n\n const geometry = new BufferGeometry();\n // geometry.setAttribute('barycentric', new BufferAttribute( new Float32Array(bar_coordinates), 3 ));\n geometry.setAttribute('position', new BufferAttribute(new Float32Array(vertices), 3));\n GeometryUtilities.add_barycentric_attribute(geometry);\n return geometry;\n }\n\n static add_barycentric_attribute(non_indexed_geometry_buffer)\n {\n const bar_coordinates = [];\n const positions = non_indexed_geometry_buffer.getAttribute('position');\n\n for (let i = 0; i < positions.count; i += 3)\n {\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n bar_coordinates.push(0);\n\n bar_coordinates.push(0);\n bar_coordinates.push(0);\n bar_coordinates.push(1);\n }\n non_indexed_geometry_buffer.setAttribute('barycentric', new BufferAttribute(new Float32Array(bar_coordinates), 3));\n }\n}\n\nexport { GeometryUtilities };\n","import { Vector4 } from 'three';\n\nclass ImageUtilities\n{\n constructor()\n { }\n\n static get_image_data(image)\n {\n const canvas = document.createElement('canvas');\n canvas.width = image.width;\n canvas.height = image.height;\n\n const context = canvas.getContext('2d');\n context.drawImage(image, 0, 0);\n\n return context.getImageData(0, 0, image.width, image.height);\n }\n\n static get_pixel(imagedata, x, y)\n {\n const position = (x + imagedata.width * y) * 4;\n const data = imagedata.data;\n return new Vector4(data[position + 0], data[position + 1], data[position + 2], data[position + 3]);\n }\n}\n\nexport { ImageUtilities };\n","import { Vector3 } from 'three';\nimport { Vector2 } from 'three';\nclass MeshSampler\n{\n constructor()\n {\n\n }\n\n sample(buffer_geometry, sample_count)\n {\n const face_areas = [];\n\n let min_area = 99999999;\n\n const vertices = buffer_geometry.getAttribute('position');\n const normals = buffer_geometry.getAttribute('normal');\n const tangents = buffer_geometry.getAttribute('tangent');\n const uvs = buffer_geometry.getAttribute('uv');\n const indices = buffer_geometry.index;\n\n const faces = [];\n\n for (let i = 0; i < indices.count; i += 3)\n {\n const index_0 = indices.array[i + 0];\n const index_1 = indices.array[i + 1];\n const index_2 = indices.array[i + 2];\n\n const v1 = new Vector3();\n v1.x = vertices.getX(index_0);\n v1.y = vertices.getY(index_0);\n v1.z = vertices.getZ(index_0);\n\n const v2 = new Vector3();\n v2.x = vertices.getX(index_1);\n v2.y = vertices.getY(index_1);\n v2.z = vertices.getZ(index_1);\n\n const v3 = new Vector3();\n v3.x = vertices.getX(index_2);\n v3.y = vertices.getY(index_2);\n v3.z = vertices.getZ(index_2);\n\n const face = {\n a: v1,\n b: v2,\n c: v3\n };\n\n if (normals)\n {\n const n1 = new Vector3();\n n1.x = normals.getX(index_0);\n n1.y = normals.getY(index_0);\n n1.z = normals.getZ(index_0);\n\n const n2 = new Vector3();\n n2.x = normals.getX(index_1);\n n2.y = normals.getY(index_1);\n n2.z = normals.getZ(index_1);\n\n const n3 = new Vector3();\n n3.x = normals.getX(index_2);\n n3.y = normals.getY(index_2);\n n3.z = normals.getZ(index_2);\n\n const normal = n1.clone().add(n2).add(n3).normalize();\n face.normal = normal;\n }\n\n if (tangents)\n {\n const n1 = new Vector3();\n n1.x = tangents.getX(index_0);\n n1.y = tangents.getY(index_0);\n n1.z = tangents.getZ(index_0);\n\n const n2 = new Vector3();\n n2.x = tangents.getX(index_1);\n n2.y = tangents.getY(index_1);\n n2.z = tangents.getZ(index_1);\n\n const n3 = new Vector3();\n n3.x = tangents.getX(index_2);\n n3.y = tangents.getY(index_2);\n n3.z = tangents.getZ(index_2);\n\n const tangent = n1.clone().add(n2).add(n3).normalize();\n face.tangent = tangent;\n }\n if (uvs)\n {\n const uv_a = new Vector2();\n uv_a.x = uvs.getX(index_0);\n uv_a.y = uvs.getY(index_0);\n\n const uv_b = new Vector2();\n uv_b.x = uvs.getX(index_1);\n uv_b.y = uvs.getY(index_1);\n\n const uv_c = new Vector2();\n uv_c.x = uvs.getX(index_2);\n uv_c.y = uvs.getY(index_2);\n\n face.uv_a = uv_a;\n face.uv_b = uv_b;\n face.uv_c = uv_c;\n }\n\n faces.push(face);\n\n const area = this.get_face_area(face);\n min_area = Math.min(area, min_area);\n face_areas.push(area);\n }\n\n const normalized_faces_array = this.get_uniform_face_distribution(face_areas, min_area, faces);\n const selected_faces = this.select_random_faces(normalized_faces_array, sample_count);\n const sampled_data = this.sample_data_from_faces(selected_faces);\n return sampled_data;\n }\n\n sample_data_from_faces(faces)\n {\n const sampled_points = [];\n const sampled_normals = [];\n const sampled_tangents = [];\n const sampled_uvs = [];\n\n for (let i = 0; i < faces.length; i++)\n {\n const face = faces[i];\n\n const w1 = Math.random();\n const w2 = Math.random();\n\n sampled_points.push(this.sample_point_in_face(w1, w2, face.a, face.b, face.c).clone());\n if (face.normal)\n {\n sampled_normals.push(face.normal.clone());\n }\n if (face.tangent)\n {\n sampled_tangents.push(face.tangent.clone());\n }\n if (face.uv_a)\n {\n sampled_uvs.push(this.sample_point_in_face(w1, w2, face.uv_a, face.uv_b, face.uv_c).clone());\n }\n }\n return { points: sampled_points, normals: sampled_normals, tangents: sampled_tangents, uvs: sampled_uvs };\n }\n\n select_random_faces(faces, amount)\n {\n const selected_faces = [];\n for (let i = 0; i < amount; i++)\n {\n const random = Math.floor(Math.random() * faces.length);\n const selected_face = faces[random];\n\n selected_faces.push(selected_face);\n }\n\n return selected_faces;\n }\n\n get_uniform_face_distribution(face_areas, minimum_area, faces)\n {\n const extended_triangle_indices = [];\n for (let i = 0; i < face_areas.length; i++)\n {\n face_areas[i] /= minimum_area;\n const repetitions_needed = Math.floor(Math.round(face_areas[i]));\n for (let j = 0; j < repetitions_needed; j++)\n {\n extended_triangle_indices.push(faces[i]);\n }\n }\n return extended_triangle_indices;\n }\n\n get_face_area(face)\n {\n const vec1 = face.b.clone().sub(face.a);\n const vec2 = face.c.clone().sub(face.a);\n return vec1.cross(vec2).length() / 2;\n }\n\n sample_point_in_face(w1, w2, v1, v2, v3)\n {\n if (w1 + w2 > 1)\n {\n w1 = 1.0 - w1;\n w2 = 1.0 - w2;\n }\n\n const w3 = 1.0 - (w1 + w2);\n\n return v1.clone().multiplyScalar(w1).add(v2.clone().multiplyScalar(w2)).add(v3.clone().multiplyScalar(w3));\n }\n}\n\nconst mesh_sampler = new MeshSampler();\nexport { mesh_sampler as MeshSampler };\n","import { Mesh } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Skeleton } from 'three';\n\nclass ModelUtilities\n{\n get_mesh(scene, result_callback)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n if (child.geometry)\n {\n child.geometry = new BufferGeometry().fromGeometry(child.geometry);\n }\n result_callback(child);\n }\n });\n }\n\n get_geometries(scene)\n {\n const geometries = [];\n\n this.get_mesh(scene, (child) =>\n {\n geometries.push(child.geometry);\n });\n return geometries;\n }\n\n assign_material(scene, material, name)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n // assign to all if no name is given\n if (name === undefined)\n {\n child.material = material;\n }\n else\n {\n // if name is given, assign only to that\n if (child.name === name)\n {\n child.material = material;\n }\n }\n }\n });\n }\n\n clone_animated_gltf(gltf)\n {\n const clone = {\n animations: gltf.animations,\n scene: gltf.scene.clone(true)\n };\n\n const skinnedMeshes = {};\n\n gltf.scene.traverse(node =>\n {\n if (node.isSkinnedMesh)\n {\n skinnedMeshes[node.name] = node;\n }\n });\n\n const cloneBones = {};\n const cloneSkinnedMeshes = {};\n\n clone.scene.traverse(node =>\n {\n if (node.isBone)\n {\n cloneBones[node.name] = node;\n }\n\n if (node.isSkinnedMesh)\n {\n cloneSkinnedMeshes[node.name] = node;\n }\n });\n\n for (const name in skinnedMeshes)\n {\n const skinnedMesh = skinnedMeshes[name];\n const skeleton = skinnedMesh.skeleton;\n const cloneSkinnedMesh = cloneSkinnedMeshes[name];\n\n const orderedCloneBones = [];\n\n for (let i = 0; i < skeleton.bones.length; ++i)\n {\n const cloneBone = cloneBones[skeleton.bones[i].name];\n orderedCloneBones.push(cloneBone);\n }\n\n cloneSkinnedMesh.bind(\n new Skeleton(orderedCloneBones, skeleton.boneInverses),\n cloneSkinnedMesh.matrixWorld);\n }\n\n return clone;\n }\n\n set_shadow_config(scene, cast, receive)\n {\n scene.traverse((child) =>\n {\n if (child instanceof Mesh)\n {\n child.castShadow = cast;\n child.receiveShadow = receive;\n }\n });\n }\n\n __find_object(scene, object_name, result_callback)\n {\n scene.traverse((obj) =>\n {\n if (obj.name === object_name)\n {\n result_callback(obj);\n }\n });\n }\n\n get_object(scene, object_name)\n {\n let object = undefined;\n scene.traverse((obj) =>\n {\n if (obj.name === object_name)\n {\n object = obj;\n }\n });\n return object;\n }\n\n get_object_by_type(scene, object_type)\n {\n let object = undefined;\n scene.traverse((obj) =>\n {\n if (obj.constructor.name === object_type)\n {\n object = obj;\n }\n });\n return object;\n }\n}\n\nconst model_utilities = new ModelUtilities();\nexport { model_utilities as ModelUtilities };\n","class ObjectUtilities\r\n{\r\n static is_object(item)\r\n {\r\n return (item && typeof item === 'object' && !Array.isArray(item));\r\n }\r\n\r\n static merge_deep(target, ...sources)\r\n {\r\n if (!sources.length) return target;\r\n const source = sources.shift();\r\n\r\n if (ObjectUtilities.is_object(target) && ObjectUtilities.is_object(source))\r\n {\r\n for (const key in source)\r\n {\r\n if (ObjectUtilities.is_object(source[key]))\r\n {\r\n if (!target[key]) Object.assign(target, { [key]: {} });\r\n ObjectUtilities.merge_deep(target[key], source[key]);\r\n }\r\n else\r\n {\r\n Object.assign(target, { [key]: source[key] });\r\n }\r\n }\r\n }\r\n\r\n return ObjectUtilities.merge_deep(target, ...sources);\r\n }\r\n\r\n static xml_to_json(xml)\r\n {\r\n // Create the return object\r\n let obj = {};\r\n\r\n if (xml.nodeType === 1)\r\n { // element\r\n // do attributes\r\n if (xml.attributes.length > 0)\r\n {\r\n obj['@attributes'] = {};\r\n for (let j = 0; j < xml.attributes.length; j++)\r\n {\r\n const attribute = xml.attributes.item(j);\r\n obj['@attributes'][attribute.nodeName] = attribute.nodeValue;\r\n }\r\n }\r\n }\r\n else if (xml.nodeType === 3)\r\n { // text\r\n obj = xml.nodeValue;\r\n }\r\n\r\n // do children\r\n if (xml.hasChildNodes())\r\n {\r\n for (let i = 0; i < xml.childNodes.length; i++)\r\n {\r\n const item = xml.childNodes.item(i);\r\n const nodeName = item.nodeName;\r\n if (typeof (obj[nodeName]) === 'undefined')\r\n {\r\n obj[nodeName] = this.xml_to_json(item);\r\n }\r\n else\r\n {\r\n if (typeof (obj[nodeName].push) === 'undefined')\r\n {\r\n const old = obj[nodeName];\r\n obj[nodeName] = [];\r\n obj[nodeName].push(old);\r\n }\r\n obj[nodeName].push(this.xml_to_json(item));\r\n }\r\n }\r\n }\r\n return obj;\r\n }\r\n}\r\n\r\nexport { ObjectUtilities };\r\n","class StringUtilities\n{\n constructor()\n {}\n\n static get_random_color()\n {\n const hexValues = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F'];\n let hex = '#';\n\n for (let i = 0; i < 6; i++)\n {\n const index = Math.floor(Math.random() * hexValues.length);\n hex += hexValues[index];\n }\n\n return hex;\n }\n\n static capitalize(string)\n {\n const words = string.split(' ');\n\n for (let i = 0; i < words.length; i++)\n {\n words[i] = words[i][0].toUpperCase() + words[i].substr(1);\n }\n\n return words.join(' ');\n }\n\n static capitalize_first_letter(string)\n {\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n static snake_to_camelcase(string)\n {\n return string.toLowerCase().replace(/[-_][a-z0-9]/g, (group) => group.slice(-1).toUpperCase());\n }\n}\n\nexport { StringUtilities };\n","class TimeUtilities\n{\n constructor()\n {}\n\n // Converts a time string (00:00:00.45) into miliseconds\n time_str_to_ms(time_str)\n {\n time_str = time_str.split(':');\n\n let hours = Number(time_str[0]);\n hours = hours * 60 * 60 * 1000;\n\n let minutes = Number(time_str[1]);\n minutes = minutes * 60 * 1000;\n\n let seconds = Number(time_str[2]);\n seconds = seconds * 1000;\n\n return hours + minutes + seconds;\n }\n}\n\nexport { TimeUtilities };\n","import grid_frag from '../shaders/grid/grid.frag';\nimport grid_vert from '../shaders/grid/grid.vert';\n\nimport { GeometryUtilities } from '../utilities/GeometryUtilities';\n\nimport { Mesh } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\nimport { PlaneGeometry } from 'three';\n\nclass Grid extends Mesh\n{\n constructor()\n {\n const material = new ShaderMaterial({\n uniforms: {\n _Color: { value: new Color('#919191') }\n },\n vertexShader: grid_vert,\n fragmentShader: grid_frag,\n extensions: { derivatives: true },\n transparent: true,\n depthWrite: false\n });\n\n const plane_geometry = new PlaneGeometry(100, 100, 100, 100);\n\n const non_indexed_geometry = GeometryUtilities.convert_to_non_indexed_geometry(plane_geometry);\n\n super(non_indexed_geometry, material);\n\n this.rotation.x = -3.14 / 2;\n }\n}\n\nexport { Grid };\n","import line_vs from '../shaders/basic_line/basic_line.vert';\nimport line_fs from '../shaders/basic_line/basic_line.frag';\n\nimport { Mesh } from 'three';\nimport { BufferAttribute } from 'three';\nimport { BufferGeometry } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { Color } from 'three';\n\nclass Line extends Mesh\n{\n constructor(points)\n {\n const geometry = new BufferGeometry();\n geometry.setAttribute('position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('next_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('previous_position', new BufferAttribute(new Float32Array([]), 3));\n geometry.setAttribute('orientation', new BufferAttribute(new Float32Array([]), 1));\n geometry.setAttribute('coverage', new BufferAttribute(new Float32Array([]), 1));\n\n const material = new ShaderMaterial({\n uniforms: {\n _Thickness: { value: 0.2 },\n _Length: { value: 0 },\n _ElapsedTime: { value: 0 },\n _Color: { value: new Color('#FF0000') }\n },\n vertexShader: line_vs,\n fragmentShader: line_fs,\n transparent: true,\n depthWrite: false,\n extensions: { derivatives: true }\n\n });\n\n super(geometry, material);\n\n if (points)\n {\n this.setup(points);\n }\n }\n\n setup(points)\n {\n const vertices = [];\n const next_position = [];\n const previous_position = [];\n const orientation = [];\n const coverage = [];\n let accumulated_length = 0;\n\n for (let i = 0; i < points.length; i++)\n {\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(1);\n\n vertices.push(points[i].x);\n vertices.push(points[i].y);\n vertices.push(points[i].z);\n orientation.push(-1);\n\n const next_point = this.__get_next_position(points, i);\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n next_position.push(next_point.x);\n next_position.push(next_point.y);\n next_position.push(next_point.z);\n\n const previous_point = this.__get_previous_position(points, i);\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n previous_position.push(previous_point.x);\n previous_position.push(previous_point.y);\n previous_position.push(previous_point.z);\n\n coverage.push(accumulated_length);\n coverage.push(accumulated_length);\n\n if (i < points.length - 1)\n {\n accumulated_length += points[i].distanceTo(next_point);\n }\n }\n const vertexList = new Float32Array(vertices);\n const nextPositionList = new Float32Array(next_position);\n const previousPositionList = new Float32Array(previous_position);\n const orientationList = new Float32Array(orientation);\n const coverageList = new Float32Array(coverage);\n\n const indices = [];\n for (let i = 0; i < ((vertexList.length / 3) - 2) / 2; i++)\n {\n const index = (i * 2) + 1;\n indices.push(index);\n indices.push(index + 1);\n indices.push(index - 1);\n\n indices.push(index);\n indices.push(index + 2);\n indices.push(index + 1);\n }\n\n this.geometry.setIndex(indices);\n this.geometry.getAttribute('position').copy(new BufferAttribute(vertexList, 3));\n this.geometry.getAttribute('next_position').copy(new BufferAttribute(nextPositionList, 3));\n this.geometry.getAttribute('previous_position').copy(new BufferAttribute(previousPositionList, 3));\n this.geometry.getAttribute('orientation').copy(new BufferAttribute(orientationList, 1));\n this.geometry.getAttribute('coverage').copy(new BufferAttribute(coverageList, 1));\n\n this.geometry.getAttribute('position').needsUpdate = true;\n this.geometry.getAttribute('next_position').needsUpdate = true;\n this.geometry.getAttribute('previous_position').needsUpdate = true;\n this.geometry.getAttribute('orientation').needsUpdate = true;\n this.geometry.getAttribute('coverage').needsUpdate = true;\n\n this.material.uniforms._Length.value = accumulated_length;\n this._length = accumulated_length;\n }\n\n set thickness(value)\n {\n this.material.uniforms._Thickness.value = value;\n }\n\n get thickness()\n {\n return this.material.uniforms._Thickness.value;\n }\n\n __get_previous_position(points, i)\n {\n if (i === 0)\n {\n return points[1].clone().sub(points[0]).multiplyScalar(-1).add(points[0]);\n }\n else\n {\n return points[i - 1];\n }\n }\n\n __get_next_position(points, i)\n {\n if (i === points.length - 1)\n {\n return points[points.length - 2].clone().sub(points[points.length - 1]).multiplyScalar(-1).add(points[points.length - 1]);\n }\n else\n {\n return points[i + 1];\n }\n }\n\n update()\n {\n }\n\n distance()\n {\n return this.accumulated_length;\n }\n\n total_length()\n {\n return this.accumulated_length;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n if (this.parent)\n {\n this.parent.remove(this);\n }\n }\n\n set color(col)\n {\n this.material.uniforms._Color.value.set(col);\n }\n\n get color()\n {\n return this.material.uniforms._Color.value;\n }\n\n copy_color(col)\n {\n this.material.uniforms._Color.value.copy(col);\n }\n}\n\nexport { Line };\n","import basic_texture_vert from '../shaders/basic_texture/basic_texture.vert';\nimport basic_texture_frag from '../shaders/basic_texture/basic_texture.frag';\n\nimport { Mesh } from 'three';\nimport { Vector2 } from 'three';\nimport { ShaderMaterial } from 'three';\nimport { DoubleSide } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Vector3 } from 'three';\n\nclass WorldImage extends Mesh\n{\n constructor(texture, pivot)\n {\n pivot = pivot || new Vector2(0, 0);\n const material = new ShaderMaterial({\n uniforms: {\n _MainTex: { value: texture },\n _ScreenAligned: { value: 0 },\n _Scale: { value: 1 },\n _Opacity: { value: 1 }\n },\n vertexShader: basic_texture_vert,\n fragmentShader: basic_texture_frag,\n transparent: true,\n depthWrite: false,\n side: DoubleSide\n });\n const geometry = new PlaneGeometry(1, 1, 1);\n geometry.translate(-pivot.x / 2, -pivot.y / 2, 0);\n const current_scale = texture.image.width / texture.image.height;\n geometry.scale(current_scale, 1, 1);\n super(geometry, material);\n this.current_scale = current_scale;\n this.geometry.computeBoundingBox();\n\n this.tmp_bb_size = new Vector3();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n update_texture()\n {\n this.material.uniforms._MainTex.value.needsUpdate = true;\n const img = this.material.uniforms._MainTex.value.image;\n\n this.geometry.scale(1 / this.current_scale, 1, 1);\n this.current_scale = img.width / img.height;\n this.geometry.scale(this.current_scale, 1, 1);\n this.geometry.computeBoundingBox();\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\n }\n\n get size()\n {\n return this.tmp_bb_size.clone().multiplyScalar(this.scale.x);\n }\n\n set size(value)\n {\n this.scale.set(value, value, value);\n this.material.uniforms._Scale.value = value;\n }\n\n set screen_aligned(boolean)\n {\n this.material.uniforms._ScreenAligned.value = boolean === true ? 1 : 0;\n }\n\n get screen_aligned()\n {\n return this.material.uniforms._ScreenAligned.value === 1;\n }\n\n set opacity(opacity)\n {\n this.material.uniforms._Opacity.value = opacity;\n }\n\n get opacity()\n {\n return this.material.uniforms._Opacity.value;\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.parent.remove(this);\n this.material.uniforms._MainTex.value.dispose();\n this.material.dispose();\n }\n}\n\nexport { WorldImage };\n","import { WorldImage } from './WorldImage';\nimport { SimpleTextDrawer } from '../canvas_drawer/SimpleTextDrawer';\n\nimport { LinearMipMapLinearFilter } from 'three';\nimport { LinearFilter } from 'three';\n\nclass Text2D extends WorldImage\n{\n constructor(text, font, color, pivot, is_static)\n {\n const simple_text_drawer = new SimpleTextDrawer(is_static);\n\n const draw_settings = {\n font: font,\n font_color: color || '#000000'\n };\n const canvas_texture = simple_text_drawer.draw_on_texture(text, draw_settings);\n\n canvas_texture.minFilter = LinearMipMapLinearFilter;\n canvas_texture.minFilter = LinearFilter;\n canvas_texture.needsUpdate = true;\n super(canvas_texture, pivot);\n\n this.simple_text_drawer = simple_text_drawer;\n this.canvas_texture = canvas_texture;\n this.draw_settings = draw_settings;\n }\n\n set text(value)\n {\n this.simple_text_drawer.draw_canvas(value, this.draw_settings);\n this.update_texture();\n }\n\n get text()\n {\n return 'not implemented';\n }\n}\n\nexport { Text2D };\n","import vert from '../shaders/ui_element/ui_element.vert';\nimport frag from '../shaders/ui_element/ui_element.frag';\n\nimport { BaseShaderMaterial } from '../materials/BaseShaderMaterial';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nimport { OScreen } from '../OScreen';\n\nclass UIElementMaterial extends BaseShaderMaterial\n{\n constructor(intensity = 1)\n {\n super(vert, frag, {\n _MainTex: { value: undefined },\n _ScreenSize: { value: new Vector2(OScreen.width, OScreen.height) },\n _TextureSize: { value: new Vector2() },\n _PixelOffset: { value: new Vector2(0, 0) },\n _NDC: { value: new Vector3() },\n _PivotPoint: { value: new Vector2() },\n _DepthOffset: { value: 0 }\n });\n this.transparent = true;\n this.depthWrite = false;\n this.depthTest = false;\n }\n}\n\nexport { UIElementMaterial };\n","import { Vector2 } from 'three';\n\nclass ScreenSpacePosition\n{\n constructor()\n {\n this.tmp_vec = new Vector2();\n }\n\n get_pos_NDC(position)\n {\n return this.tmp_vec.set(position.x, position.y);\n }\n}\n\nexport { ScreenSpacePosition };\n","import { CameraManager } from '../../CameraManager';\n\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\n\nclass WorldSpacePosition\n{\n constructor()\n {\n this.tmp_vec3 = new Vector3();\n this.tmp_vec2 = new Vector2();\n }\n\n get_pos_NDC(position)\n {\n this.tmp_vec3.copy(position);\n this.tmp_vec3.project(CameraManager.current);\n\n return this.tmp_vec2.set(this.tmp_vec3.x, this.tmp_vec3.y);\n }\n}\n\nexport { WorldSpacePosition };\n","class UIElementState\n{\n constructor()\n {\n\n }\n\n update(ui_element, normalized_mouse_position)\n {\n\n }\n\n on_enter(ui_element)\n {}\n\n on_exit(ui_element)\n {}\n}\n\nexport { UIElementState };\n","import { UIElementState } from './UIElementState';\n\nclass OnIdle extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n ui_element.set_state(ui_element._on_enter_state);\n }\n }\n}\n\nexport { OnIdle };\n","import { UIElementState } from './UIElementState';\n\nclass OnMouseEnter extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n ui_element.on_mouse_enter();\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n ui_element.set_state(ui_element._on_hover_state);\n }\n else\n {\n ui_element.set_state(ui_element._on_exit_state);\n }\n }\n}\n\nexport { OnMouseEnter };\n","import { UIElementState } from './UIElementState';\n\nclass OnMouseExit extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n ui_element.on_mouse_exit();\n ui_element.set_state(ui_element._on_idle_state);\n }\n}\n\nexport { OnMouseExit };\n","import { UIElementState } from './UIElementState';\n\nclass OnMouseHover extends UIElementState\n{\n constructor()\n {\n super();\n }\n\n on_enter(ui_element)\n {\n this.__trigger_on_hover(ui_element);\n }\n\n update(ui_element, normalized_mouse_position)\n {\n if (ui_element.is_mouse_over(normalized_mouse_position))\n {\n this.__trigger_on_hover(ui_element);\n }\n else\n {\n ui_element.set_state(ui_element._on_exit_state);\n }\n }\n\n __trigger_on_hover(ui_element)\n {\n ui_element.on_mouse_hover();\n }\n}\n\nexport { OnMouseHover };\n","\nimport { OScreen } from '../OScreen';\n\nimport { UIElementMaterial } from '../materials/UIElementMaterial';\n\nimport { ScreenSpacePosition } from '../ui/ui_element_position/ScreenSpacePosition';\nimport { WorldSpacePosition } from '../ui/ui_element_position/WorldSpacePosition';\n\nimport { OnIdle } from '../ui/ui_element_state/OnIdle';\nimport { OnMouseEnter } from '../ui/ui_element_state/OnMouseEnter';\nimport { OnMouseExit } from '../ui/ui_element_state/OnMouseExit';\nimport { OnMouseHover } from '../ui/ui_element_state/OnMouseHover';\n\nimport { Mesh } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Vector2 } from 'three';\nimport { Vector3 } from 'three';\nimport { NearestFilter } from 'three';\nimport { Box2 } from 'three';\n\nclass UIElement extends Mesh\n{\n constructor(vert, frag)\n {\n super(new PlaneGeometry(1, 1), new UIElementMaterial());\n\n this.is_clickable = false;\n\n this.position_strategy = new WorldSpacePosition();\n this.current_state = new OnIdle();\n\n this._position = new Vector3();\n\n this._on_idle_state = new OnIdle();\n this._on_enter_state = new OnMouseEnter();\n this._on_exit_state = new OnMouseExit();\n this._on_hover_state = new OnMouseHover();\n\n this.on_enter = undefined;\n this.on_exit = undefined;\n this.on_hover = undefined;\n\n this.mouse_pos_tmp = new Vector2();\n this.cached_NDC_position = new Vector2();\n this.screen_pos_tmp = new Vector2();\n\n this.texture_size = new Vector2(1, 1);\n\n this.frustumCulled = false;\n this.matrixAutoUpdate = false;\n this.renderOrder = 0;\n\n this.size = 1;\n this.pixel_offset = new Vector2();\n }\n\n set_render_order(value)\n {\n this.renderOrder = value;\n }\n\n get pivot_point()\n {\n return this.material.uniforms._PivotPoint.value;\n }\n\n set_pixel_offset(offset)\n {\n this.pixel_offset.copy(offset);\n this.material.uniforms._PixelOffset.value.copy(offset);\n }\n\n set_state(new_state)\n {\n this.current_state.on_exit(this);\n this.current_state = new_state;\n this.current_state.on_enter(this);\n }\n\n get position()\n {\n return this._position;\n }\n\n set use_depth(boolean)\n {\n this.material.depthTest = boolean;\n }\n\n get use_depth()\n {\n return this.material.depthTest;\n }\n\n set depth_offset(value)\n {\n this.material.uniforms._DepthOffset.value = value;\n }\n\n get depth_offset()\n {\n return this.material.uniforms._DepthOffset.value;\n }\n\n clear_state()\n {\n this.visible = false;\n }\n\n set_world_space_coordinate_system()\n {\n this.position_strategy = new WorldSpacePosition();\n }\n\n set_screen_space_coordinate_system()\n {\n this.position_strategy = new ScreenSpacePosition();\n }\n\n set_texture(texture)\n {\n texture.minFilter = NearestFilter;\n texture.magFilter = NearestFilter;\n texture.needsUpdate = true;\n\n this.texture_size.set(texture.image.width, texture.image.height);\n\n this.material.uniforms._MainTex.value = texture;\n this.get_size(this.material.uniforms._TextureSize.value);\n this.visible = true;\n }\n\n update_state(normalized_mouse_pos)\n {\n this.material.uniforms._ScreenSize.value.set(OScreen.width, OScreen.height);\n this.get_size(this.material.uniforms._TextureSize.value);\n\n this.cached_NDC_position.copy(this.position_strategy.get_pos_NDC(this.position));\n this.material.uniforms._NDC.value.copy(this.position);\n this.current_state.update(this, normalized_mouse_pos);\n }\n\n is_mouse_over(normalized_mouse_pos)\n {\n this.screen_pos_tmp.copy(this.cached_NDC_position);\n this.to_screen_position(this.screen_pos_tmp);\n this.screen_pos_tmp.x += this.pixel_offset.x;\n this.screen_pos_tmp.y += this.pixel_offset.y;\n\n const rect = new Box2().setFromCenterAndSize(this.screen_pos_tmp, this.get_size());\n\n this.mouse_pos_tmp.copy(normalized_mouse_pos);\n this.to_screen_position(this.mouse_pos_tmp);\n\n return rect.containsPoint(this.mouse_pos_tmp);\n }\n\n to_screen_position(projected_pos)\n {\n projected_pos.x = (projected_pos.x * 0.5 + 0.5) * OScreen.width + this.pixel_offset.x;\n projected_pos.y = (projected_pos.y * 0.5 + 0.5) * OScreen.height + this.pixel_offset.y;\n }\n\n get_screen_space_position()\n {\n const pos = this.cached_NDC_position.clone();\n this.to_screen_position(pos);\n return pos;\n }\n\n set_screen_space_position(screen_pos)\n {\n this.position.x = (screen_pos.x / OScreen.width) * 2 - 1;\n this.position.y = (screen_pos.y / OScreen.height) * 2 - 1;\n }\n\n dispose()\n {\n if (this.material.uniforms._MainTex.value)\n {\n this.material.uniforms._MainTex.value.dispose();\n }\n // OScreen.remove_screen_material(this.material);\n this.geometry.dispose();\n this.material.dispose();\n }\n\n get_size(vector2)\n {\n if (vector2)\n {\n return vector2.copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\n }\n else\n {\n return new Vector2().copy(this.texture_size).multiplyScalar(this.size / OScreen.dpr);\n }\n }\n\n on_mouse_enter()\n {}\n\n on_mouse_exit()\n {}\n\n on_mouse_hover()\n {}\n}\n\nexport { UIElement };\n","import { Mesh } from 'three';\n\nclass UpdatableMaterialMesh extends Mesh\n{\n constructor(geometry, material)\n {\n super(geometry, material);\n\n const self = this;\n\n this.onBeforeRender = () =>\n {\n self.material.update();\n };\n }\n}\n\nexport { UpdatableMaterialMesh };\n","import { Vector2, Vector4 } from 'three';\n\nclass TextGlyph\n{\n constructor(offset, plane_bounds, atlas_bounds)\n {\n const width = plane_bounds.right - plane_bounds.left;\n const height = plane_bounds.top - plane_bounds.bottom;\n\n this.scale = new Vector2(width, height);\n this.position = new Vector2(offset + plane_bounds.left, plane_bounds.bottom);\n\n this.atlas_bounds = new Vector4(atlas_bounds.left, atlas_bounds.right, atlas_bounds.top, atlas_bounds.bottom);\n }\n}\n\nexport { TextGlyph };\n","import { Vector3, Quaternion, Matrix4, Color, Box2, Vector2 } from 'three';\nimport { TextGlyph } from './TextGlyph';\n\nclass SDFText\n{\n constructor(glyph_layout, text = '')\n {\n this.glyph_layout = glyph_layout;\n\n this.glyphs = [];\n\n this.glyph_is_dirty = true;\n this.matrix_is_dirty = true;\n this.color_is_dirty = true;\n\n this.position = new Vector3();\n this.quaternion = new Quaternion();\n this.scale = new Vector3(1, 1, 1);\n this.matrix = new Matrix4();\n\n this.color = new Color('#FFFFFF');\n\n this.pivot_point = new Vector2();\n this.__opacity = 1;\n\n this.__text = text;\n\n this.__generate_glyphs(text);\n }\n\n set text(value)\n {\n this.__text = value;\n this.__generate_glyphs(value);\n this.matrix_is_dirty = true;\n }\n\n get text()\n {\n return this.__text;\n }\n\n update_matrix()\n {\n this.matrix.compose(this.position, this.quaternion, this.scale);\n this.matrix_is_dirty = false;\n this.glyph_is_dirty = true;\n }\n\n clear_glyph_dirty()\n {\n this.glyph_is_dirty = false;\n }\n\n clear_color_dirty()\n {\n this.color_is_dirty = false;\n }\n\n set_rotation(orientation = 0, tilt = 0) // 0..360, -90..0..90\n {\n const new_orientation = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), (orientation / 360) * Math.PI * 2);\n const new_tilt = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), (-tilt / 360) * Math.PI * 2);\n\n this.quaternion.copy(new_orientation.multiply(new_tilt));\n this.matrix_is_dirty = true;\n }\n\n set_position(pos)\n {\n this.position.copy(pos);\n this.matrix_is_dirty = true;\n }\n\n set_size(size)\n {\n this.scale.set(size, size, size);\n this.matrix_is_dirty = true;\n }\n\n set_color(col)\n {\n this.color.set(col);\n this.color_is_dirty = true;\n }\n\n set_pivot(pivot)\n {\n this.pivot_point.copy(pivot);\n this.update_glyphs();\n }\n\n set opacity(op)\n {\n this.__opacity = op;\n this.color_is_dirty = true;\n }\n\n get opacity()\n {\n return this.__opacity;\n }\n\n update_glyphs()\n {\n this.__generate_glyphs(this.text);\n }\n\n __generate_glyphs(text)\n {\n let cursor = 0;\n\n this.glyphs.length = 0;\n\n for (let i = 0; i < text.length; i++)\n {\n const unicode = text.charCodeAt(i);\n const glyph = this.glyph_layout.find(element => element.unicode === unicode);\n if (glyph)\n {\n if (glyph.planeBounds)\n {\n const text_glyph = new TextGlyph(cursor, glyph.planeBounds, glyph.atlasBounds);\n this.glyphs.push(text_glyph);\n }\n cursor += glyph.advance;\n }\n }\n\n const box2 = new Box2();\n const first_glyph = this.glyphs[0];\n box2.setFromCenterAndSize(first_glyph.position.clone().add(new Vector2(first_glyph.scale.x / 2, first_glyph.scale.y / 2)), first_glyph.scale);\n\n for (let i = 1; i < this.glyphs.length; i++)\n {\n const g = this.glyphs[i];\n const box = new Box2().setFromCenterAndSize(g.position.clone().add(new Vector2(g.scale.x / 2, g.scale.y / 2)), g.scale);\n box2.union(box);\n }\n\n const box2_size = new Vector2();\n box2.getSize(box2_size);\n for (let i = 0; i < this.glyphs.length; i++)\n {\n this.glyphs[i].position.x -= box2_size.x / 2;\n this.glyphs[i].position.y -= box2_size.y / 2;\n\n this.glyphs[i].position.x += (box2_size.x / 2) * this.pivot_point.x;\n this.glyphs[i].position.y += (box2_size.y / 2) * this.pivot_point.y;\n }\n\n this.glyph_is_dirty = true;\n }\n}\n\nexport { SDFText };\n","import { BaseShaderMaterial } from './BaseShaderMaterial';\n\nimport frag from '../shaders/sdf_text/sdf_text.frag';\nimport vert from '../shaders/sdf_text/sdf_text.vert';\n\nimport { Vector2, DoubleSide, LinearFilter } from 'three';\nimport { OMath } from '../utilities/OMath';\n\nclass SDFTextMaterial extends BaseShaderMaterial\n{\n constructor(texture)\n {\n super(vert, frag, {\n _Texture: { value: texture },\n _Boldness: { value: 0.5 },\n _AtlasSize: { value: new Vector2(1, 1) }\n });\n\n this.transparent = true;\n this.extensions = {\n derivatives: true\n };\n this.depthWrite = false;\n this.side = DoubleSide;\n texture.minFilter = LinearFilter;\n texture.magFilter = LinearFilter;\n texture.generateMipMaps = false;\n }\n\n set_atlas_size(size)\n {\n this.uniforms._AtlasSize.value.copy(size);\n }\n\n set_boldness(value)\n {\n this.uniforms._Boldness.value = OMath.lerp(0.5, 0.2, value);\n }\n}\n\nexport { SDFTextMaterial };\n","import { SDFText } from './SDFText';\nimport { SDFTextMaterial } from '../../materials/SDFTextMaterial';\nimport { ArrayUtilities } from '../../utilities/ArrayUtilities';\n\nimport {\n PlaneGeometry,\n Mesh,\n Vector2,\n InstancedBufferGeometry,\n InstancedBufferAttribute,\n Float32BufferAttribute,\n DynamicDrawUsage\n} from 'three';\n\nclass SDFTextBatch extends Mesh\n{\n constructor(font_layout, atlas_texture)\n {\n const max_allocations = 2000;\n\n const instanced_geometry = new InstancedBufferGeometry();\n instanced_geometry.instanceCount = 0;\n\n const geometry = new PlaneGeometry(1, 1);\n geometry.translate(0.5, 0.5, 0);\n instanced_geometry.setAttribute('position', new Float32BufferAttribute(geometry.getAttribute('position').array, 3));\n instanced_geometry.setAttribute('uv', new Float32BufferAttribute(geometry.getAttribute('uv').array, 2));\n instanced_geometry.index = geometry.index;\n\n const transformsCol0 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol1 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol2 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const transformsCol3 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n const glyph_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n const plane_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n const color = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\n\n transformsCol0.usage = DynamicDrawUsage;\n transformsCol1.usage = DynamicDrawUsage;\n transformsCol2.usage = DynamicDrawUsage;\n transformsCol3.usage = DynamicDrawUsage;\n glyph_bounds.usage = DynamicDrawUsage;\n plane_bounds.usage = DynamicDrawUsage;\n color.usage = DynamicDrawUsage;\n\n instanced_geometry.setAttribute('transformsCol0', transformsCol0);\n instanced_geometry.setAttribute('transformsCol1', transformsCol1);\n instanced_geometry.setAttribute('transformsCol2', transformsCol2);\n instanced_geometry.setAttribute('transformsCol3', transformsCol3);\n\n instanced_geometry.setAttribute('glyph_bounds', glyph_bounds);\n instanced_geometry.setAttribute('plane_bounds', plane_bounds);\n instanced_geometry.setAttribute('color', color);\n\n super(instanced_geometry, new SDFTextMaterial(atlas_texture));\n\n this.text_elements = [];\n this.font_layout = font_layout;\n\n this.material.set_atlas_size(new Vector2(font_layout.atlas.width, font_layout.atlas.height));\n\n this.frustumCulled = false;\n }\n\n set_boldness(value)\n {\n this.material.set_boldness(value);\n }\n\n add_text(text_str)\n {\n const elem = new SDFText(this.font_layout.glyphs, text_str);\n this.text_elements.push(elem);\n return elem;\n }\n\n remove_text(text_elem)\n {\n ArrayUtilities.remove_elem(this.text_elements, text_elem);\n this.update(true);\n }\n\n update(force_update)\n {\n const glyph_bounds_atr = this.geometry.getAttribute('glyph_bounds');\n const plane_bounds_atr = this.geometry.getAttribute('plane_bounds');\n\n const transformsCol0 = this.geometry.getAttribute('transformsCol0');\n const transformsCol1 = this.geometry.getAttribute('transformsCol1');\n const transformsCol2 = this.geometry.getAttribute('transformsCol2');\n const transformsCol3 = this.geometry.getAttribute('transformsCol3');\n\n const color_atr = this.geometry.getAttribute('color');\n\n let matrix_needs_update = force_update === true;\n let glyph_needs_update = force_update === true;\n let color_needs_update = force_update === true;\n\n let glyph_count = 0;\n for (let i = 0; i < this.text_elements.length; i++)\n {\n const text = this.text_elements[i];\n\n if (text.matrix_is_dirty)\n {\n matrix_needs_update = true;\n text.update_matrix();\n }\n\n if (text.glyph_is_dirty)\n {\n glyph_needs_update = true;\n text.clear_glyph_dirty();\n }\n\n if (text.color_is_dirty)\n {\n color_needs_update = true;\n text.clear_color_dirty();\n }\n\n const matrix = text.matrix;\n const color = text.color;\n const opacity = text.opacity;\n\n for (let glyph_i = 0; glyph_i < text.glyphs.length; glyph_i++)\n {\n const glyph = text.glyphs[glyph_i];\n\n const buffer_i = glyph_count;\n\n glyph_bounds_atr.setXYZW(buffer_i, glyph.atlas_bounds.x, glyph.atlas_bounds.y, glyph.atlas_bounds.z, glyph.atlas_bounds.w);\n plane_bounds_atr.setXYZW(buffer_i, glyph.position.x, glyph.position.y, glyph.scale.x, glyph.scale.y);\n\n transformsCol0.setXYZW(buffer_i, matrix.elements[0],\n matrix.elements[1],\n matrix.elements[2],\n matrix.elements[3]);\n\n transformsCol1.setXYZW(buffer_i, matrix.elements[4],\n matrix.elements[5],\n matrix.elements[6],\n matrix.elements[7]);\n\n transformsCol2.setXYZW(buffer_i, matrix.elements[8],\n matrix.elements[9],\n matrix.elements[10],\n matrix.elements[11]);\n\n transformsCol3.setXYZW(buffer_i, matrix.elements[12],\n matrix.elements[13],\n matrix.elements[14],\n matrix.elements[15]);\n\n color_atr.setXYZW(buffer_i, color.r, color.g, color.b, opacity);\n\n glyph_count++;\n }\n }\n\n this.geometry.instanceCount = glyph_count;\n\n if (glyph_count > this.max_allocations)\n {\n console.error('SDFTextBatch exceeded maximum glyph allocations(max/current): ', this.max_allocations, glyph_count, this);\n }\n\n if (matrix_needs_update)\n {\n transformsCol0.needsUpdate = true;\n transformsCol1.needsUpdate = true;\n transformsCol2.needsUpdate = true;\n transformsCol3.needsUpdate = true;\n }\n if (glyph_needs_update)\n {\n glyph_bounds_atr.needsUpdate = true;\n plane_bounds_atr.needsUpdate = true;\n }\n if (color_needs_update)\n {\n color_atr.needsUpdate = true;\n }\n }\n\n dispose()\n {\n this.geometry.dispose();\n this.material.dispose();\n }\n}\n\nexport { SDFTextBatch };\n","import { ActionInterpolator } from './ActionInterpolator';\n\nclass VectorInterpolator extends ActionInterpolator\n{\n constructor(attribute_name, from = 0, to = 1, easing_function = 'linear')\n {\n super(easing_function);\n\n this.attribute_name = attribute_name;\n this.from = from;\n this.to = to;\n }\n\n update(context, t)\n {\n const tmp = this.from.clone();\n tmp.lerp(this.to, this.easing_function(t));\n context[this.attribute_name].copy(tmp);\n }\n}\n\nexport { VectorInterpolator };\n","import { BlitMaterial } from '../materials/BlitMaterial';\n\nimport frag from '../shaders/median_filter/median_filter.frag';\n\nimport { Vector2 } from 'three';\n\nclass MedianFilterMaterial extends BlitMaterial\n{\n constructor()\n {\n super(frag, undefined, {\n kernel3x3: true\n });\n\n this.uniforms._SourceTex = { value: undefined };\n this.uniforms._SourceTexSize = { value: new Vector2(1, 1) };\n }\n\n set_texture(tex)\n {\n this.uniforms._SourceTex.value = tex;\n\n const size = this.get_size(tex);\n this.uniforms._SourceTexSize.value.copy(size);\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n\nexport { MedianFilterMaterial };\n","import { MedianFilterMaterial } from '../materials/MedianFilterMaterial';\nimport { Graphics } from '../Graphics';\n\nimport { WebGLRenderTarget, Vector2, RGBAFormat, FloatType, NearestFilter } from 'three';\n\nclass MedianFilter\n{\n constructor(renderer)\n {\n this.RT = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n this.RT1 = new WebGLRenderTarget(1, 1, {\n type: FloatType,\n format: RGBAFormat,\n minFilter: NearestFilter,\n magFilter: NearestFilter\n });\n\n this.median_filter_mat = new MedianFilterMaterial();\n }\n\n filter(texture)\n {\n const tex_size = this.get_size(texture);\n if (tex_size.x !== this.RT.width || tex_size.y !== this.RT.height)\n {\n this.RT.setSize(tex_size.x, tex_size.y);\n this.RT1.setSize(tex_size.x, tex_size.y);\n }\n\n this.median_filter_mat.set_texture(texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n\n for (let i = 0; i < 0; i++)\n {\n this.median_filter_mat.set_texture(this.RT.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT1);\n\n this.median_filter_mat.set_texture(this.RT1.texture);\n Graphics.material_pass(this.median_filter_mat, this.RT);\n }\n\n return this.RT;\n }\n\n get_size(tex)\n {\n if (tex.isVideoTexture)\n {\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\n }\n if (tex.isWebGLRenderTarget)\n {\n return new Vector2(tex.width, tex.height);\n }\n if (tex.isTexture)\n {\n return new Vector2(tex.image.width, tex.image.height);\n }\n return new Vector2(1, 1);\n }\n}\n\nexport { MedianFilter };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport downsample_frag from '../shaders/dual_filter_blur/downsample.frag';\nimport upsample_frag from '../shaders/dual_filter_blur/upsample.frag';\n\nclass DualFilteringBlurMaterial extends BlitMaterial\n{\n constructor(upsample)\n {\n super(upsample ? upsample_frag : downsample_frag);\n }\n}\n\nexport { DualFilteringBlurMaterial };\n","import { BlitMaterial } from './BlitMaterial';\n\nimport frag from '../shaders/dual_filter_blur/alpha_filter.frag';\n\nclass AlphaFilterMaterial extends BlitMaterial\n{\n constructor(use_alpha_mask, upsample)\n {\n super(frag);\n }\n\n set offset(value)\n {\n this.uniforms._Offset.value = value;\n }\n\n get offset()\n {\n return this.uniforms._Offset.value;\n }\n}\n\nexport { AlphaFilterMaterial };\n","import { DualFilteringBlurMaterial } from '../materials/DualFilteringBlurMaterial';\nimport { AlphaFilterMaterial } from '../materials/AlphaFilterMaterial';\nimport { Graphics } from '../Graphics';\nimport { WebGLRenderTarget } from 'three';\nclass DualFilteringBlurrer\n{\n constructor(use_alpha_mask)\n {\n this.current_width = 1;\n this.current_height = 1;\n this.RT0 = new WebGLRenderTarget(1, 1);\n this.RT1 = new WebGLRenderTarget(1, 1);\n this.RT2 = new WebGLRenderTarget(1, 1);\n this.RT3 = new WebGLRenderTarget(1, 1);\n this.RT4 = new WebGLRenderTarget(1, 1);\n\n this.upscale_blur_mat = new DualFilteringBlurMaterial(true);\n this.downscale_blur_mat = new DualFilteringBlurMaterial(false);\n\n this.alpha_filter_mat = new AlphaFilterMaterial();\n }\n\n blur(RT)\n {\n this.check_RT_resize(RT.width, RT.height);\n Graphics.blit(RT, this.RT1, this.alpha_filter_mat);\n\n // Graphics.blit(this.RT0, this.RT1, this.downscale_blur_mat);\n Graphics.blit(this.RT1, this.RT2, this.downscale_blur_mat);\n Graphics.blit(this.RT2, this.RT3, this.downscale_blur_mat);\n Graphics.blit(this.RT3, this.RT4, this.downscale_blur_mat);\n\n // Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\n // Graphics.blit(this.RT3, this.RT4, this.upscale_blur_mat);\n Graphics.blit(this.RT4, this.RT3, this.upscale_blur_mat);\n Graphics.blit(this.RT3, this.RT2, this.upscale_blur_mat);\n Graphics.blit(this.RT2, RT, this.upscale_blur_mat);\n // Graphics.blit(this.RT1, RT, this.upscale_blur_mat);\n\n // return this.RT2;\n }\n\n check_RT_resize(width, height)\n {\n if (this.current_width !== width || this.current_height !== height)\n {\n this.current_width = width;\n this.current_height = height;\n this.RT0.setSize(this.current_width / 2, this.current_height / 2);\n this.RT1.setSize(this.current_width / 2, this.current_height / 2);\n this.RT2.setSize(this.current_width / 4, this.current_height / 4);\n this.RT3.setSize(this.current_width / 8, this.current_height / 8);\n this.RT4.setSize(this.current_width / 16, this.current_height / 16);\n }\n }\n}\n\nexport { DualFilteringBlurrer };\n","import { Graphics } from '../Graphics';\n\nimport { FloatType, HalfFloatType, NearestFilter, NoColorSpace, RGBAFormat, WebGLRenderTarget } from 'three';\nimport { Capabilities } from '../Capabilities';\n\nclass ParticleAttribute\n{\n constructor(attr_name, update_material)\n {\n this.read = undefined;\n this.write = undefined;\n\n this.name = attr_name;\n\n this.update_material = update_material;\n }\n\n init_from_geometry(geometry)\n {\n // overrided by inheritance\n }\n\n init_from_attribute(particle_attribute)\n {\n\n }\n\n build_RT(particle_count)\n {\n const resolution = ParticleAttribute.calculate_resolution(particle_count);\n const options = {\n minFilter: NearestFilter,\n magFilter: NearestFilter,\n format: RGBAFormat,\n colorScape: NoColorSpace,\n type: Capabilities.fp_textures_available ? FloatType : HalfFloatType,\n stencilBuffer: false,\n depthBuffer: false\n };\n\n return new WebGLRenderTarget(resolution.width, resolution.height, options);\n }\n\n static calculate_resolution(particle_count)\n {\n const width = Math.min(particle_count, 512);\n const height = Math.max(1, Math.ceil(particle_count / width));\n return { width, height };\n }\n\n swap_RT()\n {\n const tmp = this.read;\n this.read = this.write;\n this.write = tmp;\n }\n\n update(attribute_writter_scene)\n {\n if (this.update_material)\n {\n this.update_material.update();\n attribute_writter_scene.children[0].material = this.update_material;\n this.update_material.uniforms._MainTex.value = this.read.texture;\n Graphics.render(attribute_writter_scene, undefined, this.write);\n attribute_writter_scene.children[0].material = undefined;\n\n this.swap_RT();\n }\n }\n\n store_geometry_attribute_in_RT(attribute, RT, storage_material, attribute_writter_scene)\n {\n attribute_writter_scene.children[0].geometry.setAttribute('data', attribute);\n attribute_writter_scene.children[0].material = storage_material;\n\n Graphics.render(attribute_writter_scene, undefined, RT);\n\n attribute_writter_scene.children[0].geometry.deleteAttribute('data');\n attribute_writter_scene.children[0].material = undefined;\n }\n\n get_texture()\n {\n return this.read.texture;\n }\n}\n\nexport { ParticleAttribute };\n","import { Object3D } from 'three';\nimport { BufferAttribute } from 'three';\nimport { PlaneGeometry } from 'three';\nimport { Mesh } from 'three';\nimport { BufferGeometry } from 'three';\nimport { Scene } from 'three';\nimport { Points } from 'three';\nimport { InstancedBufferGeometry } from 'three';\nimport { InstancedBufferAttribute } from 'three';\nimport { ParticleAttribute } from './ParticleAttribute';\n\nclass GPUParticleSystem extends Object3D\n{\n constructor(particle_count, material)\n {\n super();\n this.attributes = [];\n\n this.mesh = this.build_point_mesh(particle_count, material);\n this.add(this.mesh);\n\n this.attribute_writter_mesh = this.build_attribute_writter_mesh(particle_count);\n this.attribute_writter_scene = new Scene();\n this.attribute_writter_scene.add(this.attribute_writter_mesh);\n }\n\n add_texture_attribute(buffer_attribute)\n {\n this.attributes.push(buffer_attribute);\n }\n\n add_update_attribute_array(name, array, item_size)\n {\n this.attribute_writter_mesh.geometry.setAttribute(name, new BufferAttribute(array, item_size, false));\n }\n\n add_attribute_array(name, array, item_size)\n {\n this.mesh.geometry.setAttribute(name, new InstancedBufferAttribute(array, item_size, false));\n }\n\n update()\n {\n this.mesh.material.update();\n for (let i = 0; i < this.attributes.length; i++)\n {\n this.attributes[i].update(this.attribute_writter_scene);\n }\n }\n\n dispose()\n {\n this.mesh.geometry.dispose();\n this.mesh.material.dispose();\n }\n\n build_point_mesh(instance_count = 1, material)\n {\n const geo = new PlaneGeometry();\n\n const instanced_geo = new InstancedBufferGeometry();\n instanced_geo.setAttribute('position', geo.getAttribute('position'));\n instanced_geo.index = geo.index;\n\n instanced_geo.setAttribute('storage_uv', this.build_uv_storage_attribute(instance_count));\n instanced_geo.instanceCount = instance_count;\n const mesh = new Mesh(instanced_geo, material);\n mesh.frustumCulled = false;\n return mesh;\n }\n\n build_attribute_writter_mesh(particle_count)\n {\n const { width, height } = ParticleAttribute.calculate_resolution(particle_count);\n\n const uvs = new Float32Array(particle_count * 3);\n\n for (let i = 0; i < particle_count; i++)\n {\n const x = i % width;\n const y = Math.floor(i / width);\n uvs[i * 3 + 0] = (x + 0.5) / width;\n uvs[i * 3 + 1] = (y + 0.5) / height;\n uvs[i * 3 + 2] = i;\n }\n const geo = new BufferGeometry();\n geo.setAttribute('position', new BufferAttribute(uvs, 3, false));\n\n const points = new Points(geo);\n points.frustumCulled = false;\n return points;\n }\n\n build_uv_storage_attribute(particle_count)\n {\n const { width, height } = ParticleAttribute.calculate_resolution(particle_count);\n\n const uvs = new Float32Array(particle_count * 2);\n\n for (let i = 0; i < particle_count; i++)\n {\n const x = i % width;\n const y = Math.floor(i / width);\n uvs[i * 2 + 0] = (x + 0.5) / width;\n uvs[i * 2 + 1] = (y + 0.5) / height;\n }\n return new InstancedBufferAttribute(uvs, 2, false);\n }\n}\n\nexport { GPUParticleSystem };\n","import frag from '../../shaders/gpu_particles/generic_storage.frag';\n\nimport { ShaderMaterial } from 'three';\nimport { NoBlending } from 'three';\nimport { AlwaysDepth } from 'three';\n\nclass ParticleStorageMaterial extends ShaderMaterial\n{\n constructor()\n {\n const vert = `\n varying vec4 value;\n attribute vec4 data;\n\n void main()\n {\n gl_Position = vec4(position.xy * 2.0 - 1.0, 1.0,1.0);\n gl_PointSize = 1.0;\n\n value = data;\n }\n `;\n super({\n uniforms: {\n\n },\n vertexShader: vert,\n fragmentShader: frag,\n depthWrite: false,\n blending: NoBlending,\n depthTest: false,\n depthFunc: AlwaysDepth\n });\n }\n}\n\nexport { ParticleStorageMaterial };\n","import { BufferAttribute } from 'three';\n\nimport { ParticleAttribute } from '../gpu_particles/ParticleAttribute';\nimport { ParticleStorageMaterial } from '../materials/gpu_particles/ParticleStorageMaterial';\n\nclass ParticlePositionAttribute extends ParticleAttribute\n{\n constructor(update_material)\n {\n super('_Position', update_material);\n }\n\n store_geometry(geometry, attribute_writter_scene)\n {\n const pos_attr = geometry.getAttribute('position');\n this.read = this.build_RT(pos_attr.count);\n this.write = this.build_RT(pos_attr.count);\n\n const mat = new ParticleStorageMaterial();\n this.store_geometry_attribute_in_RT(geometry.getAttribute('position'), this.read, mat, attribute_writter_scene);\n }\n\n store_positions(positions, attribute_writter_scene)\n {\n this.read = this.build_RT(positions.length);\n this.write = this.build_RT(positions.length);\n\n const arr = new Float32Array(positions.length * 4);\n\n for (let i = 0; i < positions.length; i++)\n {\n arr[i * 4 + 0] = positions[i].x;\n arr[i * 4 + 1] = positions[i].y;\n arr[i * 4 + 2] = positions[i].z;\n arr[i * 4 + 3] = (Math.random() * 2 - 1) * 10;\n }\n const mat = new ParticleStorageMaterial();\n this.store_geometry_attribute_in_RT(new BufferAttribute(arr, 4), this.read, mat, attribute_writter_scene);\n }\n}\n\nexport { ParticlePositionAttribute };\n","import { DataTexture } from 'three';\n\nclass CustomDataTexture extends DataTexture\n{\n constructor(data, width, height, format, type)\n {\n super(data, width, height, format, type);\n this.multiplier = 1;\n }\n\n set_rgba(index, r, g, b, a)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.data[index * 3 + 3] = a * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_rgb(index, r, g, b)\n {\n this.data[index * 3 + 0] = r * this.multiplier;\n this.data[index * 3 + 1] = g * this.multiplier;\n this.data[index * 3 + 2] = b * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_r(index, value)\n {\n this.data[index * 3 + 0] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_g(index, value)\n {\n this.data[index * 3 + 1] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_b(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n\n set_a(index, value)\n {\n this.data[index * 3 + 2] = value * this.multiplier;\n this.needsUpdate = true;\n }\n}\n\nexport { CustomDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { RGBFormat } from 'three';\n\nclass RGBDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Uint8Array(width * height * 3);\n super(data, width, height, RGBFormat);\n this.multiplier = 255;\n }\n}\n\nexport { RGBDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { RGBAFormat } from 'three';\n\nclass RGBADataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Uint8Array(width * height * 4);\n super(data, width, height, RGBAFormat);\n this.multiplier = 255;\n }\n}\n\nexport { RGBADataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBFormat } from 'three';\n\nclass RGBFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Float32Array(width * height * 3);\n super(data, width, height, RGBFormat, FloatType);\n }\n}\n\nexport { RGBFloatDataTexture };\n","import { CustomDataTexture } from './CustomDataTexture';\nimport { FloatType } from 'three';\nimport { RGBAFormat } from 'three';\n\nclass RGBAFloatDataTexture extends CustomDataTexture\n{\n constructor(width, height)\n {\n const data = new Float32Array(width * height * 4);\n super(data, width, height, RGBAFormat, FloatType);\n }\n}\n\nexport { RGBAFloatDataTexture };\n","import { Mesh } from 'three';\nimport { RGBDataTexture } from '../data_textures/RGBDataTexture';\nimport { RGBADataTexture } from '../data_textures/RGBADataTexture';\nimport { RGBFloatDataTexture } from '../data_textures/RGBFloatDataTexture';\nimport { RGBAFloatDataTexture } from '../data_textures/RGBAFloatDataTexture';\n\nclass BatchedMesh extends Mesh\n{\n constructor(id_table, geometry, material, max_texture_width)\n {\n super(geometry, material);\n\n this.id_table = id_table;\n this.batched_count = Object.keys(id_table).length;\n this.max_texture_width = max_texture_width;\n this.batch_width = this.batched_count % max_texture_width;\n this.batch_height = Math.ceil(this.batched_count / max_texture_width);\n }\n\n attach_rgb_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBADataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgb_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n attach_rgba_float_texture(uniform_name)\n {\n this.material.uniforms[uniform_name].value = new RGBAFloatDataTexture(this.batch_width, this.batch_height);\n }\n\n get_mesh_index(name)\n {\n return this.id_table[name];\n }\n\n set_rgb_value(uniform_name, mesh_name, r, g, b)\n {\n this.material.uniforms[uniform_name].set_rgb(this.get_mesh_index(mesh_name), r, g, b);\n }\n\n set_rgba_value(uniform_name, mesh_name, r, g, b, a)\n {\n this.material.uniforms[uniform_name].set_rgba(this.get_mesh_index(mesh_name), r, g, b, a);\n }\n}\n\nexport { BatchedMesh };\n","import { BatchedMesh } from './BatchedMesh';\n\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nimport { BufferAttribute } from 'three';\n\nclass MeshBatcher\n{\n batch(meshes, material)\n {\n const max_texture_width = 2048;\n // let texture_width = meshes.length % max_texture_width;\n // let texture_height = Math.ceil(meshes.length / max_texture_width);\n\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\n\n const geometries = [];\n const id_table = {};\n\n const attr_mesh_id = [];\n\n for (let i = 0; i < meshes.length; i++)\n {\n const mesh = meshes[i];\n const vertex_count = mesh.geometry.getAttribute('position').count;\n\n for (let count = 0; count < vertex_count; count++)\n {\n attr_mesh_id.push(i);\n }\n\n geometries.push(mesh.geometry);\n\n if (id_table[mesh.name] === undefined)\n {\n id_table[mesh.name] = i;\n }\n else\n {\n console.error('Mesh name is duplicated when trying to merge meshes. Non-unique id error.', mesh.name, id_table);\n }\n }\n\n const buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(geometries);\n\n const buffer_attribute = new BufferAttribute(new Float32Array(attr_mesh_id), 1);\n buffer_geometry.setAttribute('mesh_id', buffer_attribute);\n\n return this.create_batched_mesh(id_table, buffer_geometry, material, max_texture_width);\n }\n\n create_batched_mesh(id_table, buffer_geometry, material, max_texture_width)\n {\n return new BatchedMesh(id_table, buffer_geometry, material, max_texture_width);\n }\n}\n\nexport { MeshBatcher };\n","import { Audio as TAudio } from 'three';\nimport { PositionalAudio as TPositionalAudio } from 'three';\n\nclass AudioClip\n{\n constructor(buffer, loop = true, volume = 1, positional = false)\n {\n this.buffer = buffer;\n this.loop = loop;\n this.volume = volume;\n this.positional = positional;\n\n this.audio = undefined;\n }\n\n init(audio_listener)\n {\n if (this.positional)\n {\n this.audio = new TPositionalAudio(audio_listener);\n }\n else\n {\n this.audio = new TAudio(audio_listener);\n }\n\n this.audio.setBuffer(this.buffer);\n this.audio.setLoop(this.loop);\n\n // This prevents undesired volume at the beginning of playing\n this.audio.gain.gain.value = 0;\n\n this.audio.setVolume(this.loop ? 0 : this.volume);\n }\n\n play()\n {\n this.audio.play();\n }\n\n pause()\n {\n this.audio.pause();\n }\n\n stop()\n {\n this.audio.stop();\n }\n\n get is_playing()\n {\n return this.audio.isPlaying;\n }\n}\n\nexport { AudioClip };\n","import { AudioContext } from 'three';\r\n\r\nimport { AudioClip } from '../components/AudioClip';\r\nimport { AbstractLoader } from './AbstractLoader';\r\n\r\nclass AudioLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loop = true, volume = 0, size, positional = false)\r\n {\r\n super(resource_id, url, size);\r\n this.loop = loop;\r\n this.volume = volume;\r\n this.positional = positional;\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n // if (!window.user_interaction_for_audio)\r\n // {\r\n // setTimeout(this.on_preloaded_finished.bind(this, resource_container), 100);\r\n // }\r\n // else\r\n // {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.instantiate_audio(resource_container);\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n // }\r\n }\r\n\r\n instantiate_audio(resource_container)\r\n {\r\n const context = AudioContext.getContext();\r\n\r\n const buffer = context.createBuffer(2, 22050, 44100);\r\n\r\n fetch(this.url).then(r => r.blob()).then((response) =>\r\n {\r\n if (response.arrayBuffer)\r\n {\r\n response.arrayBuffer().then((array_buffer) =>\r\n {\r\n context.decodeAudioData(array_buffer, (audio_buffer) =>\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(audio_buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n });\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(\r\n this.resource_id,\r\n this.url,\r\n new AudioClip(buffer, this.loop, this.volume, this.positional)\r\n );\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport { AudioLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\n// import { sRGBEncoding } from 'three';\n\nclass BasisLoader extends AbstractLoader\n{\n constructor(resource_id, url, loader, size)\n {\n super(resource_id, url, size);\n\n this.loader = loader;\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (basis) =>\n {\n // basis.encoding = sRGBEncoding;\n\n resource_container.set_resource(this.resource_id, this.url, basis);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { BasisLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { CubeTextureLoader } from 'three';\r\n\r\nclass CubemapLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, extension, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new CubeTextureLoader();\r\n this.loader.setPath(url + '/');\r\n this.urls = [\r\n `px.${extension}`,\r\n `nx.${extension}`,\r\n `py.${extension}`,\r\n `ny.${extension}`,\r\n `pz.${extension}`,\r\n `nz.${extension}`\r\n ];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.urls, (image) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, image);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (error) =>\r\n {\r\n this.__set_error('Image could not be loaded. Maybe wrong name or path, I don\\'t know' + '¯\\\\_(ツ)_/¯', error);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { CubemapLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { ColladaLoader } from 'three/examples/jsm/loaders/ColladaLoader.js';\r\n\r\nclass DAELoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new ColladaLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { DAELoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FileLoader as TFileLoader } from 'three';\r\n\r\nclass FileLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (file) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, file);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { FileLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { FontLoader as TFontLoader } from 'three/examples/jsm/loaders/FontLoader.js';\n\nclass FontLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new TFontLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (font) =>\n {\n resource_container.set_resource(this.resource_id, this.url, font);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { FontLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { GLTFLoader as TGLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nclass GLTFLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TGLTFLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { GLTFLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nclass GLTFDRACOLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loader, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new GLTFLoader();\r\n\r\n this.loader.setDRACOLoader(loader);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { GLTFDRACOLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { HDRCubeTextureLoader as THDRCubeTextureLoader } from 'three/examples/jsm/loaders/HDRCubeTextureLoader.js';\r\nimport { UnsignedByteType } from 'three';\r\n\r\nclass HDRCubeTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THDRCubeTextureLoader();\r\n this.url_suffix = ['/px.hdr', '/nx.hdr', '/py.hdr', '/ny.hdr', '/pz.hdr', '/nz.hdr'];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.setPath(this.url)\r\n .setDataType(UnsignedByteType)\r\n .load(this.url_suffix, (hdr) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, hdr);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { HDRCubeTextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nclass JSONLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n }\n\n on_preloaded_finished(resource_container, response)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n response.json().then((json) =>\n {\n resource_container.set_resource(this.resource_id, this.url, json);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { JSONLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { OBJLoader as TOBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';\n\nclass OBJLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new TOBJLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (obj) =>\n {\n resource_container.set_resource(this.resource_id, this.url, obj);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { OBJLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { Vector3 } from 'three';\nimport { FileLoader } from 'three';\n\nclass PointArrayLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new FileLoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (text) =>\n {\n resource_container.set_resource(this.resource_id, this.url, this.parse_path(text));\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n\n parse_path(raw_data)\n {\n const string_array = raw_data.split('\\n');\n\n if (string_array[string_array.length - 1] === '')\n {\n string_array.pop();\n }\n\n const positions = [];\n\n for (let i = 0; i < string_array.length; i += 3)\n {\n const x = parseFloat(string_array[i + 0]);\n const y = parseFloat(string_array[i + 1]);\n const z = parseFloat(string_array[i + 2]);\n positions.push(new Vector3(x, y, z));\n }\n return positions;\n // let curve = new THREE.CatmullRomCurve3(positions);\n // return curve.getPoints(100);\n }\n}\n\nexport { PointArrayLoader };\n","import { AbstractLoader } from './AbstractLoader';\n\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';\n\nclass RGBETextureLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n this.loader = new RGBELoader();\n }\n\n on_preloaded_finished(resource_container)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n this.loader.load(this.url, (hdr) =>\n {\n resource_container.set_resource(this.resource_id, this.url, hdr);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n },\n (xhr) =>\n {\n // if (xhr)\n // {\n // let total = xhr.total || this.total_bytes;\n // this.__update_downloaded_bytes(xhr.loaded, total);\n // }\n },\n (msg) =>\n {\n this.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { RGBETextureLoader };\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { FileLoader as TFileLoader } from 'three';\r\n\r\nclass TextLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, gltf);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // this.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n this.__set_error(msg);\r\n this.__loading_ended();\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { TextLoader };\r\n","import { Browser } from '../Browser';\r\nimport { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { NoColorSpace, SRGBColorSpace, Texture } from 'three';\r\n\r\nclass AsyncTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size, flipY = true, premultiplyAlpha = false, colorSpaceConversion = true)\r\n {\r\n super(resource_id, url, size);\r\n\r\n this.colorSpaceConversion = colorSpaceConversion;\r\n this.premultiplyAlpha = premultiplyAlpha;\r\n this.flipY = flipY;\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n if (Browser.is_safari) // && Browser.version < 15\r\n {\r\n this.load_with_old_method(resource_container);\r\n }\r\n else\r\n {\r\n this.load_with_new_method(resource_container);\r\n }\r\n }\r\n\r\n load_with_old_method(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const texture = new Texture();\r\n const image = new Image();\r\n\r\n image.src = this.url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.flipY = this.flipY;\r\n texture.premultiplyAlpha = this.premultiplyAlpha;\r\n texture.colorSpace = this.colorSpaceConversion ? SRGBColorSpace : NoColorSpace;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('Error loading texture. Maybe the resource is not an image?', this.url, this.original_url);\r\n };\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n\r\n load_with_new_method(resource_container)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n const fetchOptions = {};\r\n fetchOptions.credentials = 'same-origin';\r\n // fetchOptions.headers = this.requestHeader;\r\n\r\n fetch(this.url, fetchOptions).then((res) =>\r\n {\r\n return res.blob();\r\n }).then((blob) =>\r\n {\r\n return createImageBitmap(blob, {\r\n colorSpaceConversion: this.colorSpaceConversion ? 'default' : 'none',\r\n imageOrientation: this.flipY ? 'flipY' : 'none',\r\n premultiplyAlpha: this.premultiplyAlpha ? 'premultiply' : 'none'\r\n });\r\n }).then((imageBitmap) =>\r\n {\r\n const texture = new Texture(imageBitmap);\r\n texture.flipY = this.flipY;\r\n texture.premultiplyAlpha = this.premultiplyAlpha;\r\n texture.colorSpace = this.colorSpaceConversion ? SRGBColorSpace : NoColorSpace;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }).catch(function(e)\r\n {\r\n console.error(e);\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { AsyncTextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\r\n\r\nimport { Texture } from 'three';\r\n\r\nclass TextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n }\r\n\r\n on_preloaded_finished(resource_container, response)\r\n {\r\n if (resource_container.resources_by_url[this.url] === undefined)\r\n {\r\n response.blob().then((blob) =>\r\n {\r\n const texture = new Texture();\r\n\r\n const url = URL.createObjectURL(blob);\r\n\r\n const image = new Image();\r\n image.src = url;\r\n\r\n image.onload = () =>\r\n {\r\n texture.image = image;\r\n texture.needsUpdate = true;\r\n\r\n resource_container.set_resource(this.resource_id, this.url, texture);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n };\r\n\r\n image.onerror = () =>\r\n {\r\n console.error('Error loading texture. Maybe the resource is not an image?', this.url);\r\n };\r\n });\r\n }\r\n else\r\n {\r\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\r\n\r\n this.__update_downloaded_bytes(1, 1);\r\n this.__loading_ended();\r\n }\r\n }\r\n}\r\n\r\nexport { TextureLoader };\r\n","import { AbstractLoader } from './AbstractLoader';\n\nclass VideoLoader extends AbstractLoader\n{\n constructor(resource_id, url, size)\n {\n super(resource_id, url, size);\n }\n\n on_preloaded_finished(resource_container, response)\n {\n if (resource_container.resources_by_url[this.url] === undefined)\n {\n response.blob().then((blob) =>\n {\n resource_container.set_resource(this.resource_id, this.url, URL.createObjectURL(blob));\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n });\n }\n else\n {\n resource_container.set_resource(this.resource_id, this.url, resource_container.resources_by_url[this.url]);\n\n this.__update_downloaded_bytes(1, 1);\n this.__loading_ended();\n }\n }\n}\n\nexport { VideoLoader };\n","import { ResourceContainer } from '../ResourceContainer';\r\n\r\nclass ResourceBatch\r\n{\r\n constructor(batch_name)\r\n {\r\n this.resource_loaders = [];\r\n this.batch_name = batch_name || 'unnamed batch';\r\n }\r\n\r\n add_loader(loader)\r\n {\r\n this.resource_loaders.push(loader);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n this.resource_loaders[i].load(resource_container || ResourceContainer);\r\n }\r\n }\r\n\r\n get loading_finished()\r\n {\r\n let finished = true;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n finished = finished && this.resource_loaders[i].has_finished;\r\n }\r\n return finished;\r\n }\r\n\r\n get has_errors()\r\n {\r\n let has_error = false;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n has_error = has_error || this.resource_loaders[i].has_error;\r\n }\r\n return has_error;\r\n }\r\n\r\n print_errors()\r\n {\r\n console.error('Batch <' + this.batch_name + '> could not load successfully');\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n if (this.resource_loaders[i].has_error)\r\n {\r\n this.resource_loaders[i].print_error();\r\n }\r\n }\r\n }\r\n\r\n get_progress()\r\n {\r\n return this.get_loaded_bytes() / this.get_total_bytes();\r\n }\r\n\r\n get_loaded_bytes()\r\n {\r\n let loaded_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n loaded_bytes += this.resource_loaders[i].loaded_bytes;\r\n }\r\n\r\n return loaded_bytes;\r\n }\r\n\r\n get_total_bytes()\r\n {\r\n let total_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n total_bytes += this.resource_loaders[i].total_bytes;\r\n }\r\n\r\n return total_bytes;\r\n }\r\n}\r\n\r\nexport { ResourceBatch };\r\n"],"names":["browser","init","this","browser_name","agent","window","navigator","userAgent","toLowerCase","has_web_xr_support","is_vr","xr","isSessionSupported","indexOf","opr","chrome","version","get_version","name","is_safari","is_chrome","is_edge","is_edge_chromium","has_webm","is_firefox","has_hvec","preferred_video_extension","ua","tem","M","match","test","exec","slice","join","replace","appName","appVersion","splice","Number","split","Validation","constructor","is_int","n","is_float","is_number","is_json","str","JSON","parse","e","AbstractLoader","resource_id","url","size","loaded_bytes","total_bytes","has_finished","has_error","error_message","__update_downloaded_bytes","loaded","total","console","warn","__loading_ended","__set_error","message","print_error","error","load","resource_container","undefined","resources_by_url","cache","Browser","fetch","method","mode","credentials","redirect","then","on_progress","bind","catch","__on_error","set_resource","response","response_clone","clone","reader","body","getReader","contentLength","headers","get","receivedLength","done","value","read","length","on_preloaded_finished","data","OMath","linear_map","from_range_start_value","from_range_end_value","to_range_start_value","to_range_end_value","between","min","max","mod","number","divisor","rgb_to_hex","rgb","r","Math","round","toString","g","b","project_points_on_plane","points","plane","projected_point","Vector3","points_on_plane","i","projectPoint","push","matrix4_lerp","from","to","target","t","elements","lerp","equals","x1","x2","abs","x","y","clamp","euclideanModulo","m","pingpong","degToRad","degrees","PI","radToDeg","radians","deg_to_rad","rad_to_deg","perspective_divide","v","w","z","points_average","center","add","multiplyScalar","get_random_color","arr","col","floor","random","saturate","ActionSequencer","context","previous_elapsed_time","elapsed_time","playback_speed","__get_playback_speed","playing","action_events","initial_context","stringify","tmp_t","channels","channel_names","Object","keys","duration","play","stop","reset","skip","get_duration","__play_clips","update","delta_time","set_progress","time","set_normalized_progress","get_progress","is_finished","add_action_event","trigger_time","action","add_action_interpolator","interpolator","use_dynamic_from_value","keyframes","attribute_name","keyframe","get_current_target_value","__get_current_keyframe","evaluate","get_current_starting_value","get_current_progress","__linear_map_01","easing_function","__play_events","evaluate_keyframe","log","trigger","get_keyframes","channel_name","is_channel_redefined","initial","current","Infinity","distance","transitions_velocity","URLSearchParams","location","search","EasingFunctions","linear","triangular","ease_in_sine","cos","ease_out_sine","sin","ease_in_out_sine","ease_in_cubic","ease_out_cubic","pow","ease_in_out_cubic","ease_in_quad","ease_out_quad","ease_in_out_quad","ease_in_quart","ease_out_quart","ease_in_out_quart","ease_in_quint","ease_out_quint","ease_in_out_quint","ease_in_expo","ease_out_expo","ease_in_out_expo","ease_in_circ","sqrt","ease_out_circ","ease_in_out_circ","ease_in_back","ease_out_back","ease_in_out_back","ease_in_elastic","c4","ease_out_elastic","ease_in_out_elastic","ease_in_bounce","ease_out_bounce","n1","d1","ease_in_out_bounce","heartbeat","sign","ActionInterpolator","NumberInterpolator","super","view_context","app","set_app","ActionEvent","args","ViewContext","DrawIOAnimationSheet","xml_document","animation_nodes","DOMParser","parseFromString","querySelectorAll","animation_tracks","triggers","node","parent_node","parentElement","getAttribute","get_node_x_position","parseFloat","includes","split_data","trigger_name","trigger_method","at_time","value_data","to_value","from_time","to_time","sort","a","x_pos","ActionSequencerBuilder","default_state_data","from_animation_sheet","animation_data","current_context","tracks","initial_tracks","state_to_tracks","get_longest_time","find","element","sequencer","action_event","state","longest_time","from_draw_io","xml","transition_data","track_time","event_manager","queue","zoom_changed_evt","store_clickd_evt","point_selected_evt","config_changed","path_substep_completed","path_completed","go_to_store_requested_evt","resource_loaded_evt","service_clicked_evt","unit_pos_updated_evt","floor_changed_evt","on_enter_floor_navigation","on_exit_floor_navigation","on_enter_floor_selection","on_exit_floor_selection","on_enter_outside_navigation","on_exit_outside_navigation","step_selected_evt","fire","event","payload","on","callback","fire_zoom_changed","zoom","fire_store_selected","store_id","fire_point_selected","hit_data","fire_config_changed","fire_path_substep_completed","step_number","fire_path_completed","fire_step_selected","step_index","fire_go_to_store_requested","fire_resource_loaded","resource","fire_service_clicked","service","fire_unit_position_updated","unit_data","fire_floor_switched","floor_id","fire_on_enter_floor_navigation","fire_on_exit_floor_navigation","fire_on_enter_floor_selection","fire_on_exit_floor_selection","fire_on_enter_outside_navigation","fire_on_exit_outside_navigation","resources","EventManager","get_resource","HTMLUtilities","load_images","container","images","image","dataset","src","image_objects","image_object","load_videos","videos","video","load_iframes","iframes","iframe","load_elements","selector","TransitionTable","transitions","from_state_name","to_state_name","add_transitions","set_transitions","set_default_state_data","__delta_buffer","___time","Clock","__delta_time","__smooth_delta_time","__elapsed_time","__allocated_time","Vector2","__frame_interpolation_t","fixed_delta_time","smooth_delta_time","shader_time","frame_interpolation","fdt","dt","sdt","__set_frame_interpolation","__update","getDelta","getElapsedTime","shift","__calculate_smooth_delta_time","ViewState","start","show","hide","before_enter","on_enter","before_update","fixed_update","update_enter_transition","global_view_data","transition_progress","action_sequencer","update_transition","update_exit_transition","before_exit","on_exit","ViewStateTransitionHandler","transition_table","last_state","current_state","current_state_data","transitioning","go_to_state","__exit_last_state","__update_transitions","set_state","assign","Time","view_manager","views","transition_handler","view_change_subscribers","browser_title_suffix","__set_views_opacities","go_to_view","view_name","change_url","__change_browser_url","__change_browser_title","notify_view_change","go_to_scene","scene_name","next_view","transition_view","set_next_view","subscribe_to_view_change","subscriber","on_view_change","register_view","view","has_view","set_view","set_browser_title_suffix","title_suffix","get_current_view","get_view_by_name","get_view_by_url","get_by_url","history","pushState","title","__capitalize","document","set_opacity","string","aux_string","toUpperCase","__snake_to_whitespace","group","ApplicationView","ResourceContainer","ViewManager","classList","remove","load_html_images","load_html_videos","style","opacity","BaseApplication","on_post_start","on_post_render","on_pre_render","on_frame_end","BaseRender","render","renderer","resize","dispose","BaseShaderMaterial","ShaderMaterial","vert","frag","uniforms","vertexShader","basic_vert","fragmentShader","basic_frag","_Color","Color","BlitMaterial","frag_shader","vert_shader","defines","_MainTex","_Resolution","_TargetResolution","depthWrite","blending","NoBlending","depthTest","depthFunc","AlwaysDepth","AddMaterial","nMips","_SecondTex","set_add_texture","tex","UnrealBloomComposeMaterial","NUM_MIPS","_BlurredTex","_BloomStrength","blurTexture1","blurTexture2","blurTexture3","blurTexture4","blurTexture5","bloomStrength","bloomFactors","bloomRadius","bloomTintColors","set_RT_0","rt","set_RT_1","set_RT_2","set_RT_3","set_RT_4","set_bloom_strength","set_bloom_radius","set_tint_color_0","col_string","set","set_tint_color_1","set_tint_color_2","set_tint_color_3","set_tint_color_4","camera_manager","_current","_spectator","camera","spectator","capabilities","max_anisotropy","vertex_texture_sampler_available","fp_textures_available","CanvasDrawer","uses_dynamic_font","__textHeight","canvas","createElement","ctx","getContext","getFontHeight","fontStyle","getElementsByTagName","dummy","dummyText","createTextNode","appendChild","setAttribute","offsetHeight","removeChild","get_text_size","text","font","ceil","measureText","width","draw_canvas","ctxOptions","font_color","__draw","draw_on_texture","canvas_texture","CanvasTexture","UVMapping","ClampToEdgeWrapping","NearestFilter","generateMipMaps","needsUpdate","roundRect","height","radius","fill","stroke","tl","tr","br","bl","defaultRadius","side","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","configuration","parameters","dpr","from_json","json","Idle","is_animating","Animating","easing_function_t","animator","set_property_value","set_current_state","finished_callback","CSSAnimator","css_property","value_prefix","value_suffix","animate","AxisHelper","Object3D","scale","blue_points","blue_axis_mat","LineBasicMaterial","color","blue_axis_geo","BufferGeometry","setFromPoints","blue_axis_line","Line","renderOrder","green_points","green_axis_mat","green_axis_geo","green_axis_line","red_points","red_axis_mat","red_axis_geo","red_axis_line","scene_manager","Scene","add_scene","scene","traverse","child","geometry","material","children","Cube","Mesh","segments","BoxGeometry","MeshBasicMaterial","Sphere","SphereBufferGeometry","Arrow","dir","cylinder_height","cylinder_geo","CylinderBufferGeometry","translate","cone_geometry","ConeBufferGeometry","cone_height","buffer_geometry","BufferGeometryUtils","mergeBufferGeometries","rotateX","quaternion","setFromUnitVectors","_dir","oscreen","position","render_width","render_height","width_height","pixel_size","update_position","size_changed","update_size","apply_pixel_density_v2","vector2","apply_pixel_density","get_pixel_size","aspect_ratio","portrait","ScreenSpaceTextureMaterial","h","_ScreenSpacePosition","_ScreenSize","_TextureSize","set_position","set_texture","set_screen_size","PerspectiveCamera","TPerspectiveCamera","fov","aspect","near","far","clear_color","clear_alpha","copy","debug","Vector3_one","Vector3_zero","canvas_renderer","display_texture_meshes","OScreen","draw_arrow","origin","arrow","normalize","draw_axis","axis","set_debug_RT","RT","rt_debug","draw_rectangle","position_2d","fillStyle","fillRect","clear","clearRect","draw_line_2D","strokeStyle","draw_line","line","frustumCulled","draw_cube","pos","cube","draw_oriented_cube","depth","distanceTo","sub","forward_dir","draw_plane","PlaneGeometry","Vector4","basic_color_vert","basic_color_frag","transparent","draw_empty_cube","box","Box3","setFromCenterAndSize","helper","Box3Helper","draw_sphere","sphere","draw_point_array","input_points","open","catmull","CatmullRomCurve3","updateArcLengths","getSpacedPoints","draw_sphere_helper","SphereGeometry","sphere_mesh","SceneManager","draw_math_sphere","sphere1","draw_bounding_box","bb","draw_curve","curve","options","offset","draw_texture","mesh","graphics","CameraManager","Blitter","_blit_scene","_blit_material","_blit_quad","_blit_camera","OrthographicCamera","blit","dst","src_texture","isWebGLRenderTarget","texture","src_width","src_height","getSize","__render","material_pass","mat","blit_with_material","blit_clear_with_material","dst_RT","current_rt","getRenderTarget","setRenderTarget","ClearDepthNormalMaterial","clear_depth","clear_normal","_DepthNormal","DepthNormalMaterial","_FarPlane","far_plane","DepthAndNormalsRenderer","WebGLRenderTarget","clear_depth_normal_mat","depth_normal_material","__resize_RT_if_necessary","setSize","render_target","core_attributes","context_attributes","threejs_attributes","_renderer","blitter","no_render","current_render_mode","generateDepthNormalTexture","depth_and_normals_renderer","is_webgl2","canvas_context","force_webgl2","xr_enabled","alpha","antialias","desynchronized","failIfMajorPerformanceCaveat","powerPreference","premultipliedAlpha","preserveDrawingBuffer","stencil","logarithmicDepthBuffer","WebGLRenderer","enabled","autoClear","setPixelRatio","Configuration","extensions","domElement","Capabilities","getMaxAnisotropy","maxVertexTextures","is_floating_point_texture_available","resize_observer","ResizeObserver","on_resize","observe","dom_element","depth_normals_RT","new_state","__update_current_camera","updateProjectionMatrix","updateMatrix","updateMatrixWorld","override_mat","__apply_override_material","render_scene","overrideMaterial","readback_RT","buffer","readRenderTargetPixels","clear_stencil","setClearColor","entries","entry","contentRect","setViewport","src_RT","take_screenshot","blob_callback","old_width","old_height","new_width","new_height","tile_width","tile_height","divisions_x","parseInt","divisions_y","old_dpr","getPixelRatio","ctx_2D","setViewOffset","drawImage","toBlob","clearViewOffset","download_screenshot","blob","link","download","href","URL","createObjectURL","click","onclick","requestAnimationFrame","revokeObjectURL","removeAttribute","minFilter","magFilter","format","RGBAFormat","colorSpace","NoColorSpace","type","FloatType","stencilBuffer","depthBuffer","output","Float32Array","NormalMaterial","DebugNormalsRender","Graphics","KeyboardInput","ctrlz_pressed","ctrlz_fired","keys_keys","addEventListener","on_key_down","on_key_up","keyCode","ctrlKey","code","press_key","release_key","pressed","released","key_name","key","fired","down","release_keys","is_key_pressed","is_key_down","is_key_released","register_key","unregister_key","removeEventListener","os","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","is_mobile","is_ipad","maxTouchPoints","is_ios","is_android","get_os","is_linux","is_mac","is_windows","platform","reflection_plane_context","target_geometry","target_position","set_target_geometry","GeometryBatch","batch_width","data_textures","object_names","zero_offset","write_offset","uniform_dirty_count","tmp_uploaded_data_count","add_global_uniform","set_global_uniform","add_object_uniform_v3","uniform_name","default_value_v3","src_tex","__create_rgb_texture","dst_tex","one_pixel_tex","new_data_tex","__add_data_texture","__flood_data_texture_rgb","add_object_uniform_v4","default_value_v4","__create_rgba_texture","__flood_data_texture_rgba","add_object_uniform_v4_float","__create_rgba_float_texture","set_object_uniform_v3","object_name","vector3","use_r","use_g","use_b","obj_index","__get_object_index","data_texture","__get_data_texture","__set_pixel_rgb","one_pixel","last_accessed_index","dirty_count","set_object_uniform_v4","vector4","use_a","__set_pixel_rgba","upload_texture_data","upload_budget","__partial_texture_data_upload","__full_texture_data_upload","get_uniform_dirty_count","texture_data","copyTextureToTexture","index","get_mesh","v3","v4","Uint8Array","DataTexture","RGBFormat","dst_texture","one_pixel_text","geometry_batcher","batches","batch","buffer_geometries","attr_accessor_uvs","texture_width","ceilPowerOfTwo","__init_uv_array","uv_index","vertex_count","count","buffer_attribute","BufferAttribute","uvs","ui","input","ui_elements","_tmp_normalized_pos","ss_scene","matrixWorldAutoUpdate","ws_scene","ss_camera","delete_element","elem","add_screen_space_element","set_screen_space_coordinate_system","add_world_space_element","set_world_space_coordinate_system","NDC","update_state","current_clicked_element","PerspectiveFrustumPointFitter","fit_points","camera_quaternion","vertical_fov","v_fov","h_fov","atan","tan","up_plane_normal","get_up_plane_normal","down_plane_normal","get_down_plane_normal","left_plane_normal","get_left_plane_normal","right_plane_normal","get_right_plane_normal","camera_forward_dir","applyQuaternion","sphere_center","pull_back_distance","get_distance_to_fit_rect","far_pos","up_plane","Plane","setFromNormalAndCoplanarPoint","down_plane","left_plane","right_plane","apply_center_correction_to_pos","closest_distance","inverse_dir","Line3","up_line_intersection","down_line_intersection","left_line_intersection","right_line_intersection","intersectLine","new_up_distance","new_down_distance","new_left_distance","new_right_distance","vertical_min","horizontal_min","forward_correction","target_pos","vertical_offset","get_vertical_correction","horizontal_offset","get_horizontal_correction","closest_distance_to_up_plane","closest_distance_to_down_plane","up_dir","down_line","up_line","down_dist","up_dist","correction","closest_distance_to_right_plane","closest_distance_to_left_plane","right_dir","left_line","right_line","left_dist","right_dist","Quaternion","setFromAxisAngle","distV","distH","OrthographicFrustumPointFitter","inverse_camera_quat","inverse","inverted_points","getCenter","distance_to_center","camera_utilities","tmp_mat","Matrix4","ray","Ray","tmp_size","tmp_unproj","get_up_dir","tmp_vec","get_forward_dir","get_right_dir","unproject_mouse_position","get_plane_intersection","plane_position","plane_normal","isPerspectiveCamera","unproject","intersectPlane","fit_points_on_camera","zoom_scale","world_space_center","camera_forward","projected_points_center","up","right","cross","inverse_mat","getInverse","applyMatrix4","projected_center","get_zoom_to_fit_rect","get_zoom_to_fit_box","isOrthographicCamera","obj_x","obj_y","object_aspect","get_html_screen_pos","object","getWorldPosition","project","world_pos_to_screen","update_projection","left","top","bottom","fit_bounding_box_points","p1","p2","p3","p4","p5","p6","p7","p8","camera_backward_dir","fitter","camera_pos","reference_position_plane","camera_ray","reference_position","camera_position","result","reference_rotation","reference_zoom","forward","initializer","CameraUtilities","GeometryBatcher","OS","ReflectionPlaneContext","UI","Debug","render_loop","SSAOMaterial","_InverseProjMatrix","_ProjectionMatrix","_Bias","_Radius","_SampleKernel","__get_sample_kernel","_RandomRotation","__get_rotation_kernel","sample_kernel","rotation_kernel","rotation_texture","wrapS","RepeatWrapping","wrapT","SSAOComposeMaterial","_AO","DisplayNormalTextureMaterial","depth_normals_vert","BoxBlurMaterial","_SampleDir","Blurrer","RT1","RT2","box_blur_mat","blur","NormalAORender","ssao_mat","ssao_compose_mat","debug_normals","ssaa","use_ssaa","main_RT","SSAO_RT","blurrer","__check_RT_size","__update_uniforms","projectionMatrix","NormalRender","VRRender","render_spectator_camera","spectator_camera","isPresenting","xrCam","getCamera","currentRenderTarget","GaussianBlurMaterial","kernel_radius","KERNEL_RADIUS","SIGMA","texSize","direction","set_size","set_direction","LuminosityHighPassMaterial","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","GaussianBlurrer","current_width","current_height","separableBlurMaterials","renderTargetsHorizontal","renderTargetsVertical","kernelSizeArray","rt_pars","LinearFilter","renderTargetBright","generateMipmaps","init_materials","init_RT","luminosity_high_pass_mat","use_luminosity_high_pass","resize_RT","inputRenderTarget","get_blurred_texture","get_blurred_RT","dispose_RT","hor","ver","texture_height","dispose_materials","UnrealBloomRender","bloom_compose_mat","blur_RT","add_mat","val","TOrthographicCamera","view_component_manager","components","enabled_components","Set","__set_components_opacities","component","register_component","enable_component","disable_component","delete","get_component_by_name","component_name","RenderLoop","target_application","is_running","frames_passed","time_accumulator","ViewComponentManager","setAnimationLoop","screen","SimpleTextDrawer","text_margin","text_size","globalAlpha","textBaseline","textAlign","fillText","ViewComponent","hidden","toggle_hidden","HorizontalPlane","VerticalPlane","ArrayUtilities","merge_from_to","source","apply","expand_vec3_array","array","items_left_count","remove_elem","get_closest_point","closest_point","object_values_to_array","obj","ids","FrustumPointFitter","get_hozirontal_correction","closest_up_point","closest_down_point","closest_right_point","closest_left_point","GeometryUtilities","convert_to_non_indexed_geometry","geometry_buffer","indices","positions","vertices","getX","getY","getZ","add_barycentric_attribute","non_indexed_geometry_buffer","bar_coordinates","ImageUtilities","get_image_data","getImageData","get_pixel","imagedata","mesh_sampler","sample","sample_count","face_areas","min_area","normals","tangents","faces","index_0","index_1","index_2","v1","v2","face","c","n2","n3","normal","tangent","uv_a","uv_b","uv_c","area","get_face_area","normalized_faces_array","get_uniform_face_distribution","selected_faces","select_random_faces","sample_data_from_faces","sampled_points","sampled_normals","sampled_tangents","sampled_uvs","w1","w2","sample_point_in_face","amount","selected_face","minimum_area","extended_triangle_indices","repetitions_needed","j","vec1","vec2","w3","model_utilities","result_callback","fromGeometry","get_geometries","geometries","assign_material","clone_animated_gltf","gltf","animations","skinnedMeshes","isSkinnedMesh","cloneBones","cloneSkinnedMeshes","isBone","skeleton","cloneSkinnedMesh","orderedCloneBones","bones","cloneBone","Skeleton","boneInverses","matrixWorld","set_shadow_config","cast","receive","castShadow","receiveShadow","__find_object","get_object","get_object_by_type","object_type","ObjectUtilities","is_object","item","Array","isArray","merge_deep","sources","xml_to_json","nodeType","attributes","attribute","nodeName","nodeValue","hasChildNodes","childNodes","old","StringUtilities","hexValues","hex","capitalize","words","substr","capitalize_first_letter","charAt","snake_to_camelcase","TimeUtilities","time_str_to_ms","time_str","hours","minutes","seconds","Grid","derivatives","plane_geometry","rotation","_Thickness","_Length","_ElapsedTime","setup","next_position","previous_position","orientation","coverage","accumulated_length","next_point","__get_next_position","previous_point","__get_previous_position","vertexList","nextPositionList","previousPositionList","orientationList","coverageList","setIndex","_length","thickness","total_length","parent","copy_color","WorldImage","pivot","_ScreenAligned","_Scale","_Opacity","DoubleSide","current_scale","computeBoundingBox","tmp_bb_size","boundingBox","update_texture","img","screen_aligned","boolean","Text2D","is_static","simple_text_drawer","draw_settings","LinearMipMapLinearFilter","UIElementMaterial","intensity","_PixelOffset","_NDC","_PivotPoint","_DepthOffset","ScreenSpacePosition","get_pos_NDC","WorldSpacePosition","tmp_vec3","tmp_vec2","UIElementState","ui_element","normalized_mouse_position","OnIdle","is_mouse_over","_on_enter_state","OnMouseEnter","on_mouse_enter","_on_hover_state","_on_exit_state","OnMouseExit","on_mouse_exit","_on_idle_state","OnMouseHover","__trigger_on_hover","on_mouse_hover","UIElement","is_clickable","position_strategy","_position","on_hover","mouse_pos_tmp","cached_NDC_position","screen_pos_tmp","texture_size","matrixAutoUpdate","pixel_offset","set_render_order","pivot_point","set_pixel_offset","use_depth","depth_offset","clear_state","visible","get_size","normalized_mouse_pos","to_screen_position","rect","Box2","containsPoint","projected_pos","get_screen_space_position","set_screen_space_position","screen_pos","UpdatableMaterialMesh","self","onBeforeRender","TextGlyph","plane_bounds","atlas_bounds","SDFText","glyph_layout","glyphs","glyph_is_dirty","matrix_is_dirty","color_is_dirty","matrix","__opacity","__text","__generate_glyphs","update_matrix","compose","clear_glyph_dirty","clear_color_dirty","set_rotation","tilt","new_orientation","new_tilt","multiply","set_color","set_pivot","update_glyphs","op","cursor","unicode","charCodeAt","glyph","planeBounds","text_glyph","atlasBounds","advance","box2","first_glyph","union","box2_size","SDFTextMaterial","_Texture","_Boldness","_AtlasSize","set_atlas_size","set_boldness","SDFTextBatch","font_layout","atlas_texture","instanced_geometry","InstancedBufferGeometry","instanceCount","Float32BufferAttribute","transformsCol0","InstancedBufferAttribute","max_allocations","transformsCol1","transformsCol2","transformsCol3","glyph_bounds","usage","DynamicDrawUsage","text_elements","atlas","add_text","text_str","remove_text","text_elem","force_update","glyph_bounds_atr","plane_bounds_atr","color_atr","matrix_needs_update","glyph_needs_update","color_needs_update","glyph_count","glyph_i","buffer_i","setXYZW","VectorInterpolator","tmp","MedianFilterMaterial","kernel3x3","_SourceTex","_SourceTexSize","isVideoTexture","videoWidth","videoHeight","isTexture","MedianFilter","median_filter_mat","filter","tex_size","DualFilteringBlurMaterial","upsample","AlphaFilterMaterial","use_alpha_mask","_Offset","DualFilteringBlurrer","RT0","RT3","RT4","upscale_blur_mat","downscale_blur_mat","alpha_filter_mat","check_RT_resize","ParticleAttribute","attr_name","update_material","write","init_from_geometry","init_from_attribute","particle_attribute","build_RT","particle_count","resolution","calculate_resolution","colorScape","HalfFloatType","swap_RT","attribute_writter_scene","store_geometry_attribute_in_RT","storage_material","deleteAttribute","get_texture","GPUParticleSystem","build_point_mesh","attribute_writter_mesh","build_attribute_writter_mesh","add_texture_attribute","add_update_attribute_array","item_size","add_attribute_array","instance_count","geo","instanced_geo","build_uv_storage_attribute","Points","ParticleStorageMaterial","ParticlePositionAttribute","store_geometry","pos_attr","store_positions","CustomDataTexture","multiplier","set_rgba","set_rgb","set_r","set_g","set_b","set_a","RGBDataTexture","RGBADataTexture","RGBFloatDataTexture","RGBAFloatDataTexture","BatchedMesh","id_table","max_texture_width","batched_count","batch_height","attach_rgb_texture","attach_rgba_texture","attach_rgb_float_texture","attach_rgba_float_texture","get_mesh_index","set_rgb_value","mesh_name","set_rgba_value","MeshBatcher","meshes","attr_mesh_id","create_batched_mesh","AudioClip","loop","volume","positional","audio","audio_listener","TPositionalAudio","TAudio","setBuffer","setLoop","gain","setVolume","pause","is_playing","isPlaying","AudioLoader","instantiate_audio","AudioContext","createBuffer","arrayBuffer","array_buffer","decodeAudioData","audio_buffer","BasisLoader","loader","basis","xhr","msg","CubemapLoader","extension","CubeTextureLoader","setPath","urls","DAELoader","ColladaLoader","FileLoader","TFileLoader","file","FontLoader","TFontLoader","GLTFLoader","TGLTFLoader","GLTFDRACOLoader","setDRACOLoader","HDRCubeTextureLoader","THDRCubeTextureLoader","url_suffix","setDataType","UnsignedByteType","hdr","JSONLoader","OBJLoader","TOBJLoader","PointArrayLoader","parse_path","raw_data","string_array","pop","RGBETextureLoader","RGBELoader","TextLoader","AsyncTextureLoader","flipY","premultiplyAlpha","colorSpaceConversion","load_with_old_method","load_with_new_method","Texture","Image","onload","SRGBColorSpace","onerror","original_url","fetchOptions","res","createImageBitmap","imageOrientation","imageBitmap","TextureLoader","VideoLoader","ResourceBatch","batch_name","resource_loaders","add_loader","loading_finished","finished","has_errors","print_errors","get_loaded_bytes","get_total_bytes"],"mappings":"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"}